From ebf0f1a72ecf2cae9608fd184da569c0b2f0bd5c Mon Sep 17 00:00:00 2001 From: Markus Hoelzle <typo3@markus-hoelzle.de> Date: Fri, 8 Sep 2017 12:01:53 +0200 Subject: [PATCH] [!!!][FEATURE] Move extension configuration to install tool With #82254 LocalConfiguration serialized array EXT/extConf has been changed to a not serialized array in EXTENSIONS. This patch follows up on this task an finishes various tasks: * An install tool silent upgrader upmerges given EXT/extConf settings to EXTENSIONS array. The resulting EXTENSIONS array does not contain dots for sub paths in its array key anymore and is accessible with a new ExtensionConfiguration->get() API to fetch values and whole extension config. * A new API is introduced to get() and set() extension specific configuration, is documented and used throughout the core to not unserialize old EXT/extConf anymore. Setting values updates legacy EXT/extConf to new values including compatible 'dot' ending on nested array configurations. * If extensions come with new configuration items in ext_conf_template.txt a silent upgrader of the install tool synchronizes these to the EXTENSIONS and old extConf array. Extension authors can rely on that and always fetch new keys from the new ExtensionConfiguration->get() API right away. The synchronization is also triggered when new extensions are loaded or extensions are updated via the extension manager. * Core usages are adapted to the new API. * Next to the main get() / set() API, the extension configuration form is extracted from the extension manager and put into the install tool as a new card in "Settings". The code below is streamlined and encapsulated with just a couple of public methods in class 'ExtensionConfigurationService' as internal class for use in install tool and extension manager. Resolves: #82368 Related: #82254 Releases: master Change-Id: I88568fa355f8f6fd5acc9850dcdd718fdd9a1b2e Reviewed-on: https://review.typo3.org/54034 Tested-by: TYPO3com <no-reply@typo3.com> Reviewed-by: Daniel Gorges <daniel.gorges@b13.de> Tested-by: Daniel Gorges <daniel.gorges@b13.de> Reviewed-by: Andreas Fernandez <typo3@scripting-base.de> Reviewed-by: Benni Mack <benni@typo3.org> Tested-by: Benni Mack <benni@typo3.org> --- Build/Resources/Public/Sass/install.scss | 2 + .../Classes/Controller/BackendController.php | 3 +- .../Classes/Controller/LoginController.php | 3 +- .../Classes/Template/DocumentTemplate.php | 8 +- ...urationExtensionNotConfiguredException.php | 27 ++ ...ConfigurationPathDoesNotExistException.php | 27 ++ .../Configuration/ExtensionConfiguration.php | 208 +++++++++ .../Configuration/DefaultConfiguration.php | 35 +- .../Configuration/FactoryConfiguration.php | 57 ++- ...fterExtensionConfigurationWriteRemoved.rst | 36 ++ ...recateGLOBALSTYPO3_CONF_VARSEXTextConf.rst | 21 +- ...toreExtensionConfigurationAsPlainArray.rst | 22 +- .../ExtensionConfigurationTest.php | 204 +++++++++ .../Controller/ConfigurationController.php | 221 ---------- .../Controller/DistributionController.php | 13 - .../Classes/Controller/DownloadController.php | 31 +- .../Classes/Controller/ListController.php | 18 +- .../UploadExtensionFileController.php | 18 +- .../Domain/Model/ConfigurationCategory.php | 81 ---- .../Domain/Model/ConfigurationItem.php | 189 --------- .../Domain/Model/ConfigurationSubcategory.php | 110 ----- .../ConfigurationItemRepository.php | 230 ---------- .../Classes/Utility/Connection/TerUtility.php | 17 +- .../Classes/Utility/InstallUtility.php | 6 +- .../Classes/Utility/Repository/Helper.php | 11 +- .../ConfigureExtensionViewHelper.php | 78 ---- .../DownloadExtensionViewHelper.php | 17 +- .../Resources/Private/Language/locallang.xlf | 45 -- .../Configuration/ShowConfigurationForm.html | 80 ---- .../Private/Templates/Distribution/Show.html | 9 +- .../Private/Templates/List/Index.html | 5 +- .../Resources/Public/JavaScript/Main.js | 75 ---- .../ConfigurationItemRepositoryTest.php | 291 ------------- .../Unit/Utility/ConfigurationUtilityTest.php | 325 -------------- .../Utility/Fixtures/ext_conf_template.txt | 5 - .../sysext/extensionmanager/ext_localconf.php | 9 +- .../Controller/AdministrationController.php | 3 +- .../Classes/Controller/SearchController.php | 5 +- .../Repository/IndexSearchRepository.php | 13 +- .../Classes/FileContentParser.php | 5 +- .../sysext/indexed_search/Classes/Indexer.php | 9 +- .../Classes/Service/DatabaseSchemaService.php | 14 +- .../Tca/IndexConfigVisibleFieldsTest.php | 116 ----- typo3/sysext/indexed_search/ext_localconf.php | 13 +- .../Classes/Controller/LayoutController.php | 69 ++- .../Classes/Controller/SettingsController.php | 66 +++ .../ExtensionConfigurationService.php} | 401 +++++++++++------- .../Form/TypoScriptConstantsViewHelper.php | 136 +++--- .../ViewHelpers/Format/NoSpaceViewHelper.php | 52 +++ .../Settings/ExtensionConfiguration.html | 1 + .../ExtensionConfiguration/ExtensionForm.html | 71 ++++ .../Private/Templates/Settings/Cards.html | 7 + .../ExtensionConfigurationGetContent.html | 22 + .../install/Resources/Public/Css/install.css | 2 +- .../Modules/ExtensionConfiguration.js | 228 ++++++++++ .../JavaScript/Modules/LocalConfiguration.js | 14 +- .../Public/JavaScript/Modules/Router.js | 51 ++- .../Public/JavaScript/RequireJSConfig.js | 1 + .../Classes/Backend/CommandLineBackend.php | 12 +- .../rsaauth/Classes/BackendWarnings.php | 5 +- .../Unit/Backend/CommandLineBackendTest.php | 2 +- .../ExtensionManagerConfigurationUtility.php | 7 +- .../Utility/SaltedPasswordsUtility.php | 9 +- .../Tests/Unit/Salt/SaltFactoryTest.php | 15 + .../Utility/SaltedPasswordsUtilityTest.php | 39 -- typo3/sysext/scheduler/Classes/Scheduler.php | 3 +- typo3/sysext/scheduler/ext_localconf.php | 7 +- 67 files changed, 1608 insertions(+), 2327 deletions(-) create mode 100644 typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php create mode 100644 typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php create mode 100644 typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php create mode 100644 typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst create mode 100644 typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php delete mode 100644 typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php delete mode 100644 typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php delete mode 100644 typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php delete mode 100644 typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php delete mode 100644 typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php delete mode 100644 typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php delete mode 100644 typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html delete mode 100644 typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php delete mode 100644 typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php delete mode 100644 typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt delete mode 100644 typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php rename typo3/sysext/{extensionmanager/Classes/Utility/ConfigurationUtility.php => install/Classes/Service/ExtensionConfigurationService.php} (61%) rename typo3/sysext/{extensionmanager => install}/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php (64%) create mode 100644 typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php create mode 100644 typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html create mode 100644 typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html create mode 100644 typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html create mode 100644 typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js delete mode 100644 typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php diff --git a/Build/Resources/Public/Sass/install.scss b/Build/Resources/Public/Sass/install.scss index 4f1ddf09fae9..181b2bfcee48 100644 --- a/Build/Resources/Public/Sass/install.scss +++ b/Build/Resources/Public/Sass/install.scss @@ -20,6 +20,8 @@ $grid-float-breakpoint: $screen-md-min; @import "libs/chosen"; @import "libs/gridder"; @import "component/card"; +@import "component/colorpicker"; +@import "typo3/main_form"; // // Include elements diff --git a/typo3/sysext/backend/Classes/Controller/BackendController.php b/typo3/sysext/backend/Classes/Controller/BackendController.php index d1664da4f945..bd78f9d0f13b 100644 --- a/typo3/sysext/backend/Classes/Controller/BackendController.php +++ b/typo3/sysext/backend/Classes/Controller/BackendController.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Backend\Module\ModuleLoader; use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface; use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction; use TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction; @@ -280,7 +281,7 @@ class BackendController $view = $this->getFluidTemplateObject($this->partialPath . 'Backend/Topbar.html'); // Extension Configuration to find the TYPO3 logo in the left corner - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['backend'], ['allowed_classes' => false]); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); $logoPath = ''; if (!empty($extConf['backendLogo'])) { $customBackendLogo = GeneralUtility::getFileAbsFileName($extConf['backendLogo']); diff --git a/typo3/sysext/backend/Classes/Controller/LoginController.php b/typo3/sysext/backend/Classes/Controller/LoginController.php index ee78ab0d4b21..aa99e82ed938 100644 --- a/typo3/sysext/backend/Classes/Controller/LoginController.php +++ b/typo3/sysext/backend/Classes/Controller/LoginController.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Backend\LoginProvider\LoginProviderInterface; use TYPO3\CMS\Backend\Routing\UriBuilder; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\FormProtection\BackendFormProtection; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; @@ -165,7 +166,7 @@ class LoginController $this->checkRedirect(); // Extension Configuration - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['backend'], ['allowed_classes' => false]); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); // Background Image if (!empty($extConf['loginBackgroundImage'])) { diff --git a/typo3/sysext/backend/Classes/Template/DocumentTemplate.php b/typo3/sysext/backend/Classes/Template/DocumentTemplate.php index 9e528f65001e..5c0a75fc1ad6 100644 --- a/typo3/sysext/backend/Classes/Template/DocumentTemplate.php +++ b/typo3/sysext/backend/Classes/Template/DocumentTemplate.php @@ -17,6 +17,7 @@ namespace TYPO3\CMS\Backend\Template; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Backend\Utility\BackendUtility; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Imaging\IconFactory; use TYPO3\CMS\Core\Page\PageRenderer; @@ -932,10 +933,9 @@ function jumpToUrl(URL) { */ protected function getBackendFavicon() { - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['backend'], ['allowed_classes' => false]); - - if (!empty($extConf['backendFavicon'])) { - $path = $this->getUriForFileName($extConf['backendFavicon']); + $backendFavicon = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend', 'backendFavicon'); + if (!empty($backendFavicon)) { + $path = $this->getUriForFileName($backendFavicon); } else { $path = ExtensionManagementUtility::extPath('backend') . 'Resources/Public/Icons/favicon.ico'; } diff --git a/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php new file mode 100644 index 000000000000..2e07269a0367 --- /dev/null +++ b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationExtensionNotConfiguredException.php @@ -0,0 +1,27 @@ +<?php +namespace TYPO3\CMS\Core\Configuration\Exception; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Exception; + +/** + * An exception thrown if ExtensionConfiguration->get() is called for + * an extension that has no configuration. + * + * @internal + */ +class ExtensionConfigurationExtensionNotConfiguredException extends Exception +{ +} diff --git a/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php new file mode 100644 index 000000000000..bc3ee8a74620 --- /dev/null +++ b/typo3/sysext/core/Classes/Configuration/Exception/ExtensionConfigurationPathDoesNotExistException.php @@ -0,0 +1,27 @@ +<?php +namespace TYPO3\CMS\Core\Configuration\Exception; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Exception; + +/** + * An exception thrown if ExtensionConfiguration->get() is called with + * a path that does not exist within the extension configuration. + * + * @internal + */ +class ExtensionConfigurationPathDoesNotExistException extends Exception +{ +} diff --git a/typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php b/typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php new file mode 100644 index 000000000000..0556885ea395 --- /dev/null +++ b/typo3/sysext/core/Classes/Configuration/ExtensionConfiguration.php @@ -0,0 +1,208 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Core\Configuration; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException; +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationPathDoesNotExistException; +use TYPO3\CMS\Core\Utility\ArrayUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; + +/** + * API to get() and set() instance specific extension configuration options. + * + * Extension authors are encouraged to use this API - it is currently a simple + * wrapper to access TYPO3_CONF_VARS['EXTENSIONS'] but could later become something + * different in case core decides to store extension configuration elsewhere. + * + * Extension authors must not access TYPO3_CONF_VARS['EXTENSIONS'] on their own. + * + * Extension configurations are often 'feature flags' currently defined by + * ext_conf_template.txt files. The core (more specifically the install tool) + * takes care default values and overridden values are properly prepared upon + * loading or updating an extension. + */ +class ExtensionConfiguration +{ + /** + * Get a single configuration value, a sub array or the whole configuration. + * + * Examples: + * // Simple and typical usage: Get a single config value, or an array if the key is a "TypoScript" + * // a-like sub-path in ext_conf_template.txt "foo.bar = defaultValue" + * ->get('myExtension', 'aConfigKey'); + * + * // Get all current configuration values, always an array + * ->get('myExtension'); + * + * // Get a nested config value if the path is a "TypoScript" a-like sub-path + * // in ext_conf_template.txt "FE.forceSalted = defaultValue" + * ->get('myExtension', 'FE/forceSalted') + * + * Notes: + * - Return values are NOT type safe: A boolean false could be returned as string 0. + * Cast accordingly. + * - This API throws exceptions if the path does not exist or the extension + * configuration is not available. The install tool takes care any new + * ext_conf_template.txt values are available TYPO3_CONF_VARS['EXTENSIONS'], + * a thrown exception indicates a programming error on developer side + * and should not be caught. + * - It is not checked if the extension in question is loaded at all, + * it's just checked the extension configuration path exists. + * - Extensions should typically not get configuration of a different extension. + * + * @param string $extension Extension name + * @param string $path Configuration path - eg. "featureCategory/coolThingIsEnabled" + * @return mixed The value. Can be a sub array or a single value. + * @throws ExtensionConfigurationExtensionNotConfiguredException If ext configuration does no exist + * @throws ExtensionConfigurationPathDoesNotExistException If a requested extension path does not exist + * @api + */ + public function get(string $extension, string $path = '') + { + if (!isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extension]) || !is_array($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extension])) { + throw new ExtensionConfigurationExtensionNotConfiguredException( + 'No extension configuration for extension ' . $extension . ' found. Either this extension' + . ' has no extension configuration or the configuration is not up to date. Execute the' + . ' install tool to update configuration.', + 1509654728 + ); + } + if (empty($path)) { + return $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extension]; + } + if (!ArrayUtility::isValidPath($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'], $extension . '/' . $path)) { + throw new ExtensionConfigurationPathDoesNotExistException( + 'Path ' . $path . ' does not exist in extension configuration', + 1509977699 + ); + } + return ArrayUtility::getValueByPath($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'], $extension . '/' . $path); + } + + /** + * Store a new or overwrite an existing configuration value. + * + * This is typically used by core internal low level tasks like the install + * tool but may become handy if an extension needs to update extension configuration + * on the fly for whatever reason. + * + * Examples: + * // Enable a single feature + * ->set('myExtension', 'myFeature', true) + * + * // Set a full extension configuration ($value could be a nested array, too) + * ->set('myExtension', '', ['aFeature' => 'true', 'aCustomClass' => 'css-foo']) + * + * // Set a full sub path + * ->set('myExtension', 'myFeatureCategory', ['aFeature' => 'true', 'aCustomClass' => 'css-foo']) + * + * // Unset a whole extension configuration + * ->set('myExtension') + * + * // Unset a single value or sub path + * ->set('myExtension', 'myFeature') + * + * Notes: + * - $path is NOT validated. It is up to an ext author to also define them in + * ext_conf_template.txt to have an interface in install tool reflecting these settings + * - If $path is currently an array, $value overrides the whole thing. Merging existing values + * is up to the extension author + * - Values are not type safe, if the install tool wrote them, + * boolean true could become string 1 on ->get() + * - It is not possible to store 'null' as value, giving $value=null + * or no value at all will unset the path + * - Setting a value and calling ->get() afterwards will still return the old (!) value, the + * new value is only available in ->get() with next request. This is to have consistent + * values if the setting is possibly overwritten in AdditionalConfiguration again, which + * this API does not know and is only evaluated early during bootstrap. + * - Warning on AdditionalConfiguration.php: If this file overwrites settings, it spoils the + * ->set() call and values may not finally end up as expected. Avoid using AdditionalConfiguration.php + * in general ... + * + * @param string $extension Extension name + * @param string $path Configuration path to set - eg. "featureCategory/coolThingIsEnabled" + * @param null $value The value. If null, unset the path + * @api + */ + public function set(string $extension, string $path = '', $value = null) + { + if (empty($extension)) { + throw new \RuntimeException('extension name must not be empty', 1509715852); + } + $configurationManager = GeneralUtility::makeInstance(ConfigurationManager::class); + if ($path === '' && $value === null) { + // Remove whole extension config + $configurationManager->removeLocalConfigurationKeysByPath([ 'EXTENSIONS/' . $extension ]); + } elseif ($path !== '' && $value === null) { + // Remove a single value or sub path + $configurationManager->removeLocalConfigurationKeysByPath([ 'EXTENSIONS/' . $extension . '/' . $path]); + } elseif ($path === '' && $value !== null) { + // Set full extension config + $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extension, $value); + } else { + // Set single path + $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extension . '/' . $path, $value); + } + + // After TYPO3_CONF_VARS['EXTENSIONS'] has been written, update legacy layer TYPO3_CONF_VARS['EXTENSIONS']['extConf'] + // @deprecated since TYPO3 v9, will be removed in v10 with removal of old serialized 'extConf' layer + $extensionsConfigs = $configurationManager->getConfigurationValueByPath('EXTENSIONS'); + foreach ($extensionsConfigs as $extensionName => $extensionConfig) { + $extensionConfig = $this->addDotsToArrayKeysRecursiveForLegacyExtConf($extensionConfig); + $configurationManager->setLocalConfigurationValueByPath('EXT/extConf/' . $extensionName, serialize($extensionConfig)); + } + } + + /** + * The old EXT/extConf layer had '.' (dots) at the end of all nested array keys. This is created here + * to keep EXT/extConf format compatible with old not yet adapted extensions. + * Most prominent usage is ext:saltedpasswords which uses sub keys like FE.forceSalted and BE.forceSalted, + * but extensions may rely on ending dots if using legacy unserialize() on their extensions, too. + * + * A EXTENSIONS array like: + * TYPO3_CONF_VARS['EXTENSIONS']['someExtension'] => [ + * 'someKey' => [ + * 'someSubKey' => [ + * 'someSubSubKey' => 'someValue', + * ], + * ], + * ] + * becomes (serialized) in old EXT/extConf (mind the dots and end of array keys for sub arrays): + * TYPO3_CONF_VARS['EXTENSIONS']['someExtension'] => [ + * 'someKey.' => [ + * 'someSubKey.' => [ + * 'someSubSubKey' => 'someValue', + * ], + * ], + * ] + * + * @param array $extensionConfig + * @return array + * @deprecated since TYPO3 v9, will be removed in v10 with removal of old serialized 'extConf' layer + */ + private function addDotsToArrayKeysRecursiveForLegacyExtConf(array $extensionConfig) + { + $newArray = []; + foreach ($extensionConfig as $key => $value) { + if (is_array($value)) { + $newArray[$key . '.'] = $this->addDotsToArrayKeysRecursiveForLegacyExtConf($value); + } else { + $newArray[$key] = $value; + } + } + return $newArray; + } +} diff --git a/typo3/sysext/core/Configuration/DefaultConfiguration.php b/typo3/sysext/core/Configuration/DefaultConfiguration.php index 5fa2e1572bb0..919a20d5ee68 100644 --- a/typo3/sysext/core/Configuration/DefaultConfiguration.php +++ b/typo3/sysext/core/Configuration/DefaultConfiguration.php @@ -805,25 +805,26 @@ return [ 'allowGlobalInstall' => false, 'allowLocalInstall' => true, 'excludeForPackaging' => '(?:\\..*(?!htaccess)|.*~|.*\\.swp|.*\\.bak|\\.sass-cache|node_modules|bower_components)', - 'extConf' => [ - 'saltedpasswords' => serialize([ - 'BE.' => [ - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - 'FE.' => [ - 'enabled' => 0, - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - ]), - ], 'runtimeActivatedPackages' => [], ], + // Custom options shipped by extensions + 'EXTENSIONS' => [ + 'saltedpasswords' => [ + 'BE' => [ + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'FE' => [ + 'enabled' => 0, + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + ], + ], 'BE' => [ // Backend Configuration. 'languageDebug' => false, diff --git a/typo3/sysext/core/Configuration/FactoryConfiguration.php b/typo3/sysext/core/Configuration/FactoryConfiguration.php index b5474e2cd978..dbac51c30cb9 100644 --- a/typo3/sysext/core/Configuration/FactoryConfiguration.php +++ b/typo3/sysext/core/Configuration/FactoryConfiguration.php @@ -18,24 +18,45 @@ return [ ], ], ], - 'EXT' => [ - 'extConf' => [ - 'rsaauth' => 'a:1:{s:18:"temporaryDirectory";s:0:"";}', - 'saltedpasswords' => serialize([ - 'BE.' => [ - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - 'FE.' => [ - 'enabled' => 1, - 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, - 'forceSalted' => 0, - 'onlyAuthService' => 0, - 'updatePasswd' => 1, - ], - ]), + 'EXTENSIONS' => [ + 'backend' => [ + 'backendFavicon' => '', + 'backendLogo' => '', + 'loginBackgroundImage' => '', + 'loginFootnote' => '', + 'loginHighlightColor' => '', + 'loginLogo' => '', + ], + 'extensionmanager' => [ + 'automaticInstallation' => 1, + 'offlineMode' => 0, + ], + 'rsaauth' => [ + 'temporaryDirectory' => '', + ], + 'saltedpasswords' => [ + 'BE' => [ + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'FE' => [ + 'enabled' => 1, + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'checkConfigurationBE' => '0', + 'checkConfigurationBE2' => '0', + 'checkConfigurationFE' => '0', + 'checkConfigurationFE2' => '0', + ], + 'scheduler' => [ + 'enableBELog' => 1, + 'maxLifetime' => 1440, + 'showSampleTasks' => 1, ], ], 'FE' => [ diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst new file mode 100644 index 000000000000..563eaa6691f8 --- /dev/null +++ b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82368-SignalAfterExtensionConfigurationWriteRemoved.rst @@ -0,0 +1,36 @@ +.. include:: ../../Includes.txt + +==================================================================== +Breaking: #82368 - Signal 'afterExtensionConfigurationWrite' removed +==================================================================== + +See :issue:`82368` + +Description +=========== + +The extension manager no longer emits signal 'afterExtensionConfigurationWrite'. +The code has been moved to the install tool which does not load signal / slot +information at this point. + + +Impact +====== + +Slots of this signal are no longer executed. + + +Affected Installations +====================== + +Extensions that use signal 'afterExtensionConfigurationWrite'. This is a rather seldom +used signal, relevant mostly only for distributions. + + +Migration +========= + +In many cases it should be possible to use signal 'hasInstalledExtensions' instead +which is fired after an extension has been installed. + +.. index:: Backend, LocalConfiguration, PHP-API, NotScanned \ No newline at end of file diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst index ee96a3ab7a46..e68362fdfd69 100644 --- a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst +++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82254-DeprecateGLOBALSTYPO3_CONF_VARSEXTextConf.rst @@ -9,7 +9,9 @@ See :issue:`82254` Description =========== -The extension configuration stored in $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'] has been deprecated and replaced by a plain array in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. +The extension configuration stored in $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'] has been +deprecated and replaced by a plain array in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. A new +API has been introduced to retrieve extension configuration. Affected Installations @@ -21,6 +23,21 @@ All extensions manually getting settings and unserializing them from $GLOBALS['T Migration ========= -Switch to the use of $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'] instead and remove all unserialize calls. +Use a new API to retrieve extension configuration, examples: + +.. code-block:: php + + // Retrieve a single key + $backendFavicon = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend', 'backendFavicon'); + + // Retrieve whole configuration + $backendConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); + + // Fully qualified class names for usage in ext_localconf.php / ext_tables.php + $backendConfiguration = (bool)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class + )->get('backend'); + + .. index:: LocalConfiguration, PHP-API, FullyScanned diff --git a/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst b/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst index 4e12dbd226e4..d79d860afd1c 100644 --- a/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst +++ b/typo3/sysext/core/Documentation/Changelog/master/Feature-82254-StoreExtensionConfigurationAsPlainArray.rst @@ -9,14 +9,30 @@ See :issue:`82254` Description =========== -There is no reason to save the extension configuration as serialized values instead of an plain array. Arrays are easier to handle and there are already parts of the core using arrays (for example the avatar provider registration). +There is no reason to save the extension configuration as serialized values instead of +an plain array. Arrays are easier to handle and there are already parts of the core +using arrays (for example the avatar provider registration). -Therefore the API has been changed to store the extension configuration as an array in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. The configuration is merged on save with the default configuration and the full configuration is written to LocalConfiguration. +Therefore the API has been changed to store the extension configuration as an array +in $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']. The configuration is merged on save +with the default configuration and the full configuration is written to LocalConfiguration. Impact ====== -Extension configuration can now be accessed as array directly, without calling unserialize(). The old and new API will co-exist in version 9. +Extension configuration can now be accessed as array directly, without +calling unserialize(). The old and new API will co-exist in version 9. + +Use a new API to retrieve extension configuration, examples: + +.. code-block:: php + + // Retrieve a single key + $backendFavicon = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend', 'backendFavicon'); + + // Retrieve whole configuration + $backendConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('backend'); + .. index:: LocalConfiguration, PHP-API diff --git a/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php b/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php new file mode 100644 index 000000000000..004596be3922 --- /dev/null +++ b/typo3/sysext/core/Tests/Unit/Configuration/ExtensionConfigurationTest.php @@ -0,0 +1,204 @@ +<?php +declare(strict_types=1); +namespace TYPO3\CMS\Core\Tests\Unit\Configuration; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use Prophecy\Argument; +use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\TestingFramework\Core\Unit\UnitTestCase; + +/** + * Test case + */ +class ExtensionConfigurationTest extends UnitTestCase +{ + /** + * @test + */ + public function getThrowExceptionIfExtensionConfigurationDoesNotExist() + { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someOtherExtension']['someKey'] = 'someValue'; + $this->expectException(ExtensionConfigurationExtensionNotConfiguredException::class); + $this->expectExceptionCode(1509654728); + (new ExtensionConfiguration())->get('someExtension'); + } + + /** + * @test + */ + public function getWithEmptyPathReturnsEntireExtensionConfiguration() + { + $extConf = [ + 'aFeature' => 'iAmEnabled', + 'aFlagCategory' => [ + 'someFlag' => 'foo', + ], + ]; + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = $extConf; + $this->assertSame((new ExtensionConfiguration())->get('someExtension'), $extConf); + } + + /** + * @test + */ + public function getWithPathReturnsGivenValue() + { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = [ + 'aFeature' => 'iAmEnabled', + 'aFlagCategory' => [ + 'someFlag' => 'foo', + ], + ]; + $this->assertSame((new ExtensionConfiguration())->get('someExtension', 'aFeature'), 'iAmEnabled'); + } + + /** + * @test + */ + public function getWithPathReturnsGivenPathSegment() + { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['someExtension'] = [ + 'aFeature' => 'iAmEnabled', + 'aFlagCategory' => [ + 'someFlag' => 'foo', + ], + ]; + $this->assertSame((new ExtensionConfiguration())->get('someExtension', 'aFlagCategory'), ['someFlag' => 'foo']); + } + + /** + * @test + */ + public function setThrowsExceptionWithEmptyExtension() + { + $this->expectException(\RuntimeException::class); + $this->expectExceptionCode(1509715852); + (new ExtensionConfiguration())->set(''); + } + + /** + * @test + */ + public function setRemovesFullExtensionConfiguration() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->removeLocalConfigurationKeysByPath(['EXTENSIONS/foo'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo'); + } + + /** + * @test + */ + public function setRemovesPath() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->removeLocalConfigurationKeysByPath(['EXTENSIONS/foo/bar'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', 'bar'); + } + + /** + * @test + */ + public function setWritesFullExtensionConfig() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXTENSIONS/foo', ['bar' => 'baz'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', '', ['bar' => 'baz']); + } + + /** + * @test + */ + public function setWritesPath() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->getConfigurationValueByPath(Argument::cetera())->willReturn([]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXTENSIONS/foo/aPath', ['bar' => 'baz'])->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', 'aPath', ['bar' => 'baz']); + } + + /** + * @test + */ + public function setUpdatesLegacyExtConfToNewValues() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->setLocalConfigurationValueByPath(Argument::cetera())->shouldBeCalled(); + $configurationManagerProphecy->getConfigurationValueByPath('EXTENSIONS')->willReturn(['foo' => ['bar' => 'baz']]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXT/extConf/foo', serialize(['bar' => 'baz']))->shouldBeCalled(); + (new ExtensionConfiguration())->set('foo', '', ['bar' => 'baz']); + } + + /** + * @test + */ + public function setUpdatesLegacyExtConfWithDottedArrayKeysForNestedConfiguration() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->setLocalConfigurationValueByPath(Argument::cetera())->shouldBeCalled(); + $nestedInput = [ + 'FE' => [ + 'forceSalted' => true, + ] + ]; + $expectedLegacyExtConf = [ + 'FE.' => [ + 'forceSalted' => true, + ] + ]; + $configurationManagerProphecy->getConfigurationValueByPath('EXTENSIONS')->willReturn(['saltedPasswords' => $nestedInput]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXT/extConf/saltedPasswords', serialize($expectedLegacyExtConf))->shouldBeCalled(); + (new ExtensionConfiguration())->set('saltedPasswords', '', $nestedInput); + } + + /** + * @test + */ + public function setUpdatesLegacyExtConfWithDottedArrayKeysForNestedConfigurationWithMultiNestedArrays() + { + $configurationManagerProphecy = $this->prophesize(ConfigurationManager::class); + GeneralUtility::addInstance(ConfigurationManager::class, $configurationManagerProphecy->reveal()); + $configurationManagerProphecy->setLocalConfigurationValueByPath(Argument::cetera())->shouldBeCalled(); + $nestedInput = [ + 'aCategory' => [ + 'aSubCategory' => [ + 'aKey' => 'aValue', + ], + ], + ]; + $expectedLegacyExtConf = [ + 'aCategory.' => [ + 'aSubCategory.' => [ + 'aKey' => 'aValue', + ], + ], + ]; + $configurationManagerProphecy->getConfigurationValueByPath('EXTENSIONS')->willReturn(['someExtension' => $nestedInput]); + $configurationManagerProphecy->setLocalConfigurationValueByPath('EXT/extConf/someExtension', serialize($expectedLegacyExtConf))->shouldBeCalled(); + (new ExtensionConfiguration())->set('someExtension', '', $nestedInput); + } +} diff --git a/typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php b/typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php deleted file mode 100644 index 495c5d8947be..000000000000 --- a/typo3/sysext/extensionmanager/Classes/Controller/ConfigurationController.php +++ /dev/null @@ -1,221 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Controller; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Backend\Template\Components\ButtonBar; -use TYPO3\CMS\Backend\View\BackendTemplateView; -use TYPO3\CMS\Core\Imaging\Icon; -use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; -use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; -use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; - -/** - * Controller for configuration related actions. - */ -class ConfigurationController extends AbstractModuleController -{ - /** - * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository - */ - protected $configurationItemRepository; - - /** - * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository - */ - protected $extensionRepository; - - /** - * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository $configurationItemRepository - */ - public function injectConfigurationItemRepository(\TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository $configurationItemRepository) - { - $this->configurationItemRepository = $configurationItemRepository; - } - - /** - * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository - */ - public function injectExtensionRepository(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository) - { - $this->extensionRepository = $extensionRepository; - } - - /** - * Set up the doc header properly here - * - * @param ViewInterface $view - */ - protected function initializeView(ViewInterface $view) - { - if ($view instanceof BackendTemplateView) { - /** @var BackendTemplateView $view */ - parent::initializeView($view); - $this->generateMenu(); - $this->registerDocheaderButtons(); - } - } - - /** - * Show the extension configuration form. The whole form field handling is done - * in the corresponding view helper - * - * @param array $extension Extension information, must contain at least the key - * @throws \TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException - */ - public function showConfigurationFormAction(array $extension) - { - if (!isset($extension['key'])) { - throw new ExtensionManagerException('Extension key not found.', 1359206803); - } - $this->handleTriggerArguments(); - - $extKey = $extension['key']; - $configuration = $this->configurationItemRepository->findByExtensionKey($extKey); - if ($configuration) { - $this->view - ->assign('configuration', $configuration) - ->assign('extension', $extension); - } else { - throw new ExtensionManagerException('The extension ' . $extKey . ' has no configuration.', 1476047775); - } - } - - /** - * Save configuration and redirects back to form - * or to the show page of a distribution - * - * @param array $config The new extension configuration - * @param string $extensionKey The extension key - */ - public function saveAction(array $config, $extensionKey) - { - $this->saveConfiguration($config, $extensionKey); - /** @var Extension $extension */ - $extension = $this->extensionRepository->findOneByCurrentVersionByExtensionKey($extensionKey); - // Different handling for distribution installation - if ($extension instanceof Extension && - $extension->getCategory() === Extension::DISTRIBUTION_CATEGORY - ) { - $this->redirect('show', 'Distribution', null, ['extension' => $extension->getUid()]); - } else { - $this->redirect('showConfigurationForm', null, null, [ - 'extension' => [ - 'key' => $extensionKey - ], - self::TRIGGER_RefreshTopbar => true - ]); - } - } - - /** - * Saves new configuration and redirects back to list - * - * @param array $config - * @param string $extensionKey - */ - public function saveAndCloseAction(array $config, $extensionKey) - { - $this->saveConfiguration($config, $extensionKey); - $this->redirect('index', 'List', null, [ - self::TRIGGER_RefreshTopbar => true - ]); - } - - /** - * Emits a signal after the configuration file was written - * - * @param string $extensionKey - * @param array $newConfiguration - */ - protected function emitAfterExtensionConfigurationWriteSignal($extensionKey, array $newConfiguration) - { - $this->signalSlotDispatcher->dispatch(__CLASS__, 'afterExtensionConfigurationWrite', [$extensionKey, $newConfiguration, $this]); - } - - /** - * Merge and save new configuration - * - * @param array $config - * @param $extensionKey - */ - protected function saveConfiguration(array $config, $extensionKey) - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility */ - $configurationUtility = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $newConfiguration = $configurationUtility->getCurrentConfiguration($extensionKey); - \TYPO3\CMS\Core\Utility\ArrayUtility::mergeRecursiveWithOverrule($newConfiguration, $config); - $configurationUtility->writeConfiguration( - $configurationUtility->convertValuedToNestedConfiguration($newConfiguration), - $extensionKey - ); - $this->emitAfterExtensionConfigurationWriteSignal($extensionKey, $newConfiguration); - } - - /** - * Registers the Icons into the docheader - * - * @throws \InvalidArgumentException - */ - protected function registerDocheaderButtons() - { - $moduleTemplate = $this->view->getModuleTemplate(); - $lang = $this->getLanguageService(); - - /** @var ButtonBar $buttonBar */ - $buttonBar = $moduleTemplate->getDocHeaderComponent()->getButtonBar(); - - $uriBuilder = $this->controllerContext->getUriBuilder(); - $uri = $uriBuilder->reset()->uriFor('index', [], 'List'); - - $icon = $this->view->getModuleTemplate()->getIconFactory()->getIcon('actions-view-go-back', Icon::SIZE_SMALL); - $goBackButton = $buttonBar->makeLinkButton() - ->setHref($uri) - ->setTitle($this->translate('extConfTemplate.backToList')) - ->setIcon($icon); - $buttonBar->addButton($goBackButton, ButtonBar::BUTTON_POSITION_LEFT); - - $saveSplitButton = $buttonBar->makeSplitButton(); - // SAVE button: - $saveButton = $buttonBar->makeInputButton() - ->setName('_savedok') - ->setValue('1') - ->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:rm.saveDoc')) - ->setForm('configurationform') - ->setIcon($moduleTemplate->getIconFactory()->getIcon('actions-document-save', Icon::SIZE_SMALL)); - $saveSplitButton->addItem($saveButton, true); - - // SAVE / CLOSE - $saveAndCloseButton = $buttonBar->makeInputButton() - ->setName('_saveandclosedok') - ->setClasses('t3js-save-close') - ->setValue('1') - ->setTitle($lang->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:rm.saveCloseDoc')) - ->setForm('configurationform') - ->setIcon($moduleTemplate->getIconFactory()->getIcon( - 'actions-document-save-close', - Icon::SIZE_SMALL - )); - $saveSplitButton->addItem($saveAndCloseButton); - $buttonBar->addButton($saveSplitButton, ButtonBar::BUTTON_POSITION_LEFT, 2); - } - - /** - * @return \TYPO3\CMS\Core\Localization\LanguageService - */ - protected function getLanguageService() - { - return $GLOBALS['LANG']; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php b/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php index 7d4660df2ad6..cb0f05c654ca 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/DistributionController.php @@ -62,20 +62,7 @@ class DistributionController extends AbstractModuleController // Check if extension/package is installed $active = $this->packageManager->isPackageActive($extensionKey); - // Create link for extension configuration - if ($active && file_exists(\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::extPath($extensionKey) . 'ext_conf_template.txt')) { - $uriBuilder = $this->controllerContext->getUriBuilder(); - $action = 'showConfigurationForm'; - $configurationLink = $uriBuilder->reset()->uriFor( - $action, - ['extension' => ['key' => $extensionKey]], - 'Configuration' - ); - } else { - $configurationLink = false; - } $this->view->assign('distributionActive', $active); - $this->view->assign('configurationLink', $configurationLink); $this->view->assign('extension', $extension); } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php b/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php index 35924b3190d5..ef5692967367 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/DownloadController.php @@ -14,7 +14,9 @@ namespace TYPO3\CMS\Extensionmanager\Controller; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Messaging\FlashMessage; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\View\JsonView; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; @@ -48,11 +50,6 @@ class DownloadController extends AbstractController */ protected $downloadUtility; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @var JsonView */ @@ -103,14 +100,6 @@ class DownloadController extends AbstractController $this->downloadUtility = $downloadUtility; } - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Defines which view object should be used for the installFromTer action */ @@ -137,7 +126,11 @@ class DownloadController extends AbstractController 'dependencies' => [], ], ]; - if ($this->configurationUtility->getCurrentConfiguration('extensionmanager')['automaticInstallation']['value']) { + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); + if (!$isAutomaticInstallationEnabled) { + // if automatic installation is deactivated, no dependency check is needed (download only) + $action = 'installExtensionWithoutSystemDependencyCheck'; + } else { $action = 'installFromTer'; try { $dependencyTypes = $this->managementService->getAndResolveDependencies($extension); @@ -177,9 +170,6 @@ class DownloadController extends AbstractController $title = $this->translate('downloadExtension.dependencies.errorTitle'); $message = $e->getMessage(); } - } else { - // if automatic installation is deactivated, no dependency check is needed (download only) - $action = 'installExtensionWithoutSystemDependencyCheck'; } $url = $this->uriBuilder->uriFor( @@ -207,11 +197,11 @@ class DownloadController extends AbstractController public function installFromTerAction(\TYPO3\CMS\Extensionmanager\Domain\Model\Extension $extension, $downloadPath = 'Local') { list($result, $errorMessages) = $this->installFromTer($extension, $downloadPath); - $emConfiguration = $this->configurationUtility->getCurrentConfiguration('extensionmanager'); + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); $this->view ->assign('result', $result) ->assign('extension', $extension) - ->assign('installationTypeLanguageKey', (bool)$emConfiguration['automaticInstallation']['value'] ? '' : '.downloadOnly') + ->assign('installationTypeLanguageKey', $isAutomaticInstallationEnabled ? '' : '.downloadOnly') ->assign('unresolvedDependencies', $errorMessages); } @@ -362,7 +352,8 @@ class DownloadController extends AbstractController $errorMessages = []; try { $this->downloadUtility->setDownloadPath($downloadPath); - $this->managementService->setAutomaticInstallationEnabled($this->configurationUtility->getCurrentConfiguration('extensionmanager')['automaticInstallation']['value']); + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); + $this->managementService->setAutomaticInstallationEnabled($isAutomaticInstallationEnabled); if (($result = $this->managementService->installExtension($extension)) === false) { $errorMessages = $this->managementService->getDependencyErrors(); } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/ListController.php b/typo3/sysext/extensionmanager/Classes/Controller/ListController.php index f2c3c7aceffe..ee201524a7a4 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/ListController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/ListController.php @@ -16,10 +16,12 @@ namespace TYPO3\CMS\Extensionmanager\Controller; use TYPO3\CMS\Backend\Template\Components\ButtonBar; use TYPO3\CMS\Backend\View\BackendTemplateView; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; @@ -51,11 +53,6 @@ class ListController extends AbstractModuleController */ protected $dependencyUtility; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository */ @@ -88,21 +85,14 @@ class ListController extends AbstractModuleController $this->dependencyUtility = $dependencyUtility; } - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Add the needed JavaScript files for all actions */ public function initializeAction() { $this->pageRenderer->addInlineLanguageLabelFile('EXT:extensionmanager/Resources/Private/Language/locallang.xlf'); - if ($this->configurationUtility->getCurrentConfiguration('extensionmanager')['offlineMode']['value']) { + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode'); + if ($isAutomaticInstallationEnabled) { $this->settings['offlineMode'] = true; } } diff --git a/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php b/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php index c225fa536f5e..0daa0a89b5ee 100644 --- a/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php +++ b/typo3/sysext/extensionmanager/Classes/Controller/UploadExtensionFileController.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Extensionmanager\Controller; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -26,11 +27,6 @@ use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; */ class UploadExtensionFileController extends AbstractController { - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository */ @@ -61,14 +57,6 @@ class UploadExtensionFileController extends AbstractController */ protected $removeFromOriginalPath = false; - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * @param \TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository $extensionRepository */ @@ -150,8 +138,8 @@ class UploadExtensionFileController extends AbstractController ); } $extensionData = $this->extractExtensionFromFile($tempFile, $fileName, $overwrite); - $emConfiguration = $this->configurationUtility->getCurrentConfiguration('extensionmanager'); - if (!$emConfiguration['automaticInstallation']['value']) { + $isAutomaticInstallationEnabled = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode'); + if (!$isAutomaticInstallationEnabled) { $this->addFlashMessage( $this->translate('extensionList.uploadFlashMessage.message', [$extensionData['extKey']]), $this->translate('extensionList.uploadFlashMessage.title'), diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php b/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php deleted file mode 100644 index 97457e65b115..000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationCategory.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Model; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Main model for extension configuration categories - */ -class ConfigurationCategory extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity -{ - /** - * @var string - */ - protected $name = ''; - - /** - * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory> - */ - protected $subcategories; - - /** - * Constructs this Category - */ - public function __construct() - { - $this->subcategories = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); - } - - /** - * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $subcategories - */ - public function setSubcategories($subcategories) - { - $this->subcategories = $subcategories; - } - - /** - * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage - */ - public function getSubcategories() - { - return $this->subcategories; - } - - /** - * Adds a subcategories - * - * @param \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory $subcategory - */ - public function addSubcategory(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory $subcategory) - { - $this->subcategories->attach($subcategory); - } - - /** - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php b/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php deleted file mode 100644 index 7af7ed0257e1..000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationItem.php +++ /dev/null @@ -1,189 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Model; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Model for extension configuration items - */ -class ConfigurationItem extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity -{ - /** - * @var string - */ - protected $category = ''; - - /** - * @var string - */ - protected $subCategory = ''; - - /** - * @var string - */ - protected $type = ''; - - /** - * @var string - */ - protected $labelHeadline = ''; - - /** - * @var string - */ - protected $labelText = ''; - - /** - * @var mixed - */ - protected $generic = ''; - - /** - * @var string - */ - protected $name = ''; - - /** - * @var string - */ - protected $value = ''; - - /** - * @param string $category - */ - public function setCategory($category) - { - $this->category = $category; - } - - /** - * @return string - */ - public function getCategory() - { - return $this->category; - } - - /** - * @param string $labelHeadline - */ - public function setLabelHeadline($labelHeadline) - { - $this->labelHeadline = $labelHeadline; - } - - /** - * @return string - */ - public function getLabelHeadline() - { - return $this->labelHeadline; - } - - /** - * @param string $labelText - */ - public function setLabelText($labelText) - { - $this->labelText = $labelText; - } - - /** - * @return string - */ - public function getLabelText() - { - return $this->labelText; - } - - /** - * @param string $subCategory - */ - public function setSubCategory($subCategory) - { - $this->subCategory = $subCategory; - } - - /** - * @return string - */ - public function getSubCategory() - { - return $this->subCategory; - } - - /** - * @param string $type - */ - public function setType($type) - { - $this->type = $type; - } - - /** - * @return string - */ - public function getType() - { - return $this->type; - } - - /** - * @param mixed $userFunc - */ - public function setGeneric($userFunc) - { - $this->generic = $userFunc; - } - - /** - * @return mixed - */ - public function getGeneric() - { - return $this->generic; - } - - /** - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * @param string $value - */ - public function setValue($value) - { - $this->value = $value; - } - - /** - * @return string - */ - public function getValue() - { - return $this->value; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php b/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php deleted file mode 100644 index e02ad532be6f..000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Model/ConfigurationSubcategory.php +++ /dev/null @@ -1,110 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Model; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Model for configuration sub categories - * - * Configuration options can be structured with categories and sub categories. - * Categories are usually displayed as tabs and sub categories are used to - * group configuration items in one tab. - */ -class ConfigurationSubcategory extends \TYPO3\CMS\Extbase\DomainObject\AbstractEntity -{ - /** - * @var string - */ - protected $name = ''; - - /** - * @var string The sub category label - */ - protected $label = ''; - - /** - * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem> - */ - protected $items; - - /** - * Constructs this Category - */ - public function __construct() - { - $this->items = new \TYPO3\CMS\Extbase\Persistence\ObjectStorage(); - } - - /** - * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage $items - */ - public function setItems($items) - { - $this->items = $items; - } - - /** - * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage - */ - public function getItems() - { - return $this->items; - } - - /** - * Adds a subcategory - * - * @param \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem $item - */ - public function addItem(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem $item) - { - $this->items->attach($item); - } - - /** - * @param string $name - */ - public function setName($name) - { - $this->name = $name; - } - - /** - * @return string - */ - public function getName() - { - return $this->name; - } - - /** - * Set sub category label - * - * @param string $label - */ - public function setLabel($label) - { - $this->label = $label; - } - - /** - * Get sub category label - * - * @return string - */ - public function getLabel() - { - return $this->label; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php b/typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php deleted file mode 100644 index 702ab4fd6007..000000000000 --- a/typo3/sysext/extensionmanager/Classes/Domain/Repository/ConfigurationItemRepository.php +++ /dev/null @@ -1,230 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Domain\Repository; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Utility\ArrayUtility; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -/** - * A repository for extension configuration items - */ -class ConfigurationItemRepository -{ - /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface - */ - protected $objectManager; - - /** - * @param \TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager - */ - public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface $objectManager) - { - $this->objectManager = $objectManager; - } - - /** - * Find configuration options by extension - * - * @param string $extensionKey Extension key - * @return \SplObjectStorage - */ - public function findByExtensionKey($extensionKey) - { - $configurationArray = $this->getConfigurationArrayFromExtensionKey($extensionKey); - return $this->convertHierarchicArrayToObject($configurationArray); - } - - /** - * Converts the raw configuration file content to an configuration object storage - * - * @param string $extensionKey Extension key - * @return array - */ - protected function getConfigurationArrayFromExtensionKey($extensionKey) - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility */ - $configurationUtility = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $configuration = $configurationUtility->getCurrentConfiguration($extensionKey); - - $resultArray = []; - if (!empty($configuration)) { - $hierarchicConfiguration = []; - foreach ($configuration as $configurationOption) { - $originalConfiguration = $this->buildConfigurationArray($configurationOption, $extensionKey); - ArrayUtility::mergeRecursiveWithOverrule($originalConfiguration, $hierarchicConfiguration); - $hierarchicConfiguration = $originalConfiguration; - } - - // Flip category array as it was merged the other way around - $hierarchicConfiguration = array_reverse($hierarchicConfiguration); - - // Sort configurations of each subcategory - foreach ($hierarchicConfiguration as &$catConfigurationArray) { - foreach ($catConfigurationArray as &$subcatConfigurationArray) { - uasort($subcatConfigurationArray, function ($a, $b) { - return strnatcmp($a['subcat'], $b['subcat']); - }); - } - unset($subcatConfigurationArray); - } - unset($tempConfiguration); - $resultArray = $hierarchicConfiguration; - } - - return $resultArray; - } - - /** - * Builds a configuration array from each line (option) of the config file - * - * @param string $configurationOption config file line representing one setting - * @param string $extensionKey Extension key - * @return array - */ - protected function buildConfigurationArray($configurationOption, $extensionKey) - { - $hierarchicConfiguration = []; - if (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'user')) { - $configurationOption = $this->extractInformationForConfigFieldsOfTypeUser($configurationOption); - } elseif (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'options')) { - $configurationOption = $this->extractInformationForConfigFieldsOfTypeOptions($configurationOption); - } - if ($this->translate($configurationOption['label'], $extensionKey)) { - $configurationOption['label'] = $this->translate($configurationOption['label'], $extensionKey); - } - $configurationOption['labels'] = GeneralUtility::trimExplode(':', $configurationOption['label'], false, 2); - $configurationOption['subcat_name'] = $configurationOption['subcat_name'] ?: '__default'; - $hierarchicConfiguration[$configurationOption['cat']][$configurationOption['subcat_name']][$configurationOption['name']] = $configurationOption; - return $hierarchicConfiguration; - } - - /** - * Extracts additional information for fields of type "options" - * Extracts "type", "label" and values information - * - * @param array $configurationOption - * @return array - */ - protected function extractInformationForConfigFieldsOfTypeOptions(array $configurationOption) - { - preg_match('/options\[(.*)\]/is', $configurationOption['type'], $typeMatches); - $optionItems = GeneralUtility::trimExplode(',', $typeMatches[1]); - foreach ($optionItems as $optionItem) { - $optionPair = GeneralUtility::trimExplode('=', $optionItem); - if (count($optionPair) === 2) { - $configurationOption['generic'][$optionPair[0]] = $optionPair[1]; - } else { - $configurationOption['generic'][$optionPair[0]] = $optionPair[0]; - } - } - $configurationOption['type'] = 'options'; - return $configurationOption; - } - - /** - * Extract additional information for fields of type "user" - * Extracts "type" and the function to be called - * - * @param array $configurationOption - * @return array - */ - protected function extractInformationForConfigFieldsOfTypeUser(array $configurationOption) - { - preg_match('/user\\[(.*)\\]/is', $configurationOption['type'], $matches); - $configurationOption['generic'] = $matches[1]; - $configurationOption['type'] = 'user'; - return $configurationOption; - } - - /** - * Converts a hierarchic configuration array to an - * hierarchic object storage structure - * - * @param array $configuration - * @return \SplObjectStorage - */ - protected function convertHierarchicArrayToObject(array $configuration) - { - $configurationObjectStorage = new \SplObjectStorage(); - foreach ($configuration as $category => $subcategory) { - /** @var $configurationCategoryObject \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationCategory */ - $configurationCategoryObject = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationCategory::class); - $configurationCategoryObject->setName($category); - foreach ($subcategory as $subcatName => $configurationItems) { - /** @var $configurationSubcategoryObject \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory */ - $configurationSubcategoryObject = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationSubcategory::class); - $configurationSubcategoryObject->setName($subcatName); - foreach ($configurationItems as $configurationItem) { - // Set sub category label if configuration item contains a subcat label. - // The sub category label is set multiple times if there is more than one item - // in a sub category, but that is ok since all items of one sub category - // share the same label. - if (array_key_exists('subcat_label', $configurationItem)) { - $configurationSubcategoryObject->setLabel($configurationItem['subcat_label']); - } - - /** @var $configurationObject \TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem */ - $configurationObject = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem::class); - if (isset($configurationItem['generic'])) { - $configurationObject->setGeneric($configurationItem['generic']); - } - if (isset($configurationItem['cat'])) { - $configurationObject->setCategory($configurationItem['cat']); - } - if (isset($configurationItem['subcat_name'])) { - $configurationObject->setSubCategory($configurationItem['subcat_name']); - } - if (isset($configurationItem['labels']) && isset($configurationItem['labels'][0])) { - $configurationObject->setLabelHeadline($configurationItem['labels'][0]); - } - if (isset($configurationItem['labels']) && isset($configurationItem['labels'][1])) { - $configurationObject->setLabelText($configurationItem['labels'][1]); - } - if (isset($configurationItem['type'])) { - $configurationObject->setType($configurationItem['type']); - } - if (isset($configurationItem['name'])) { - $configurationObject->setName($configurationItem['name']); - } - if (isset($configurationItem['value'])) { - $configurationObject->setValue($configurationItem['value']); - } - $configurationSubcategoryObject->addItem($configurationObject); - } - $configurationCategoryObject->addSubcategory($configurationSubcategoryObject); - } - $configurationObjectStorage->attach($configurationCategoryObject); - } - return $configurationObjectStorage; - } - - /** - * Returns the localized label of the LOCAL_LANG key, $key. - * Wrapper for the static call. - * - * @param string $key The key from the LOCAL_LANG array for which to return the value. - * @param string $extensionName The name of the extension - * @return string|null The value from LOCAL_LANG or NULL if no translation was found. - */ - protected function translate($key, $extensionName) - { - $translation = \TYPO3\CMS\Extbase\Utility\LocalizationUtility::translate($key, $extensionName); - if ($translation) { - return $translation; - } - return null; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php index d15d62fd2d93..59a67593ba43 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/Connection/TerUtility.php @@ -14,7 +14,9 @@ namespace TYPO3\CMS\Extensionmanager\Utility\Connection; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Core\Bootstrap; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; /** @@ -29,19 +31,6 @@ class TerUtility */ public $wsdlUrl; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Fetches an extension from the given mirror * @@ -55,7 +44,7 @@ class TerUtility public function fetchExtension($extensionKey, $version, $expectedMd5, $mirrorUrl) { if ( - !empty($this->configurationUtility->getCurrentConfiguration('extensionmanager')['offlineMode']['value']) + (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode') || Bootstrap::usesComposerClassLoading() ) { throw new ExtensionManagerException('Extension Manager is in offline mode. No TER connection available.', 1437078620); diff --git a/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php b/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php index 091c8c7047e0..f335ec38f366 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/InstallUtility.php @@ -21,6 +21,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; use TYPO3\CMS\Impexp\Utility\ImportExportUtility; +use TYPO3\CMS\Install\Service\ExtensionConfigurationService; /** * Extension Manager Install Utility @@ -438,9 +439,8 @@ class InstallUtility implements \TYPO3\CMS\Core\SingletonInterface */ protected function saveDefaultConfiguration($extensionKey) { - /** @var $configUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility */ - $configUtility = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $configUtility->saveDefaultConfiguration($extensionKey); + $configUtility = $this->objectManager->get(ExtensionConfigurationService::class); + $configUtility->synchronizeExtConfTemplateWithLocalConfiguration($extensionKey); } /** diff --git a/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php b/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php index 6ef7248b2e57..6b21f0e92b08 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php +++ b/typo3/sysext/extensionmanager/Classes/Utility/Repository/Helper.php @@ -14,10 +14,10 @@ namespace TYPO3\CMS\Extensionmanager\Utility\Repository; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException; -use TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility; /** * Central utility class for repository handling. @@ -64,11 +64,6 @@ class Helper implements \TYPO3\CMS\Core\SingletonInterface */ protected $extensionRepository; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * Class constructor. * @@ -81,7 +76,6 @@ class Helper implements \TYPO3\CMS\Core\SingletonInterface /** @var \TYPO3\CMS\Extensionmanager\Domain\Repository\RepositoryRepository $repositoryRepository */ $repositoryRepository = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Repository\RepositoryRepository::class); $this->extensionRepository = $this->objectManager->get(\TYPO3\CMS\Extensionmanager\Domain\Repository\ExtensionRepository::class); - $this->configurationUtility = $this->objectManager->get(ConfigurationUtility::class); /** @var \TYPO3\CMS\Extensionmanager\Domain\Model\Repository $repository */ $repository = $repositoryRepository->findByUid(1); if (is_object($repository)) { @@ -142,7 +136,8 @@ class Helper implements \TYPO3\CMS\Core\SingletonInterface */ protected function fetchFile($remoteResource, $localResource) { - if ($this->configurationUtility->getCurrentConfiguration('extensionmanager')['offlineMode']['value']) { + $isOffline = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'offlineMode'); + if ($isOffline) { throw new ExtensionManagerException('Extension Manager is in offline mode. No TER connection available.', 1437078780); } if (is_string($remoteResource) && is_string($localResource) && !empty($remoteResource) && !empty($localResource)) { diff --git a/typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php b/typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php deleted file mode 100644 index 71ac2beb4d1c..000000000000 --- a/typo3/sysext/extensionmanager/Classes/ViewHelpers/ConfigureExtensionViewHelper.php +++ /dev/null @@ -1,78 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\ViewHelpers; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Core\Imaging\Icon; -use TYPO3\CMS\Core\Imaging\IconFactory; -use TYPO3\CMS\Core\Utility\GeneralUtility; -use TYPO3\CMS\Extbase\Utility\LocalizationUtility; - -/** - * View helper for configure extension link - * @internal - */ -class ConfigureExtensionViewHelper extends Link\ActionViewHelper -{ - /** - * Initialize arguments - */ - public function initializeArguments() - { - parent::initializeArguments(); - $this->registerArgument('extension', 'array', 'Extension configuration array with extension information', true); - $this->registerArgument('forceConfiguration', 'bool', 'If TRUE the content is only returned if a link could be generated', false, true); - $this->registerArgument('showDescription', 'bool', 'If TRUE the extension description is also shown in the title attribute', false, false); - } - - /** - * Renders a configure extension link if the extension has configuration options - * - * @return string the rendered tag or child nodes content - */ - public function render() - { - $extension = $this->arguments['extension']; - $forceConfiguration = $this->arguments['forceConfiguration']; - $showDescription = $this->arguments['showDescription']; - - $content = (string)$this->renderChildren(); - if ($extension['installed'] && file_exists(PATH_site . $extension['siteRelPath'] . 'ext_conf_template.txt')) { - $uriBuilder = $this->renderingContext->getControllerContext()->getUriBuilder(); - $action = 'showConfigurationForm'; - $uri = $uriBuilder->reset()->uriFor( - $action, - ['extension' => ['key' => $extension['key']]], - 'Configuration' - ); - if ($showDescription) { - $title = $extension['description'] . PHP_EOL . - LocalizationUtility::translate('extensionList.clickToConfigure', 'extensionmanager'); - } else { - $title = LocalizationUtility::translate('extensionList.configure', 'extensionmanager'); - } - $this->tag->addAttribute('href', $uri); - $this->tag->addAttribute('title', $title); - $this->tag->setContent($content); - $content = $this->tag->render(); - } elseif ($forceConfiguration) { - $iconFactory = GeneralUtility::makeInstance(IconFactory::class); - $content = '<span class="btn btn-default disabled">' . $iconFactory->getIcon('empty-empty', Icon::SIZE_SMALL)->render() . '</span>'; - } else { - $content = '<span title="' . htmlspecialchars($extension['description']) . '">' . $content . '</span>'; - } - - return $content; - } -} diff --git a/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php b/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php index 5c8a92bd6a8e..365a0a0044f9 100644 --- a/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php +++ b/typo3/sysext/extensionmanager/Classes/ViewHelpers/DownloadExtensionViewHelper.php @@ -14,6 +14,8 @@ namespace TYPO3\CMS\Extensionmanager\ViewHelpers; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Extbase\Utility\LocalizationUtility; use TYPO3\CMS\Extensionmanager\Domain\Model\Extension; @@ -28,11 +30,6 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\Abst */ protected $tagName = 'form'; - /** - * @var \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility - */ - protected $configurationUtility; - /** * @var \TYPO3\CMS\Extbase\Service\ExtensionService */ @@ -46,14 +43,6 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\Abst $this->extensionService = $extensionService; } - /** - * @param \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility - */ - public function injectConfigurationUtility(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility $configurationUtility) - { - $this->configurationUtility = $configurationUtility; - } - /** * Initialize arguments. */ @@ -99,7 +88,7 @@ class DownloadExtensionViewHelper extends \TYPO3\CMS\Fluid\ViewHelpers\Form\Abst ], 'Download'); $this->tag->addAttribute('data-href', $uri); - $automaticInstallation = $this->configurationUtility->getCurrentConfiguration('extensionmanager')['automaticInstallation']['value']; + $automaticInstallation = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('extensionmanager', 'automaticInstallation'); $labelKeySuffix = $automaticInstallation ? '' : '.downloadOnly'; $label = ' <div class="btn-group"> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf b/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf index 3abe4d56aad2..bd9433b58f64 100644 --- a/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf +++ b/typo3/sysext/extensionmanager/Resources/Private/Language/locallang.xlf @@ -27,45 +27,6 @@ <trans-unit id="showAllVersions"> <source>Show all versions of</source> </trans-unit> - <trans-unit id="extConfTemplate.headline"> - <source>Configure Extension</source> - </trans-unit> - <trans-unit id="extConfTemplate.other"> - <source>Other</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.int+"> - <source>positive integer</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.int"> - <source>integer</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.integer"> - <source>integer</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.color"> - <source>color</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.wrap"> - <source>wrap</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.offset"> - <source>offset</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.options"> - <source>options</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.boolean"> - <source>boolean</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.user"> - <source>user</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.small"> - <source>small</source> - </trans-unit> - <trans-unit id="extConfTemplate.type.string"> - <source>string</source> - </trans-unit> <trans-unit id="extConfTemplate.backToList"> <source>Back to list</source> </trans-unit> @@ -96,12 +57,6 @@ <trans-unit id="button.resolveDependenciesIgnore"> <source>I know what I'm doing, continue anyway</source> </trans-unit> - <trans-unit id="extensionList.clickToConfigure"> - <source>(Click to configure)</source> - </trans-unit> - <trans-unit id="extensionList.configure"> - <source>Configure</source> - </trans-unit> <trans-unit id="extensionList.update.script"> <source>Execute the update script</source> </trans-unit> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html b/typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html deleted file mode 100644 index cfcfe6f5b884..000000000000 --- a/typo3/sysext/extensionmanager/Resources/Private/Templates/Configuration/ShowConfigurationForm.html +++ /dev/null @@ -1,80 +0,0 @@ -{namespace em=TYPO3\CMS\Extensionmanager\ViewHelpers} - -<f:layout name="main" /> - -<f:section name="headline"> - <h1> - <f:translate key="extConfTemplate.headline" /> - {extension.key} - </h1> -</f:section> - -<f:section name="content"> - <div role="tabpanel"> - <ul class="nav nav-tabs" role="tablist"> - <f:for each="{configuration}" as="category" key="categoryNumber" iteration="iteration"> - <f:if condition="{category.name}"> - <li role="presentation" class="{f:if(condition:'{iteration.isFirst}', then:'active')}"> - <a class="text-capitalize" href="#category-{categoryNumber}" aria-controls="category-{categoryNumber}" role="tab" data-toggle="tab"> - {category.name} - </a> - </li> - </f:if> - </f:for> - </ul> - - <f:form action="save" name="configurationform" id="configurationform"> - <div class="tab-content"> - <f:form.hidden name="extensionKey" value="{extension.key}" /> - <f:for each="{configuration}" as="category" key="categoryNumber" iteration="iteration"> - <f:if condition="{category.name}"> - <div role="tabpanel" class="tab-pane {f:if(condition:'{iteration.isFirst}', then:'active')}" id="category-{categoryNumber}"> - <f:for each="{category.subcategories}" as="subcategory"> - <div class="form-section"> - <f:if condition="{subcategory.label}"> - <f:then> - <h2 class="h4 form-section-headline">{subcategory.label}</h2> - </f:then> - <f:else> - <f:if condition="{category.subcategories->f:count()} > 1"> - <h3 class="h4 form-section-headline"><f:translate key="extConfTemplate.other" /></h3> - </f:if> - </f:else> - </f:if> - <f:for each="{subcategory.items}" as="item"> - <div class="form-group form-group-dashed"> - <label for="em-{item.name}"> - {item.labelHeadline}<br> - <span class="text-monospace text-normal"> - {category.name}.{item.name} - <f:if condition="{item.type} != 'user'"> - <f:alias map="{label: '{f:translate(key: \'extConfTemplate.type.{item.type}\')}'}"> - <f:if condition="{label}"> - ({label}) - </f:if> - </f:alias> - </f:if> - </span> - </label> - <div class="form-control-wrap"> - <em:form.typoScriptConstants configuration="{item}" /> - </div> - <f:if condition="{item.labelText}"> - <div class="help-block">{item.labelText -> f:format.nl2br()}</div> - </f:if> - </div> - </f:for> - </div> - </f:for> - </div> - </f:if> - </f:for> - </div> - <f:comment> - In order to allow form submit on pressing enter, a submit button is needed. See #66846 - The submit button is hidden as long as the save buttons are not part of the form yet. - </f:comment> - <f:form.submit name="mySubmit" value="Go" class="hidden" /> - </f:form> - </div> -</f:section> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html b/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html index 803a34dfb014..f0e5a87c2c06 100644 --- a/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html +++ b/typo3/sysext/extensionmanager/Resources/Private/Templates/Distribution/Show.html @@ -25,20 +25,13 @@ </li> </f:else> <f:then> - <f:if condition="{configurationLink}"> - <li> - <a href="{configurationLink}" class="btn btn-default"> - <core:icon identifier="actions-system-extension-configure" /> <f:translate key="extensionList.configure" /> - </a> - </li> - </f:if> <li> <button class="btn btn-default distribution-openViewModule" onclick="top.goToModule('web_ViewpageView');"> <core:icon identifier="actions-document-view" /> <f:translate key="distribution.welcome.openViewModule" /> </button> </li> <li> - <button class="btn btn-default distribution-openPageModule" onclick="top.goToModule('web_page');"> + <button class="btn btn-default distribution-openPageModule" onclick="top.goToModule('web_layout');"> <core:icon identifier="actions-open" /> <f:translate key="distribution.welcome.openPageModule" /> </button> </li> diff --git a/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html b/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html index 68c60d37dbfc..088caf489b87 100644 --- a/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html +++ b/typo3/sysext/extensionmanager/Resources/Private/Templates/List/Index.html @@ -67,7 +67,7 @@ <f:if condition="{extension.ext_icon}"> <img class="ext-icon" src="../{extension.siteRelPath}{extension.ext_icon}" alt="{extension.title}" /> </f:if> - <em:configureExtension extension="{extension}" forceConfiguration="0" showDescription="1">{extension.title}</em:configureExtension> + <span title="{extension.description}">{extension.title}</span> </td> <td> {extensionKey} @@ -84,9 +84,6 @@ <td> <div class="btn-group"> <em:processAvailableActions extension="{extension}"> - <em:configureExtension class="btn btn-default" extension="{extension}" title="{f:translate(key:'extensionList.configure')}"> - <core:icon identifier="actions-system-extension-configure" /> - </em:configureExtension> <em:updateScript class="btn btn-default" extensionKey="{extension.key}" /> <em:removeExtension class="btn btn-default" extension="{extension}" /> <f:link.action action="downloadExtensionZip" controller="Action" arguments="{extension:extension.key}" title="{f:translate(key:'extensionList.downloadzip')}" class="btn btn-default"> diff --git a/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js b/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js index e455b9c14c6e..ade1fd321efd 100644 --- a/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js +++ b/typo3/sysext/extensionmanager/Resources/Public/JavaScript/Main.js @@ -295,79 +295,6 @@ define([ ); }; - /** - * configuration properties - */ - ExtensionManager.configurationFieldSupport = function() { - $('.t3js-emconf-offset').each(function() { - var $me = $(this), - $parent = $me.parent(), - id = $me.attr('id'), - val = $me.attr('value'), - valArr = val.split(','); - - $me.attr('data-offsetfield-x', '#' + id + '_offset_x') - .attr('data-offsetfield-y', '#' + id + '_offset_y') - .wrap('<div class="hidden"></div>'); - - var elementX = '' + - '<div class="form-multigroup-item">' + - '<div class="input-group">' + - '<div class="input-group-addon">x</div>' + - '<input id="' + id + '_offset_x" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + - '</div>' + - '</div>'; - var elementY = '' + - '<div class="form-multigroup-item">' + - '<div class="input-group">' + - '<div class="input-group-addon">y</div>' + - '<input id="' + id + '_offset_y" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + - '</div>' + - '</div>'; - - var offsetGroup = '<div class="form-multigroup-wrap">' + elementX + elementY + '</div>'; - $parent.append(offsetGroup); - $parent.find('.t3js-emconf-offset').keyup(function() { - var $target = $($(this).data('target')); - $target.attr( - 'value', - $($target.data('offsetfield-x')).val() + ',' + $($target.data('offsetfield-y')).val() - ); - }); - }); - - $('.t3js-emconf-wrap').each(function() { - var $me = $(this), - $parent = $me.parent(), - id = $me.attr('id'), - val = $me.attr('value'), - valArr = val.split('|'); - - $me.attr('data-wrapfield-start', '#' + id + '_wrap_start') - .attr('data-wrapfield-end', '#' + id + '_wrap_end') - .wrap('<div class="hidden"></div>'); - - var elementStart = '' + - '<div class="form-multigroup-item">' + - '<input id="' + id + '_wrap_start" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + - '</div>'; - var elementEnd = '' + - '<div class="form-multigroup-item">' + - '<input id="' + id + '_wrap_end" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + - '</div>'; - - var wrapGroup = '<div class="form-multigroup-wrap">' + elementStart + elementEnd + '</div>'; - $parent.append(wrapGroup); - $parent.find('.t3js-emconf-wrapfield').keyup(function() { - var $target = $($(this).data('target')); - $target.attr( - 'value', - $($target.data('wrapfield-start')).val() + '|' + $($target.data('wrapfield-end')).val() - ); - }); - }); - }; - /** * * @type {{downloadPath: string}} @@ -773,8 +700,6 @@ define([ NProgress.start(); }); - ExtensionManager.configurationFieldSupport(); - SplitButtons.addPreSubmitCallback(function(e) { if ($(e.target).hasClass('t3js-save-close')) { $('#configurationform').append($('<input />', {type: 'hidden', name: 'tx_extensionmanager_tools_extensionmanagerextensionmanager[action]', value: 'saveAndClose'})); diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php deleted file mode 100644 index e22dada937ca..000000000000 --- a/typo3/sysext/extensionmanager/Tests/Unit/Domain/Repository/ConfigurationItemRepositoryTest.php +++ /dev/null @@ -1,291 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Domain\Repository; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Extbase\Object\ObjectManager; - -/** - * Tests for ConfigurationItemRepository - */ -class ConfigurationItemRepositoryTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase -{ - /** - * @var \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $configurationItemRepository; - - /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $injectedObjectManagerMock; - - /** - * Set up - */ - protected function setUp() - { - // Mock system under test to make protected methods accessible - $this->configurationItemRepository = $this->getAccessibleMock( - \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository::class, - ['dummy'] - ); - - $this->injectedObjectManagerMock = $this->createMock(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface::class); - $this->configurationItemRepository->_set( - 'objectManager', - $this->injectedObjectManagerMock - ); - } - - /** - * @test - */ - public function getConfigurationArrayFromExtensionKeyReturnsSortedHierarchicArray() - { - $flatConfigurationItemArray = [ - 'item1' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/10z', - 'type' => 'string', - 'label' => 'Item 1: This is the first configuration item', - 'name' =>'item1', - 'value' => 'one', - 'default_value' => 'one', - 'subcat_label' => 'Enable features', - ], - 'integerValue' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/20z', - 'type' => 'int+', - 'label' => 'Integer Value: Please insert a positive integer value', - 'name' =>'integerValue', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Enable features', - ], - 'enableJquery' => [ - 'cat' => 'advanced', - 'subcat_name' => 'file', - 'subcat' => 'c/file/10z', - 'type' => 'boolean', - 'label' => 'enableJquery: Insert jQuery plugin', - 'name' =>'enableJquery', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Files', - ], - ]; - - $configurationItemRepository = $this->getAccessibleMock( - \TYPO3\CMS\Extensionmanager\Domain\Repository\ConfigurationItemRepository::class, - ['translate'] - ); - $configurationItemRepository->_set( - 'objectManager', - $this->injectedObjectManagerMock - ); - $configurationUtilityMock = $this->createMock(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class); - $configurationUtilityMock - ->expects($this->once()) - ->method('getCurrentConfiguration') - ->will($this->returnValue($flatConfigurationItemArray)); - - $this->injectedObjectManagerMock - ->expects($this->any()) - ->method('get') - ->will($this->returnValue($configurationUtilityMock)); - - $expectedArray = [ - 'basic' => [ - 'enable' => [ - 'item1' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/10z', - 'type' => 'string', - 'label' => 'Item 1: This is the first configuration item', - 'name' =>'item1', - 'value' => 'one', - 'default_value' => 'one', - 'subcat_label' => 'Enable features', - 'labels' => [ - 0 => 'Item 1', - 1 => 'This is the first configuration item' - ] - ], - 'integerValue' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/20z', - 'type' => 'int+', - 'label' => 'Integer Value: Please insert a positive integer value', - 'name' =>'integerValue', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Enable features', - 'labels' => [ - 0 => 'Integer Value', - 1 => 'Please insert a positive integer value' - ] - ] - ] - ], - 'advanced' => [ - 'file' => [ - 'enableJquery' => [ - 'cat' => 'advanced', - 'subcat_name' => 'file', - 'subcat' => 'c/file/10z', - 'type' => 'boolean', - 'label' => 'enableJquery: Insert jQuery plugin', - 'name' =>'enableJquery', - 'value' => '1', - 'default_value' => '1', - 'subcat_label' => 'Files', - 'labels' => [ - 0 => 'enableJquery', - 1 => 'Insert jQuery plugin' - ] - ], - ] - ] - ]; - - $this->assertSame( - $expectedArray, - $configurationItemRepository->_call('getConfigurationArrayFromExtensionKey', $this->getUniqueId('some_extension')) - ); - } - - /** - * @return array - */ - public function extractInformationForConfigFieldsOfTypeUserAddsGenericAndTypeInformationDataProvider() - { - return [ - [ - [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationFrontend]', - 'label' => 'Frontend configuration check', - 'name' => 'checkConfigurationFE', - 'value' => 0, - 'default_value' => 0, - 'comparisonGeneric' => 'TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationFrontend' - ] - ], - [ - [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationBackend]', - 'label' => 'Backend configuration check', - 'name' => 'checkConfigurationBE', - 'value' => 0, - 'default_value' => 0, - 'comparisonGeneric' => 'TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationBackend' - ] - ], - [ - [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->buildHashMethodSelectorFE]', - 'label' => 'Hashing method for the frontend: Defines salted hashing method to use. Choose "Portable PHP password hashing" to stay compatible with other CMS (e.g. Drupal, Wordpress). Choose "MD5 salted hashing" to reuse TYPO3 passwords for OS level authentication (other servers could use TYPO3 passwords). Choose "Blowfish salted hashing" for advanced security to reuse passwords on OS level (Blowfish might not be supported on your system TODO).', - 'name' => 'FE.saltedPWHashingMethod', - 'value' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'default_value' => \TYPO3\CMS\Saltedpasswords\Salt\PhpassSalt::class, - 'comparisonGeneric' => 'TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->buildHashMethodSelectorFE' - ] - ] - ]; - } - - /** - * @test - * @dataProvider extractInformationForConfigFieldsOfTypeUserAddsGenericAndTypeInformationDataProvider - * @param $configurationOption - */ - public function extractInformationForConfigFieldsOfTypeUserAddsGenericAndTypeInformation($configurationOption) - { - $configurationOptionModified = $this->configurationItemRepository->_callRef('extractInformationForConfigFieldsOfTypeUser', $configurationOption); - $this->assertEquals('user', $configurationOptionModified['type']); - $this->assertEquals($configurationOption['comparisonGeneric'], $configurationOptionModified['generic']); - } - - /** - * @test - */ - public function extractInformationForConfigFieldsOfTypeOptionsAddsGenericTypeAndLabelInformation() - { - $option = [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/100z', - 'type' => 'options[Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.),Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.),Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)]', - 'label' => 'Default configuration settings', - 'name' => 'defaultConfiguration', - 'value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'default_value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'genericComparisonValue' => [ - 'Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)' => 'Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)', - 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)' => 'Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)' - ], - 'typeComparisonValue' => 'options' - ]; - $optionModified = $this->configurationItemRepository->_callRef('extractInformationForConfigFieldsOfTypeOptions', $option); - $this->assertArrayHasKey('generic', $optionModified); - $this->assertArrayHasKey('type', $optionModified); - $this->assertArrayHasKey('label', $optionModified); - $this->assertEquals($option['genericComparisonValue'], $optionModified['generic']); - $this->assertEquals($option['typeComparisonValue'], $optionModified['type']); - } - - /** - * @test - */ - public function extractInformationForConfigFieldsOfTypeOptionsWithLabelsAndValuesAddsGenericTypeAndLabelInformation() - { - $option = [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/100z', - 'type' => 'options[Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)=MINIMAL,Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.) = TYPICAL,Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)=DEMO]', - 'label' => 'Default configuration settings', - 'name' => 'defaultConfiguration', - 'value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'default_value' => 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)', - 'genericComparisonValue' => [ - 'Minimal (Most features disabled. Administrator needs to enable them using TypoScript. For advanced administrators only.)' => 'MINIMAL', - 'Typical (Most commonly used features are enabled. Select this option if you are unsure which one to use.)' => 'TYPICAL', - 'Demo (Show-off configuration. Includes pre-configured styles. Not for production environments.)' => 'DEMO' - ], - 'typeComparisonValue' => 'options' - ]; - $optionModified = $this->configurationItemRepository->_callRef('extractInformationForConfigFieldsOfTypeOptions', $option); - $this->assertArrayHasKey('generic', $optionModified); - $this->assertArrayHasKey('type', $optionModified); - $this->assertArrayHasKey('label', $optionModified); - $this->assertEquals($option['genericComparisonValue'], $optionModified['generic']); - $this->assertEquals($option['typeComparisonValue'], $optionModified['type']); - } -} diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php b/typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php deleted file mode 100644 index c838ed6544df..000000000000 --- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/ConfigurationUtilityTest.php +++ /dev/null @@ -1,325 +0,0 @@ -<?php -namespace TYPO3\CMS\Extensionmanager\Tests\Unit\Utility; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility; - -/** - * Configuration utility test - */ -class ConfigurationUtilityTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase -{ - /** - * @test - */ - public function getCurrentConfigurationReturnsExtensionConfigurationAsValuedConfiguration() - { - /** @var $configurationUtility ConfigurationUtility|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject */ - $configurationUtility = $this->getMockBuilder(ConfigurationUtility::class) - ->setMethods(['getDefaultConfigurationFromExtConfTemplateAsValuedArray']) - ->getMock(); - $configurationUtility - ->expects($this->once()) - ->method('getDefaultConfigurationFromExtConfTemplateAsValuedArray') - ->will($this->returnValue([])); - $extensionKey = $this->getUniqueId('some-extension'); - - $currentConfiguration = [ - 'key1' => 'value1', - 'key2.' => [ - 'subkey1' => 'value2' - ] - ]; - - $expected = [ - 'key1' => [ - 'value' => 'value1', - ], - 'key2.subkey1' => [ - 'value' => 'value2', - ], - ]; - - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extensionKey] = serialize($currentConfiguration); - $actual = $configurationUtility->getCurrentConfiguration($extensionKey); - $this->assertEquals($expected, $actual); - } - - /** - * @test - */ - public function getCurrentConfigurationReturnsExtensionConfigurationWithExtconfBasedConfigurationPrioritized() - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject */ - $configurationUtility = $this->getMockBuilder(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class) - ->setMethods(['getDefaultConfigurationFromExtConfTemplateAsValuedArray']) - ->getMock(); - $configurationUtility - ->expects($this->once()) - ->method('getDefaultConfigurationFromExtConfTemplateAsValuedArray') - ->will($this->returnValue([])); - $extensionKey = $this->getUniqueId('some-extension'); - - $serializedConfiguration = [ - 'key1' => 'value1', - 'key2.' => [ - 'subkey1' => 'somevalue' - ] - ]; - $currentExtconfConfiguration = [ - 'key1' => 'value1', - 'key2.' => [ - 'subkey1' => 'overwritten' - ] - ]; - - $expected = [ - 'key1' => [ - 'value' => 'value1', - ], - 'key2.subkey1' => [ - 'value' => 'overwritten', - ], - ]; - - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extensionKey] = serialize($serializedConfiguration); - $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey] = $currentExtconfConfiguration; - $actual = $configurationUtility->getCurrentConfiguration($extensionKey); - $this->assertEquals($expected, $actual); - } - - /** - * @test - */ - public function mergeDefaultConfigurationReturnsEmptyArrayIfNoConfigurationForExtensionExists() - { - $configurationUtility = new ConfigurationUtility(); - $result = $configurationUtility->getCurrentConfiguration('not_existing_extension'); - self::assertSame([], $result); - } - - /** - * @test - */ - public function getDefaultConfigurationFromExtConfTemplateAsValuedArrayReturnsExpectedExampleArray() - { - /** @var $configurationUtility \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\TYPO3\TestingFramework\Core\AccessibleObjectInterface|\PHPUnit_Framework_MockObject_MockObject */ - $configurationUtility = $this->getAccessibleMock( - \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class, - ['getDefaultConfigurationRawString'] - ); - $configurationUtility - ->expects($this->once()) - ->method('getDefaultConfigurationRawString') - ->will($this->returnValue(file_get_contents(__DIR__ . '/Fixtures/ext_conf_template.txt'))); - - $objectManagerMock = $this->getMockBuilder(\TYPO3\CMS\Extbase\Object\ObjectManagerInterface::class)->getMock(); - $configurationUtility->_set('objectManager', $objectManagerMock); - - $expected = [ - 'checkConfigurationFE' => [ - 'cat' => 'basic', - 'subcat_name' => 'enable', - 'subcat' => 'a/enable/1z', - 'type' => 'user[TYPO3\\CMS\\Saltedpasswords\\Utility\\ExtensionManagerConfigurationUtility->checkConfigurationFrontend]', - 'label' => 'Frontend configuration check', - 'name' => 'checkConfigurationFE', - 'value' => '0', - 'default_value' => '0', - 'subcat_label' => 'Enable features', - ], - 'BE.forceSalted' => [ - 'cat' => 'backend', - 'subcat' => 'x/2z', - 'type' => 'boolean', - 'label' => 'Force salted passwords: Enforce usage of SaltedPasswords. Old MD5 hashed passwords will stop working.', - 'name' => 'BE.forceSalted', - 'value' => '0', - 'default_value' => '0', - ], - ]; - - $result = $configurationUtility->getDefaultConfigurationFromExtConfTemplateAsValuedArray($this->getUniqueId('some_extension')); - $this->assertEquals($expected, $result); - } - - /** - * Data provider for convertValuedToNestedConfiguration - * - * @return array - */ - public function convertValuedToNestedConfigurationDataProvider() - { - return [ - 'plain array' => [ - [ - 'first' => [ - 'value' => 'value1' - ], - 'second' => [ - 'value' => 'value2' - ] - ], - [ - 'first' => 'value1', - 'second' => 'value2' - ] - ], - 'nested value with 2 levels' => [ - [ - 'first.firstSub' => [ - 'value' => 'value1' - ], - 'second.secondSub' => [ - 'value' => 'value2' - ] - ], - [ - 'first.' => [ - 'firstSub' => 'value1' - ], - 'second.' => [ - 'secondSub' => 'value2' - ] - ] - ], - 'nested value with 3 levels' => [ - [ - 'first.firstSub.firstSubSub' => [ - 'value' => 'value1' - ], - 'second.secondSub.secondSubSub' => [ - 'value' => 'value2' - ] - ], - [ - 'first.' => [ - 'firstSub.' => [ - 'firstSubSub' => 'value1' - ] - ], - 'second.' => [ - 'secondSub.' => [ - 'secondSubSub' => 'value2' - ] - ] - ] - ], - 'mixed nested value with 2 levels' => [ - [ - 'first' => [ - 'value' => 'firstValue' - ], - 'first.firstSub' => [ - 'value' => 'value1' - ], - 'second.secondSub' => [ - 'value' => 'value2' - ] - ], - [ - 'first' => 'firstValue', - 'first.' => [ - 'firstSub' => 'value1' - ], - 'second.' => [ - 'secondSub' => 'value2' - ] - ] - ] - ]; - } - - /** - * @test - * @dataProvider convertValuedToNestedConfigurationDataProvider - * - * @param array $configuration - * @param array $expected - */ - public function convertValuedToNestedConfiguration(array $configuration, array $expected) - { - /** @var $subject \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface */ - $subject = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class, ['dummy'], [], '', false); - $this->assertEquals($expected, $subject->convertValuedToNestedConfiguration($configuration)); - } - - /** - * Data provider for convertNestedToValuedConfiguration - * - * @return array - */ - public function convertNestedToValuedConfigurationDataProvider() - { - return [ - 'plain array' => [ - [ - 'first' => 'value1', - 'second' => 'value2' - ], - [ - 'first' => ['value' => 'value1'], - 'second' => ['value' => 'value2'], - ] - ], - 'two levels' => [ - [ - 'first.' => ['firstSub' => 'value1'], - 'second.' => ['firstSub' => 'value2'], - ], - [ - 'first.firstSub' => ['value' => 'value1'], - 'second.firstSub' => ['value' => 'value2'], - ] - ], - 'three levels' => [ - [ - 'first.' => ['firstSub.' => ['firstSubSub' => 'value1']], - 'second.' => ['firstSub.' => ['firstSubSub' => 'value2']] - ], - [ - 'first.firstSub.firstSubSub' => ['value' => 'value1'], - 'second.firstSub.firstSubSub' => ['value' => 'value2'], - ] - ], - 'mixed' => [ - [ - 'first.' => ['firstSub' => 'value1'], - 'second.' => ['firstSub.' => ['firstSubSub' => 'value2']], - 'third' => 'value3' - ], - [ - 'first.firstSub' => ['value' => 'value1'], - 'second.firstSub.firstSubSub' => ['value' => 'value2'], - 'third' => ['value' => 'value3'] - ] - ] - ]; - } - - /** - * @test - * @dataProvider convertNestedToValuedConfigurationDataProvider - * - * @param array $configuration - * @param array $expected - */ - public function convertNestedToValuedConfiguration(array $configuration, array $expected) - { - /** @var $subject \TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility|\PHPUnit_Framework_MockObject_MockObject|\TYPO3\TestingFramework\Core\AccessibleObjectInterface */ - $subject = $this->getAccessibleMock(\TYPO3\CMS\Extensionmanager\Utility\ConfigurationUtility::class, ['dummy'], [], '', false); - $this->assertEquals($expected, $subject->convertNestedToValuedConfiguration($configuration)); - } -} diff --git a/typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt b/typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt deleted file mode 100644 index 1d8ab7160d78..000000000000 --- a/typo3/sysext/extensionmanager/Tests/Unit/Utility/Fixtures/ext_conf_template.txt +++ /dev/null @@ -1,5 +0,0 @@ -# cat=Basic/enable; type=user[TYPO3\CMS\Saltedpasswords\Utility\ExtensionManagerConfigurationUtility->checkConfigurationFrontend]; label=Frontend configuration check -checkConfigurationFE=0 - -# cat=Backend; type=boolean; label=Force salted passwords: Enforce usage of SaltedPasswords. Old MD5 hashed passwords will stop working. -BE.forceSalted = 0 diff --git a/typo3/sysext/extensionmanager/ext_localconf.php b/typo3/sysext/extensionmanager/ext_localconf.php index e7242e2151c4..6fff4aab1cf7 100644 --- a/typo3/sysext/extensionmanager/ext_localconf.php +++ b/typo3/sysext/extensionmanager/ext_localconf.php @@ -2,8 +2,10 @@ defined('TYPO3_MODE') or die(); // Register extension list update task -$extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['extensionmanager'], ['allowed_classes' => false]); -if (empty($extConf['offlineMode'])) { +$offlineMode = (bool)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class +)->get('extensionmanager', 'offlineMode'); +if (!$offlineMode) { $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Extensionmanager\Task\UpdateExtensionListTask::class] = [ 'extension' => 'extensionmanager', 'title' => 'LLL:EXT:extensionmanager/Resources/Private/Language/locallang.xlf:task.updateExtensionListTask.name', @@ -11,6 +13,7 @@ if (empty($extConf['offlineMode'])) { 'additionalFields' => '', ]; } +unset($offlineMode); $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['extbase']['commandControllers'][] = \TYPO3\CMS\Extensionmanager\Command\ExtensionCommandController::class; @@ -37,8 +40,6 @@ if (TYPO3_REQUESTTYPE & TYPO3_REQUESTTYPE_BE) { unset($signalSlotDispatcher); } -unset($extConf); - // Register extension status report system $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['reports']['tx_reports']['status']['providers']['Extension Manager'][] = \TYPO3\CMS\Extensionmanager\Report\ExtensionStatus::class; diff --git a/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php b/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php index a9bc64978fb1..9cbab0a8c2a4 100644 --- a/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php +++ b/typo3/sysext/indexed_search/Classes/Controller/AdministrationController.php @@ -16,6 +16,7 @@ namespace TYPO3\CMS\IndexedSearch\Controller; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Backend\View\BackendTemplateView; use TYPO3\CMS\Core\Authentication\BackendUserAuthentication; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Imaging\Icon; use TYPO3\CMS\Core\Localization\LanguageService; @@ -150,7 +151,7 @@ class AdministrationController extends ActionController public function initializeAction() { $this->pageUid = (int)GeneralUtility::_GET('id'); - $this->indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $this->indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); $this->enableMetaphoneSearch = (bool)$this->indexerConfig['enableMetaphoneSearch']; $this->indexer = GeneralUtility::makeInstance(Indexer::class); diff --git a/typo3/sysext/indexed_search/Classes/Controller/SearchController.php b/typo3/sysext/indexed_search/Classes/Controller/SearchController.php index fbe71c38e7d2..167980cacb09 100644 --- a/typo3/sysext/indexed_search/Classes/Controller/SearchController.php +++ b/typo3/sysext/indexed_search/Classes/Controller/SearchController.php @@ -15,6 +15,7 @@ namespace TYPO3\CMS\IndexedSearch\Controller; */ use TYPO3\CMS\Core\Charset\CharsetConverter; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\Restriction\FrontendRestrictionContainer; @@ -134,7 +135,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle protected $iconFileNameCache = []; /** - * Indexer configuration, coming from $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'] + * Indexer configuration, coming from TYPO3's system configuration for EXT:indexed_search * * @var array */ @@ -198,7 +199,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle $searchData = array_merge($this->settings['defaultOptions'], $searchData); } // Indexer configuration from Extension Manager interface: - $this->indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $this->indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); $this->enableMetaphoneSearch = (bool)$this->indexerConfig['enableMetaphoneSearch']; $this->initializeExternalParsers(); // If "_sections" is set, this value overrides any existing value. diff --git a/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php b/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php index bec21d01e819..e3ffce7df85a 100644 --- a/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php +++ b/typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php @@ -15,6 +15,7 @@ namespace TYPO3\CMS\IndexedSearch\Domain\Repository; */ use Doctrine\DBAL\Driver\Statement; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\QueryHelper; @@ -208,20 +209,12 @@ class IndexSearchRepository */ public function doSearch($searchWords, $freeIndexUid = -1) { - // unserializing the configuration so we can use it here: - $extConf = []; - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'])) { - $extConf = unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], - ['allowed_classes' => false] - ); - } - + $useMysqlFulltext = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search', 'useMysqlFulltext'); // Getting SQL result pointer: $this->getTimeTracker()->push('Searching result'); if ($hookObj = &$this->hookRequest('getResultRows_SQLpointer')) { $result = $hookObj->getResultRows_SQLpointer($searchWords, $freeIndexUid); - } elseif (isset($extConf['useMysqlFulltext']) && $extConf['useMysqlFulltext'] === '1') { + } elseif ($useMysqlFulltext) { $result = $this->getResultRows_SQLpointerMysqlFulltext($searchWords, $freeIndexUid); } else { $result = $this->getResultRows_SQLpointer($searchWords, $freeIndexUid); diff --git a/typo3/sysext/indexed_search/Classes/FileContentParser.php b/typo3/sysext/indexed_search/Classes/FileContentParser.php index d31e2a83ab29..31c75e953cab 100644 --- a/typo3/sysext/indexed_search/Classes/FileContentParser.php +++ b/typo3/sysext/indexed_search/Classes/FileContentParser.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\IndexedSearch; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Utility\CommandUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; @@ -76,7 +77,7 @@ class FileContentParser public function initParser($extension) { // Then read indexer-config and set if appropriate: - $indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); // If windows, apply extension to tool name: $exe = TYPO3_OS === 'WIN' ? '.exe' : ''; // lg @@ -288,7 +289,7 @@ class FileContentParser public function searchTypeMediaTitle($extension) { // Read indexer-config - $indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); // Ignore extensions $ignoreExtensions = GeneralUtility::trimExplode(',', strtolower($indexerConfig['ignoreExtensions']), true); if (in_array($extension, $ignoreExtensions)) { diff --git a/typo3/sysext/indexed_search/Classes/Indexer.php b/typo3/sysext/indexed_search/Classes/Indexer.php index 57c0dbc75183..f4afc54d62c8 100644 --- a/typo3/sysext/indexed_search/Classes/Indexer.php +++ b/typo3/sysext/indexed_search/Classes/Indexer.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\IndexedSearch; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\TimeTracker\TimeTracker; @@ -133,7 +134,7 @@ class Indexer public $indexerConfig = []; /** - * Indexer configuration, coming from $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'] + * Indexer configuration, coming from TYPO3's system configuration for EXT:indexed_search * * @var array */ @@ -251,7 +252,7 @@ class Indexer public function hook_indexContent(&$pObj) { // Indexer configuration from Extension Manager interface: - $indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $disableFrontendIndexing = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search', 'disableFrontendIndexing'); // Crawler activation: // Requirements are that the crawler is loaded, a crawler session is running and re-indexing requested as processing instruction: if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('crawler') && $pObj->applicationData['tx_crawler']['running'] && in_array('tx_indexedsearch_reindex', $pObj->applicationData['tx_crawler']['parameters']['procInstructions'])) { @@ -265,7 +266,7 @@ class Indexer // Determine if page should be indexed, and if so, configure and initialize indexer if ($pObj->config['config']['index_enable']) { $this->log_push('Index page', ''); - if (!$indexerConfig['disableFrontendIndexing'] || $this->crawlerActive) { + if (!$disableFrontendIndexing || $this->crawlerActive) { if (!$pObj->page['no_search']) { if (!$pObj->no_cache) { if ((int)$pObj->sys_language_uid === (int)$pObj->sys_language_content) { @@ -469,7 +470,7 @@ class Indexer // Setting phash / phash_grouping which identifies the indexed page based on some of these variables: $this->setT3Hashes(); // Indexer configuration from Extension Manager interface: - $this->indexerConfig = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], ['allowed_classes' => false]); + $this->indexerConfig = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search'); $this->tstamp_minAge = MathUtility::forceIntegerInRange($this->indexerConfig['minAge'] * 3600, 0); $this->tstamp_maxAge = MathUtility::forceIntegerInRange($this->indexerConfig['maxAge'] * 3600, 0); $this->maxExternalFiles = MathUtility::forceIntegerInRange($this->indexerConfig['maxExternalFiles'], 0, 1000, 5); diff --git a/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php b/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php index 21ce31ea8ffd..9f798ca72b2f 100644 --- a/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php +++ b/typo3/sysext/indexed_search/Classes/Service/DatabaseSchemaService.php @@ -13,6 +13,8 @@ namespace TYPO3\CMS\IndexedSearch\Service; * * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** * This service provides the mysql specific changes of the schema definition @@ -28,16 +30,8 @@ class DatabaseSchemaService */ public function addMysqlFulltextIndex(array $sqlString) { - // Check again if the extension flag is enabled to be on the safe side - // even if the slot registration is moved around in ext_localconf - $extConf = []; - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'])) { - $extConf = unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], - ['allowed_classes' => false] - ); - } - if (isset($extConf['useMysqlFulltext']) && $extConf['useMysqlFulltext'] === '1') { + $useMysqlFulltext = (bool)GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('indexed_search', 'useMysqlFulltext'); + if ($useMysqlFulltext) { // @todo: With MySQL 5.7 fulltext index on InnoDB is possible, check for that and keep inno if so. $sqlString[] = 'CREATE TABLE index_fulltext (' . LF . 'fulltextdata mediumtext,' diff --git a/typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php b/typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php deleted file mode 100644 index 56648fbc9fe6..000000000000 --- a/typo3/sysext/indexed_search/Tests/Functional/Tca/IndexConfigVisibleFieldsTest.php +++ /dev/null @@ -1,116 +0,0 @@ -<?php -namespace TYPO3\CMS\IndexedSearch\Tests\Functional\Tca; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -use TYPO3\CMS\Backend\Tests\Functional\Form\FormTestService; -use TYPO3\CMS\Core\Localization\LanguageService; -use TYPO3\CMS\Core\Utility\GeneralUtility; - -class IndexConfigVisibleFieldsTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTestCase -{ - protected static $commonIndexConfigFields = [ - 'title', - 'starttime', - 'hidden', - 'description', - 'timer_next_indexing', - 'timer_offset', - 'timer_frequency', - 'type', - ]; - - protected static $indexConfigFieldsByType = [ - '0' => [], - '1' => [ - 'table2index', - 'alternative_source_pid', - 'fieldlist', - 'get_params', - 'chashcalc', - 'recordsbatch', - 'records_indexonchange', - ], - '2' => [ - 'filepath', - 'extensions', - 'depth', - ], - '3' => [ - 'externalUrl', - 'depth', - 'url_deny', - ], - '4' => [ - 'alternative_source_pid', - 'depth', - ], - ]; - - protected static $metaIndexConfigFields = [ - 'title', - 'description', - 'type', - 'indexcfgs', - ]; - - protected $coreExtensionsToLoad = ['indexed_search']; - - /** - * @test - */ - public function indexConfigFormContainsExpectedFields() - { - $this->setUpBackendUserFromFixture(1); - $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class); - - $formEngineTestService = GeneralUtility::makeInstance(FormTestService::class); - - foreach (static::$indexConfigFieldsByType as $type => $additionalFields) { - $formResult = $formEngineTestService->createNewRecordForm('index_config', ['type' => $type]); - $expectedFields = array_merge(static::$commonIndexConfigFields, $additionalFields); - - foreach ($expectedFields as $expectedField) { - $this->assertNotFalse( - $formEngineTestService->formHtmlContainsField($expectedField, $formResult['html']), - 'The field ' . $expectedField . ' is not in the form HTML for index type ' . $type - ); - } - - $this->assertNotFalse( - strpos($formResult['html'], 'Session ID'), - 'The field Session ID is not in the form HTML' - ); - } - } - - /** - * @test - */ - public function indexConfigFormContainsExpectedFieldsForMetaConfiguration() - { - $this->setUpBackendUserFromFixture(1); - $GLOBALS['LANG'] = GeneralUtility::makeInstance(LanguageService::class); - - $formEngineTestService = GeneralUtility::makeInstance(FormTestService::class); - $formResult = $formEngineTestService->createNewRecordForm('index_config', ['type' => '5']); - - foreach (static::$metaIndexConfigFields as $expectedField) { - $this->assertNotFalse( - $formEngineTestService->formHtmlContainsField($expectedField, $formResult['html']), - 'The field ' . $expectedField . ' is not in the form HTML for index type ' . $type - ); - } - } -} diff --git a/typo3/sysext/indexed_search/ext_localconf.php b/typo3/sysext/indexed_search/ext_localconf.php index 2e34627a8c93..4bff46a4e9ea 100644 --- a/typo3/sysext/indexed_search/ext_localconf.php +++ b/typo3/sysext/indexed_search/ext_localconf.php @@ -44,16 +44,11 @@ $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['indexed_search']['external_parsers'] = [ 'tif' => \TYPO3\CMS\IndexedSearch\FileContentParser::class ]; -// unserializing the configuration so we can use it here: -$extConf = []; -if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'])) { - $extConf = unserialize( - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['indexed_search'], - ['allowed_classes' => false] - ); -} +$extConf = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class +)->get('indexed_search'); -if (isset($extConf['useMysqlFulltext']) && $extConf['useMysqlFulltext'] === '1') { +if (isset($extConf['useMysqlFulltext']) && (bool)$extConf['useMysqlFulltext']) { // Use all index_* tables except "index_rel" and "index_words" $GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['indexed_search']['use_tables'] = 'index_phash,index_fulltext,index_section,index_grlist,index_stat_search,index_stat_word,index_debug,index_config'; diff --git a/typo3/sysext/install/Classes/Controller/LayoutController.php b/typo3/sysext/install/Classes/Controller/LayoutController.php index 952332545a1e..7dd54bba3f1c 100644 --- a/typo3/sysext/install/Classes/Controller/LayoutController.php +++ b/typo3/sysext/install/Classes/Controller/LayoutController.php @@ -17,9 +17,11 @@ namespace TYPO3\CMS\Install\Controller; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; +use TYPO3\CMS\Core\Configuration\ConfigurationManager; use TYPO3\CMS\Core\Http\HtmlResponse; use TYPO3\CMS\Core\Http\JsonResponse; use TYPO3\CMS\Install\Service\Exception\ConfigurationChangedException; +use TYPO3\CMS\Install\Service\ExtensionConfigurationService; use TYPO3\CMS\Install\Service\SilentConfigurationUpgradeService; /** @@ -57,7 +59,8 @@ class LayoutController extends AbstractController /** * Return a json response with the main HTML layout body: Toolbar, main menu and - * doc header in standalone, doc header only in backend context. + * doc header in standalone, doc header only in backend context. Silent updaters + * are executed before this main view is loaded. * * @param ServerRequestInterface $request * @return ResponseInterface @@ -89,4 +92,68 @@ class LayoutController extends AbstractController 'success' => $success, ]); } + + /** + * Legacy ajax call. This silent updater takes care that all extensions configured in LocalConfiguration + * EXT/extConf serialized array are "upmerged" to arrays within EXTENSIONS if this extension does not + * exist in EXTENSIONS yet. + * + * @return ResponseInterface + * @deprecated since core v9, will be removed with core v10 + */ + public function executeSilentLegacyExtConfExtensionConfigurationUpdateAction(): ResponseInterface + { + $configurationManager = new ConfigurationManager(); + $oldExtConfSettings = $configurationManager->getConfigurationValueByPath('EXT/extConf'); + $newExtensionSettings = $configurationManager->getConfigurationValueByPath('EXTENSIONS'); + foreach ($oldExtConfSettings as $extensionName => $extensionSettings) { + if (!array_key_exists($extensionName, $newExtensionSettings)) { + $newExtensionSettings = $this->removeDotsFromArrayKeysRecursive(unserialize($extensionSettings, ['allowed_classes' => false])); + $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extensionName, $newExtensionSettings); + } + } + return new JsonResponse([ + 'success' => true, + ]); + } + + /** + * Synchronize TYPO3_CONF_VARS['EXTENSIONS'] with possibly new defaults from extensions + * ext_conf_template.txt files. This make LocalConfiguration the only source of truth for + * extension configuration and it is always up to date, also if an extension has been + * updated. + * + * @return ResponseInterface + */ + public function executeSilentExtensionConfigurationSynchronizationAction(): ResponseInterface + { + $extensionConfigurationService = new ExtensionConfigurationService(); + $extensionConfigurationService->synchronizeExtConfTemplateWithLocalConfigurationOfAllExtensions(); + return new JsonResponse([ + 'success' => true, + ]); + } + + /** + * Helper method for executeSilentLegacyExtConfExtensionConfigurationUpdateAction(). Old EXT/extConf + * settings have dots at the end of array keys if nested arrays were used. The new configuration does + * not use this funny nested representation anymore. The method removes all dots at the end of given + * array keys recursive to do this transition. + * + * @param array $settings + * @return array New settings + * @deprecated since core v9, will be removed with core v10 along with executeSilentLegacyExtConfExtensionConfigurationUpdateAction() + */ + private function removeDotsFromArrayKeysRecursive(array $settings): array + { + $settingsWithoutDots = []; + foreach ($settings as $key => $value) { + if (is_array($value)) { + $settingsWithoutDots[rtrim($key, '.')] = $this->removeDotsFromArrayKeysRecursive($value); + } else { + $settingsWithoutDots[$key] = $value; + } + } + return $settingsWithoutDots; + } } diff --git a/typo3/sysext/install/Classes/Controller/SettingsController.php b/typo3/sysext/install/Classes/Controller/SettingsController.php index 35d4292e993e..f24a84edf108 100644 --- a/typo3/sysext/install/Classes/Controller/SettingsController.php +++ b/typo3/sysext/install/Classes/Controller/SettingsController.php @@ -18,6 +18,8 @@ namespace TYPO3\CMS\Install\Controller; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use TYPO3\CMS\Core\Configuration\ConfigurationManager; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Core\Bootstrap; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\FormProtection\FormProtectionFactory; @@ -25,9 +27,12 @@ use TYPO3\CMS\Core\FormProtection\InstallToolFormProtection; use TYPO3\CMS\Core\Http\JsonResponse; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Messaging\FlashMessageQueue; +use TYPO3\CMS\Core\Package\PackageManager; +use TYPO3\CMS\Core\Utility\ArrayUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\MathUtility; use TYPO3\CMS\Install\Configuration\FeatureManager; +use TYPO3\CMS\Install\Service\ExtensionConfigurationService; use TYPO3\CMS\Install\Service\LocalConfigurationValueService; use TYPO3\CMS\Saltedpasswords\Salt\SaltFactory; @@ -308,4 +313,65 @@ class SettingsController extends AbstractController 'status' => $messages, ]); } + + /** + * Render a list of extensions with their configuration form. + * + * @param ServerRequestInterface $request + * @return ResponseInterface + */ + public function extensionConfigurationGetContentAction(ServerRequestInterface $request): ResponseInterface + { + // Extension configuration needs initialized $GLOBALS['LANG'] + Bootstrap::getInstance()->initializeLanguageObject(); + $extensionConfigurationService = new ExtensionConfigurationService(); + $extensionsWithConfigurations = []; + $activePackages = GeneralUtility::makeInstance(PackageManager::class)->getActivePackages(); + foreach ($activePackages as $extensionKey => $activePackage) { + if (@file_exists($activePackage->getPackagePath() . 'ext_conf_template.txt')) { + $extensionsWithConfigurations[$extensionKey] = [ + 'packageInfo' => $activePackage, + 'configuration' => $extensionConfigurationService->getConfigurationPreparedForView($extensionKey), + ]; + } + } + $formProtection = FormProtectionFactory::get(InstallToolFormProtection::class); + $view = $this->initializeStandaloneView($request, 'Settings/ExtensionConfigurationGetContent.html'); + $view->assignMultiple([ + 'extensionsWithConfigurations' => $extensionsWithConfigurations, + 'extensionConfigurationWriteToken' => $formProtection->generateToken('installTool', 'extensionConfigurationWrite'), + ]); + return new JsonResponse([ + 'success' => true, + 'html' => $view->render(), + ]); + } + + /** + * Write extension configuration + * + * @param ServerRequestInterface $request + * @return ResponseInterface + */ + public function extensionConfigurationWriteAction(ServerRequestInterface $request): ResponseInterface + { + $extensionKey = $request->getParsedBody()['install']['extensionKey']; + $configuration = $request->getParsedBody()['install']['extensionConfiguration']; + $nestedConfiguration = []; + foreach ($configuration as $configKey => $value) { + $nestedConfiguration = ArrayUtility::setValueByPath($nestedConfiguration, $configKey, $value, '.'); + } + (new ExtensionConfiguration())->set($extensionKey, '', $nestedConfiguration); + $messages = [ + new FlashMessage( + '', + 'Successfully saved configuration for extension "' . $extensionKey . '"', + FlashMessage::OK + ) + ]; + return new JsonResponse([ + 'success' => true, + 'status' => $messages, + ]); + } } diff --git a/typo3/sysext/extensionmanager/Classes/Utility/ConfigurationUtility.php b/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php similarity index 61% rename from typo3/sysext/extensionmanager/Classes/Utility/ConfigurationUtility.php rename to typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php index 7c8081d0a4a3..2fb31246f39a 100644 --- a/typo3/sysext/extensionmanager/Classes/Utility/ConfigurationUtility.php +++ b/typo3/sysext/install/Classes/Service/ExtensionConfigurationService.php @@ -1,5 +1,6 @@ <?php -namespace TYPO3\CMS\Extensionmanager\Utility; +declare(strict_types=1); +namespace TYPO3\CMS\Install\Service; /* * This file is part of the TYPO3 CMS project. @@ -14,44 +15,61 @@ namespace TYPO3\CMS\Extensionmanager\Utility; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationExtensionNotConfiguredException; +use TYPO3\CMS\Core\Configuration\Exception\ExtensionConfigurationPathDoesNotExistException; +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Package\PackageManager; use TYPO3\CMS\Core\Utility\ArrayUtility; -use TYPO3\CMS\Lang\LanguageService; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** - * Utility for dealing with ext_emconf and ext_conf_template settings + * Utility for dealing with ext_conf_template settings and their instance + * specific LocalConfiguration settings. This class is @internal and only + * used by extension manager and install tool itself. + * + * Extension authors should use TYPO3\CMS\Core\Configuration\ExtensionConfiguration + * class to get() and set() extension configuration settings. + * + * @internal */ -class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface +class ExtensionConfigurationService { /** - * TypoScript hierarchy being build during parsing. + * TypoScript hierarchy being build. + * Used parsing ext_conf_template.txt * * @var array */ protected $setup = []; /** - * Raw data, the input string exploded by LF + * Raw data, the input string exploded by LF. + * Used parsing ext_conf_template.txt * * @var array */ protected $raw; /** - * Pointer to entry in raw data array + * Pointer to entry in raw data array. + * Used parsing ext_conf_template.txt * * @var int */ - protected $rawP = 0; + protected $rawPointer = 0; /** * Holding the value of the last comment + * Used parsing ext_conf_template.txt * * @var string */ protected $lastComment = ''; /** - * Internally set, used as internal flag to create a multi-line comment (one of those like /* ... * / + * Internal flag to create a multi-line comment (one of those like /* ... * /) + * Used parsing ext_conf_template.txt * * @var bool */ @@ -59,6 +77,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface /** * Internally set, when in brace. Counter. + * Used parsing ext_conf_template.txt * * @var int */ @@ -66,6 +85,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface /** * This will be filled with the available categories of the current template. + * Used parsing ext_conf_template.txt * * @var array */ @@ -99,75 +119,183 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface ]; /** - * @var \TYPO3\CMS\Extbase\Object\ObjectManager + * If there are new config settings in ext_conf_template of an extenison, + * they are found here and synchronized to LocalConfiguration['EXTENSIONS']. + * + * Used when entering the install tool and during installation. */ - protected $objectManager; + public function synchronizeExtConfTemplateWithLocalConfigurationOfAllExtensions() + { + $activePackages = GeneralUtility::makeInstance(PackageManager::class)->getActivePackages(); + foreach ($activePackages as $package) { + $this->synchronizeExtConfTemplateWithLocalConfiguration($package->getPackageKey()); + } + } /** - * @param \TYPO3\CMS\Extbase\Object\ObjectManager $objectManager + * Read values from ext_conf_template, verify if they are in LocalConfiguration.php + * already and if not, add them. + * + * Used public by extension manager when updating extension + * + * @param string $extensionKey The extension to sync */ - public function injectObjectManager(\TYPO3\CMS\Extbase\Object\ObjectManager $objectManager) + public function synchronizeExtConfTemplateWithLocalConfiguration(string $extensionKey) { - $this->objectManager = $objectManager; + $package = GeneralUtility::makeInstance(PackageManager::class)->getPackage($extensionKey); + if (!@is_file($package->getPackagePath() . 'ext_conf_template.txt')) { + return; + } + $extensionConfiguration = new ExtensionConfiguration(); + try { + $currentLocalConfiguration = $extensionConfiguration->get($extensionKey); + } catch (ExtensionConfigurationExtensionNotConfiguredException $e) { + $currentLocalConfiguration = []; + } + $extConfTemplateConfiguration = $this->getExtConfTablesWithoutCommentsAsNestedArrayWithoutDots($extensionKey); + ArrayUtility::mergeRecursiveWithOverrule($extConfTemplateConfiguration, $currentLocalConfiguration); + $extensionConfiguration->set($extensionKey, '', $extConfTemplateConfiguration); } /** - * Get default configuration from ext_conf_template of an extension - * and save as initial configuration to LocalConfiguration ['EXT']['extConf']. - * - * Used by the InstallUtility to initialize local extension config. + * Compiles ext_conf_template file and merges it with values from LocalConfiguration['EXTENSIONS']. + * Returns a funny array used to display the configuration form in the install tool. * * @param string $extensionKey Extension key + * @return array */ - public function saveDefaultConfiguration($extensionKey) + public function getConfigurationPreparedForView(string $extensionKey): array { - $currentConfiguration = $this->getCurrentConfiguration($extensionKey); - $nestedConfiguration = $this->convertValuedToNestedConfiguration($currentConfiguration); - $this->writeConfiguration($nestedConfiguration, $extensionKey); + $package = GeneralUtility::makeInstance(PackageManager::class)->getPackage($extensionKey); + if (!@is_file($package->getPackagePath() . 'ext_conf_template.txt')) { + return []; + } + $extensionConfiguration = new ExtensionConfiguration(); + $configuration = $this->getDefaultConfigurationFromExtConfTemplateAsValuedArray($extensionKey); + foreach ($configuration as $configurationPath => &$details) { + try { + $valueFromLocalConfiguration = $extensionConfiguration->get($extensionKey, str_replace('.', '/', $configurationPath)); + $details['value'] = $valueFromLocalConfiguration; + } catch (ExtensionConfigurationPathDoesNotExistException $e) { + // Deliberately empty - it can happen at runtime that a written config does not return + // back all values (eg. saltedpassword with its userFuncs), which then miss in the written + // configuration and are only synced after next install tool run. This edge case is + // taken care off here. + } + } + $resultArray = []; + if (!empty($configuration)) { + $hierarchicConfiguration = []; + foreach ($configuration as $configurationOption) { + $originalConfiguration = $this->buildConfigurationArray($configurationOption); + ArrayUtility::mergeRecursiveWithOverrule($originalConfiguration, $hierarchicConfiguration); + $hierarchicConfiguration = $originalConfiguration; + } + // Flip category array as it was merged the other way around + $hierarchicConfiguration = array_reverse($hierarchicConfiguration); + // Sort configurations of each subcategory + foreach ($hierarchicConfiguration as &$catConfigurationArray) { + foreach ($catConfigurationArray as &$subcatConfigurationArray) { + uasort($subcatConfigurationArray, function ($a, $b) { + return strnatcmp($a['subcat'], $b['subcat']); + }); + } + unset($subcatConfigurationArray); + } + unset($tempConfiguration); + $resultArray = $hierarchicConfiguration; + } + return $resultArray; } /** - * Writes extension specific configuration to LocalConfiguration file - * in array ['EXT']['extConf'][$extensionKey]. - * - * Removes core cache files afterwards. - * - * This low level method expects a nested configuration array that - * was already merged with default configuration and maybe new form values. - * - * @param array $configuration Configuration to save - * @param string $extensionKey Extension key + * Poor man version of getDefaultConfigurationFromExtConfTemplateAsValuedArray() which ignores + * comments and returns ext_conf_template as array where nested keys have no dots. */ - public function writeConfiguration(array $configuration = [], $extensionKey) + protected function getExtConfTablesWithoutCommentsAsNestedArrayWithoutDots(string $extensionKey) { - /** @var $configurationManager \TYPO3\CMS\Core\Configuration\ConfigurationManager */ - $configurationManager = $this->objectManager->get(\TYPO3\CMS\Core\Configuration\ConfigurationManager::class); - $configurationManager->setLocalConfigurationValueByPath('EXT/extConf/' . $extensionKey, serialize($configuration)); - $configurationManager->setLocalConfigurationValueByPath('EXTENSIONS/' . $extensionKey, $configuration); + $rawConfigurationString = $this->getDefaultConfigurationRawString($extensionKey); + $configuration = []; + if ((string)$rawConfigurationString !== '') { + $this->raw = explode(LF, $rawConfigurationString); + $this->rawPointer = 0; + $this->setup = []; + $this->parseSub($this->setup); + if ($this->inBrace) { + throw new \RuntimeException( + 'Line ' . ($this->rawPointer - 1) . ': The script is short of ' . $this->inBrace . ' end brace(s)', + 1507645349 + ); + } + $configuration = $this->removeCommentsAndDotsRecursive($this->setup); + } + return $configuration; } /** - * Get current configuration of an extension. Will return the configuration as a valued object + * Builds a configuration array from each line (option) of the config file. + * Helper method for getConfigurationPreparedForView() * - * @param string $extensionKey + * @param array $configurationOption config file line representing one setting * @return array */ - public function getCurrentConfiguration(string $extensionKey): array + protected function buildConfigurationArray(array $configurationOption): array { - $mergedConfiguration = $this->getDefaultConfigurationFromExtConfTemplateAsValuedArray($extensionKey); - - // @deprecated loading serialized configuration is deprecated and will be removed in v10 - use EXTENSIONS array instead - // No objects allowed in extConf at all - it is safe to deny that during unserialize() - $legacyCurrentExtensionConfiguration = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf'][$extensionKey], ['allowed_classes' => false]); - $legacyCurrentExtensionConfiguration = is_array($legacyCurrentExtensionConfiguration) ? $legacyCurrentExtensionConfiguration : []; - $mergedConfiguration = $this->mergeExtensionConfigurations($mergedConfiguration, $legacyCurrentExtensionConfiguration); + $hierarchicConfiguration = []; + if (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'user')) { + $configurationOption = $this->extractInformationForConfigFieldsOfTypeUser($configurationOption); + } elseif (GeneralUtility::isFirstPartOfStr($configurationOption['type'], 'options')) { + $configurationOption = $this->extractInformationForConfigFieldsOfTypeOptions($configurationOption); + } + $languageService = $this->getLanguageService(); + if (is_string($configurationOption['label'])) { + $translatedLabel = $languageService->sL($configurationOption['label']); + if ($translatedLabel) { + $configurationOption['label'] = $translatedLabel; + } + } + $configurationOption['labels'] = GeneralUtility::trimExplode(':', $configurationOption['label'], false, 2); + $configurationOption['subcat_name'] = $configurationOption['subcat_name'] ?: '__default'; + $hierarchicConfiguration[$configurationOption['cat']][$configurationOption['subcat_name']][$configurationOption['name']] = $configurationOption; + return $hierarchicConfiguration; + } - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey]) && is_array($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey])) { - $currentExtensionConfiguration = $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS'][$extensionKey]; - $mergedConfiguration = $this->mergeExtensionConfigurations($mergedConfiguration, $currentExtensionConfiguration); + /** + * Extracts additional information for fields of type "options" + * Extracts "type", "label" and values information + * + * @param array $configurationOption + * @return array + */ + protected function extractInformationForConfigFieldsOfTypeOptions(array $configurationOption): array + { + preg_match('/options\[(.*)\]/is', $configurationOption['type'], $typeMatches); + $optionItems = GeneralUtility::trimExplode(',', $typeMatches[1]); + foreach ($optionItems as $optionItem) { + $optionPair = GeneralUtility::trimExplode('=', $optionItem); + if (count($optionPair) === 2) { + $configurationOption['generic'][$optionPair[0]] = $optionPair[1]; + } else { + $configurationOption['generic'][$optionPair[0]] = $optionPair[0]; + } } + $configurationOption['type'] = 'options'; + return $configurationOption; + } - return $mergedConfiguration; + /** + * Extract additional information for fields of type "user" + * Extracts "type" and the function to be called + * + * @param array $configurationOption + * @return array + */ + protected function extractInformationForConfigFieldsOfTypeUser(array $configurationOption): array + { + preg_match('/user\\[(.*)\\]/is', $configurationOption['type'], $matches); + $configurationOption['generic'] = $matches[1]; + $configurationOption['type'] = 'user'; + return $configurationOption; } /** @@ -194,16 +322,18 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface * @param string $extensionKey Extension key * @return array */ - public function getDefaultConfigurationFromExtConfTemplateAsValuedArray($extensionKey) + protected function getDefaultConfigurationFromExtConfTemplateAsValuedArray(string $extensionKey): array { $rawConfigurationString = $this->getDefaultConfigurationRawString($extensionKey); $theConstants = []; if ((string)$rawConfigurationString !== '') { $this->raw = explode(LF, $rawConfigurationString); + $this->rawPointer = 0; + $this->setup = []; $this->parseSub($this->setup); if ($this->inBrace) { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': The script is short of ' . $this->inBrace . ' end brace(s)', + 'Line ' . ($this->rawPointer - 1) . ': The script is short of ' . $this->inBrace . ' end brace(s)', 1507645348 ); } @@ -223,7 +353,6 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface } } } - return $theConstants; } @@ -234,10 +363,10 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface * @param string $extensionKey Extension key * @return string */ - protected function getDefaultConfigurationRawString($extensionKey) + protected function getDefaultConfigurationRawString(string $extensionKey): string { $rawString = ''; - $extConfTemplateFileLocation = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName( + $extConfTemplateFileLocation = GeneralUtility::getFileAbsFileName( 'EXT:' . $extensionKey . '/ext_conf_template.txt' ); if (file_exists($extConfTemplateFileLocation)) { @@ -246,91 +375,6 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface return $rawString; } - /** - * Converts a valued configuration to a nested configuration. - * - * array('first.second' => array('value' => 1)) - * will become - * array('first.' => array('second' => )) - * - * @param array $valuedConfiguration - * @return array - */ - public function convertValuedToNestedConfiguration(array $valuedConfiguration) - { - $nestedConfiguration = []; - foreach ($valuedConfiguration as $name => $section) { - $path = str_replace('.', './', $name); - $nestedConfiguration = ArrayUtility::setValueByPath($nestedConfiguration, $path, $section['value'], '/'); - } - return $nestedConfiguration; - } - - /** - * Convert a nested configuration to a valued configuration - * - * array('first.' => array('second' => 1)) - * will become - * array('first.second' => array('value' => 1) - * @param array $nestedConfiguration - * @return array - */ - public function convertNestedToValuedConfiguration(array $nestedConfiguration) - { - $flatExtensionConfig = ArrayUtility::flatten($nestedConfiguration); - $valuedCurrentExtensionConfig = []; - foreach ($flatExtensionConfig as $key => $value) { - $valuedCurrentExtensionConfig[$key]['value'] = $value; - } - return $valuedCurrentExtensionConfig; - } - - /** - * Merges two existing configuration arrays, - * expects configuration as valued flat structure - * and overrides as nested array - * - * @see convertNestedToValuedConfiguration - * - * @param array $configuration - * @param array $configurationOverride - * - * @return array - */ - private function mergeExtensionConfigurations(array $configuration, array $configurationOverride): array - { - $configurationOverride = $this->convertNestedToValuedConfiguration( - $configurationOverride - ); - ArrayUtility::mergeRecursiveWithOverrule( - $configuration, - $configurationOverride - ); - return $configuration; - } - - /** - * This flattens a hierarchical TypoScript array to $this->flatSetup - * - * @param array $setupArray TypoScript array - * @param string $prefix Prefix to the object path. Used for recursive calls to this function. - * @return array - */ - protected function flattenSetup($setupArray, $prefix = '') - { - $flatSetup = []; - if (is_array($setupArray)) { - foreach ($setupArray as $key => $val) { - if (is_array($val)) { - $flatSetup = array_merge($flatSetup, $this->flattenSetup($val, $prefix . $key)); - } else { - $flatSetup[$prefix . $key] = $val; - } - } - } - return $flatSetup; - } - /** * This function compares the flattened constants (default and all). * Returns an array with the constants from the whole template which may be edited by the module. @@ -374,7 +418,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface $editableComments[$const]['cat'] = $catSplit[0]; // This is the subcategory. Must be a key in $this->subCategories[]. // catSplit[2] represents the search-order within the subcat. - $catSplit[1] = trim($catSplit[1]); + $catSplit[1] = !empty($catSplit[1]) ? trim($catSplit[1]) : ''; if ($catSplit[1] && isset($this->subCategories[$catSplit[1]])) { $editableComments[$const]['subcat_name'] = $catSplit[1]; $orderIdentifier = isset($catSplit[2]) ? trim($catSplit[2]) : $counter; @@ -426,9 +470,9 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface */ protected function parseSub(array &$setup) { - while (isset($this->raw[$this->rawP])) { - $line = ltrim($this->raw[$this->rawP]); - $this->rawP++; + while (isset($this->raw[$this->rawPointer])) { + $line = ltrim($this->raw[$this->rawPointer]); + $this->rawPointer++; // Set comment flag? if (strpos($line, '/*') === 0) { $this->commentSet = 1; @@ -448,14 +492,14 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface $r = []; if (preg_match('/[^[:alnum:]_\\\\\\.:-]/i', $objStrName, $r)) { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" contains invalid character "' . $r[0] . '". Must be alphanumeric or one of: "_:-\\."', + 'Line ' . ($this->rawPointer - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" contains invalid character "' . $r[0] . '". Must be alphanumeric or one of: "_:-\\."', 1507645381 ); } $line = ltrim(substr($line, $varL)); if ($line === '') { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', + 'Line ' . ($this->rawPointer - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', 1507645417 ); } @@ -486,7 +530,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface break; default: throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', + 'Line ' . ($this->rawPointer - 1) . ': Object Name String, "' . htmlspecialchars($objStrName) . '" was not followed by any operator, =<>({', 1507645445 ); } @@ -498,7 +542,7 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface $this->lastComment = ''; if ($this->inBrace < 0) { throw new \RuntimeException( - 'Line ' . ($this->rawP - 1) . ': An end brace is in excess.', + 'Line ' . ($this->rawPointer - 1) . ': An end brace is in excess.', 1507645489 ); } @@ -622,6 +666,65 @@ class ConfigurationUtility implements \TYPO3\CMS\Core\SingletonInterface return [$keySegment, $remainingKey]; } + /** + * "Comments" from the "TypoScript" parser below are identified by two (!) dots at the end of array keys + * and all array keys have a single dot at the end, if they have sub arrays. This is cleaned here. + * + * Incoming array: + * [ + * 'automaticInstallation' => '1', + * 'automaticInstallation..' => '# cat=basic/enabled; ...' + * 'FE.' => [ + * 'enabled' = '1', + * 'enabled..' => '# cat=basic/enabled; ...' + * ] + * ] + * + * Output array: + * [ + * 'automaticInstallation' => '1', + * 'FE' => [ + * 'enabled' => '1', + * ] + */ + protected function removeCommentsAndDotsRecursive(array $config): array + { + $cleanedConfig = []; + foreach ($config as $key => $value) { + if (substr($key, -2) === '..') { + continue; + } + if (substr($key, -1) === '.') { + $cleanedConfig[rtrim($key, '.')] = $this->removeCommentsAndDotsRecursive($value); + } else { + $cleanedConfig[$key] = $value; + } + } + return $cleanedConfig; + } + + /** + * This flattens a hierarchical TypoScript array to a dotted notation + * + * @param array $setupArray TypoScript array + * @param string $prefix Prefix to the object path. Used for recursive calls to this function. + * @return array + */ + protected function flattenSetup($setupArray, $prefix = '') + { + $flatSetup = []; + if (is_array($setupArray)) { + foreach ($setupArray as $key => $val) { + if (is_array($val)) { + $flatSetup = array_merge($flatSetup, $this->flattenSetup($val, $prefix . $key)); + } else { + $flatSetup[$prefix . $key] = $val; + } + } + } + return $flatSetup; + } + /** * @return LanguageService */ diff --git a/typo3/sysext/extensionmanager/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php similarity index 64% rename from typo3/sysext/extensionmanager/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php rename to typo3/sysext/install/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php index 66478bb0dac6..e7b054f2de26 100644 --- a/typo3/sysext/extensionmanager/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php +++ b/typo3/sysext/install/Classes/ViewHelpers/Form/TypoScriptConstantsViewHelper.php @@ -1,5 +1,6 @@ <?php -namespace TYPO3\CMS\Extensionmanager\ViewHelpers\Form; +declare(strict_types=1); +namespace TYPO3\CMS\Install\ViewHelpers\Form; /* * This file is part of the TYPO3 CMS project. @@ -14,14 +15,16 @@ namespace TYPO3\CMS\Extensionmanager\ViewHelpers\Form; * The TYPO3 project - inspiring people to share! */ -use TYPO3\CMS\Extensionmanager\Domain\Model\ConfigurationItem; +use TYPO3\CMS\Core\Localization\LanguageService; +use TYPO3\CMS\Core\Utility\GeneralUtility; +use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper; use TYPO3\CMS\Fluid\ViewHelpers\FormViewHelper; /** - * View Helper for rendering Extension Manager Configuration Form + * View Helper for rendering extension configuration forms * @internal */ -class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper +class TypoScriptConstantsViewHelper extends AbstractTagBasedViewHelper { /** * @var array @@ -55,7 +58,7 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs parent::initializeArguments(); $this->registerArgument('name', 'string', 'Name of input tag'); $this->registerArgument('value', 'mixed', 'Value of input tag'); - $this->registerArgument('configuration', ConfigurationItem::class, '', true); + $this->registerArgument('configuration', 'array', '', true); $this->registerUniversalTagAttributes(); } @@ -64,12 +67,12 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs * * @return string the rendered tag */ - public function render() + public function render(): string { - /** @var ConfigurationItem $configuration */ + /** @var array $configuration */ $configuration = $this->arguments['configuration']; - if (isset($this->viewHelperMapping[$configuration->getType()]) && method_exists($this, $this->viewHelperMapping[$configuration->getType()])) { - $input = $this->{$this->viewHelperMapping[$configuration->getType()]}($configuration); + if (isset($this->viewHelperMapping[$configuration['type']]) && method_exists($this, $this->viewHelperMapping[$configuration['type']])) { + $input = $this->{$this->viewHelperMapping[$configuration['type']]}($configuration); } else { $input = $this->{$this->viewHelperMapping['default']}($configuration); } @@ -80,12 +83,12 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type color picker * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderColorPicker(ConfigurationItem $configuration) + protected function renderColorPicker(array $configuration): string { - $elementId = 'em-' . $configuration->getName(); + $elementId = 'em-' . $configuration['name']; $elementName = $this->getName($configuration); // configure the field @@ -95,8 +98,8 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs $this->tag->addAttribute('name', $elementName); $this->tag->addAttribute('data-formengine-input-name', $elementName); $this->tag->addAttribute('class', 'form-control'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } $output = ' @@ -114,18 +117,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "offset" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderOffsetField(ConfigurationItem $configuration) + protected function renderOffsetField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'text'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control t3js-emconf-offset'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -133,18 +136,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "wrap" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderWrapField(ConfigurationItem $configuration) + protected function renderWrapField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'text'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control t3js-emconf-wrap'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -152,23 +155,24 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "option" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderOptionSelect(ConfigurationItem $configuration) + protected function renderOptionSelect(array $configuration): string { $this->tag->setTagName('select'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); - $optionValueArray = $configuration->getGeneric(); + $optionValueArray = $configuration['generic']; $output = ''; + $languageService = $this->getLanguageService(); foreach ($optionValueArray as $label => $value) { $output .= '<option value="' . htmlspecialchars($value) . '"'; - if ($configuration->getValue() == $value) { + if ($configuration['value'] == $value) { $output .= ' selected="selected"'; } - $output .= '>' . htmlspecialchars($GLOBALS['LANG']->sL($label)) . '</option>'; + $output .= '>' . htmlspecialchars($languageService->sL($label)) . '</option>'; } $this->tag->setContent($output); return $this->tag->render(); @@ -177,19 +181,19 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "int+" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderPositiveIntegerField(ConfigurationItem $configuration) + protected function renderPositiveIntegerField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'number'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); $this->tag->addAttribute('min', '0'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -197,18 +201,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "integer" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderIntegerField(ConfigurationItem $configuration) + protected function renderIntegerField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'number'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -216,18 +220,18 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "text" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderTextField(ConfigurationItem $configuration) + protected function renderTextField(array $configuration): string { $this->tag->setTagName('input'); $this->tag->addAttribute('type', 'text'); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); + $this->tag->addAttribute('id', 'em-' . $configuration['name']); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('class', 'form-control'); - if ($configuration->getValue() !== null) { - $this->tag->addAttribute('value', $configuration->getValue()); + if ($configuration['value'] !== null) { + $this->tag->addAttribute('value', $configuration['value']); } return $this->tag->render(); } @@ -235,10 +239,10 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "small text" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderSmallTextField(ConfigurationItem $configuration) + protected function renderSmallTextField(array $configuration): string { return $this->renderTextField($configuration); } @@ -246,16 +250,16 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "checkbox" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - public function renderCheckbox(ConfigurationItem $configuration) + public function renderCheckbox(array $configuration): string { $this->tag->addAttribute('type', 'checkbox'); $this->tag->addAttribute('name', $this->getName($configuration)); $this->tag->addAttribute('value', 1); - $this->tag->addAttribute('id', 'em-' . $configuration->getName()); - if ($configuration->getValue() == 1) { + $this->tag->addAttribute('id', 'em-' . $configuration['name']); + if ($configuration['value'] == 1) { $this->tag->addAttribute('checked', 'checked'); } $hiddenField = $this->renderHiddenFieldForEmptyValue($configuration); @@ -265,38 +269,38 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs /** * Render field of type "userFunc" * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderUserFunction(ConfigurationItem $configuration) + protected function renderUserFunction(array $configuration): string { - $userFunction = $configuration->getGeneric(); + $userFunction = $configuration['generic']; $userFunctionParams = [ 'fieldName' => $this->getName($configuration), - 'fieldValue' => $configuration->getValue(), - 'propertyName' => $configuration->getName() + 'fieldValue' => $configuration['value'], + 'propertyName' => $configuration['name'] ]; - return \TYPO3\CMS\Core\Utility\GeneralUtility::callUserFunction($userFunction, $userFunctionParams, $this); + return (string)GeneralUtility::callUserFunction($userFunction, $userFunctionParams, $this); } /** * Get Field Name * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function getName(ConfigurationItem $configuration) + protected function getName(array $configuration): string { - return 'tx_extensionmanager_tools_extensionmanagerextensionmanager[config][' . $configuration->getName() . '][value]'; + return $configuration['name']; } /** * Render a hidden field for empty values * - * @param ConfigurationItem $configuration + * @param array $configuration * @return string */ - protected function renderHiddenFieldForEmptyValue($configuration) + protected function renderHiddenFieldForEmptyValue(array $configuration): string { $hiddenFieldNames = []; if ($this->viewHelperVariableContainer->exists(FormViewHelper::class, 'renderedHiddenFields')) { @@ -313,4 +317,12 @@ class TypoScriptConstantsViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\Abs } return ''; } + + /** + * @return LanguageService|null Returns null if we are in the install tool standalone mode + */ + protected function getLanguageService() + { + return $GLOBALS['LANG']; + } } diff --git a/typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php b/typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php new file mode 100644 index 000000000000..93d9720de585 --- /dev/null +++ b/typo3/sysext/install/Classes/ViewHelpers/Format/NoSpaceViewHelper.php @@ -0,0 +1,52 @@ +<?php +namespace TYPO3\CMS\Install\ViewHelpers\Format; + +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +use TYPO3\CMS\Fluid\Core\ViewHelper\AbstractViewHelper; +use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; +use TYPO3Fluid\Fluid\Core\ViewHelper\Traits\CompileWithRenderStatic; + +/** + * Remove all spaces in a string + * + * @internal + */ +class NoSpaceViewHelper extends AbstractViewHelper +{ + use CompileWithRenderStatic; + + /** + * Initialize arguments + */ + public function initializeArguments() + { + parent::initializeArguments(); + $this->registerArgument('value', 'string', '', true); + } + + /** + * Render a string with whitespaces stripped + * + * @param array $arguments + * @param \Closure $renderChildrenClosure + * @param RenderingContextInterface $renderingContext + * + * @return string + */ + public static function renderStatic(array $arguments, \Closure $renderChildrenClosure, RenderingContextInterface $renderingContext) + { + return str_replace(' ', '', $arguments['value']); + } +} diff --git a/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html new file mode 100644 index 000000000000..43e63728ace2 --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration.html @@ -0,0 +1 @@ +<div class="t3js-extensionConfiguration-content"></div> diff --git a/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html new file mode 100644 index 000000000000..c20651612cef --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Partials/Settings/ExtensionConfiguration/ExtensionForm.html @@ -0,0 +1,71 @@ +{namespace i=TYPO3\CMS\Install\ViewHelpers} + +<div class="panel panel-default panel-flat searchhit"> + <div class="panel-heading" role="tab" id="heading{extensionKey}"> + <h3 class="panel-title"> + <a role="button" data-toggle="collapse" data-parent="#accordion" href="#collapse{extensionKey}" + aria-expanded="true" aria-controls="collapse{extensionKey}" class="collapsed" + > + <span class="caret"></span> + <strong>{extensionData.packageInfo.packageKey}</strong> + </a> + </h3> + </div> + <div id="collapse{extensionKey}" class="panel-collapse collapse search-item" role="tabpanel" aria-labelledby="heading{extensionKey}"> + <div class="panel-body"> + <div role="tabpanel"> + <ul class="nav nav-tabs" role="tablist"> + <f:for each="{extensionData.configuration}" as="category" key="categoryName" iteration="iteration"> + <f:if condition="{categoryName}"> + <li role="presentation" class="{f:if(condition:'{iteration.isFirst}', then:'active')}"> + <a class="text-capitalize" href="#{i:format.noSpace(value:'category-{extensionKey}-{categoryName}')}" aria-controls="category-{extensionKey}-{categoryName}" role="tab" data-toggle="tab"> + {categoryName} + </a> + </li> + </f:if> + </f:for> + </ul> + + <form action="#" name="configurationform" class="t3js-extensionConfiguration-form" data-extensionKey="{extensionKey}"> + <div class="tab-content"> + <f:for each="{extensionData.configuration}" as="subcategories" key="categoryName" iteration="iteration"> + <f:if condition="{categoryName}"> + <div role="tabpanel" class="tab-pane {f:if(condition:'{iteration.isFirst}', then:'active')}" id="{i:format.noSpace(value:'category-{extensionKey}-{categoryName}')}"> + <f:for each="{subcategories}" as="subcategory"> + <div class="form-section"> + <f:for each="{subcategory}" as="configurationItem" iteration="itemIterator"> + <f:if condition="{itemIterator.isFirst}"> + <h2 class="h4 form-section-headline">{configurationItem.subcat_label}</h2> + </f:if> + <div class="form-group form-group-dashed"> + <label for="em-{configurationItem.name}"> + {configurationItem.labels.0} + </label> + <p> + {categoryName}.{configurationItem.name} + <f:if condition="{configurationItem.type} != 'user'"> + <f:if condition="{configurationItem.type}"> + ({configurationItem.type}) + </f:if> + </f:if> + </p> + <div class="form-control-wrap"> + <i:form.typoScriptConstants configuration="{configurationItem}" /> + </div> + <f:if condition="{configurationItem.labels.1}"> + <div class="help-block">{configurationItem.labels.1 -> f:format.nl2br()}</div> + </f:if> + </div> + </f:for> + </div> + </f:for> + </div> + </f:if> + </f:for> + </div> + <button type="submit" class="btn btn-default" name="mySubmit">Save "{extensionKey}" configuration</button> + </form> + </div> + </div> + </div> +</div> diff --git a/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html b/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html index f519ebd8c1e8..83495825b2d0 100644 --- a/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html +++ b/typo3/sysext/install/Resources/Private/Templates/Settings/Cards.html @@ -30,6 +30,13 @@ title: 'Configure installation-wide options', category: 'Global Configuration', description: 'Modify settings to be written into TYPO3\'s LocalConfiguration.php.' + }, + 4: {partial: 'Settings/ExtensionConfiguration', + require: 'TYPO3/CMS/Install/ExtensionConfiguration', + baseClass: 't3js-extensionConfiguration', + title: 'Extension configuration', + category: 'Glocal Configuration', + description: 'Configure settings for extensions.' } }}"> <div class="gridder"> diff --git a/typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html b/typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html new file mode 100644 index 000000000000..0caa9c9364ac --- /dev/null +++ b/typo3/sysext/install/Resources/Private/Templates/Settings/ExtensionConfigurationGetContent.html @@ -0,0 +1,22 @@ +<p> + Select extension here +</p> + +<div style="display:none;"> + <div id="t3js-extensionConfiguration-write-token">{extensionConfigurationWriteToken}</div> +</div> + +<div class="t3js-extensionConfiguration-output"></div> + +<div class="form-group"> + <div class="input-group"> + <span class="input-group-addon">Filter by:</span> + <input type="text" class="form-control t3js-extensionConfiguration-search" placeholder="search setting"> + </div> +</div> + +<div class="panel-group" role="tablist" aria-multiselectable="true"> + <f:for each="{extensionsWithConfigurations}" as="extensionData" key="extensionKey"> + <f:render partial="Settings/ExtensionConfiguration/ExtensionForm" arguments="{_all}"/> + </f:for> +</div> diff --git a/typo3/sysext/install/Resources/Public/Css/install.css b/typo3/sysext/install/Resources/Public/Css/install.css index fed178c2ed1b..d98b7db82ad8 100644 --- a/typo3/sysext/install/Resources/Public/Css/install.css +++ b/typo3/sysext/install/Resources/Public/Css/install.css @@ -10,4 +10,4 @@ * * The TYPO3 project - inspiring people to share! */ -@charset "UTF-8";html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLight.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLight.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLight.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLight.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLight.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Light.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Light.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Light.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Light.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Light.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-LightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-LightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-LightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-LightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-LightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Regular.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Regular.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Regular.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Regular.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Regular.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-It.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-It.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-It.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-It.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-It.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Semibold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Semibold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Semibold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Semibold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Semibold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-SemiboldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-SemiboldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-SemiboldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-SemiboldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-SemiboldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Bold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Bold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Bold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Bold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Bold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BoldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BoldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BoldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BoldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BoldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Black.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Black.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Black.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Black.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Black.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BlackIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BlackIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BlackIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BlackIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BlackIt.ttf) format("truetype")}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}*{box-sizing:border-box}:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #7a7a7a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff}.bg-primary{background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}ol,ul{margin-top:0;margin-bottom:9px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dd,dt{line-height:1.5}dt{font-weight:700}dd{margin-left:0}.dl-horizontal dd:after{content:"";display:table;clear:both}@media (min-width:992px){.dl-horizontal dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:90px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#5a5a5a;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:after{content:"";display:table;clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:after{content:"";display:table;clear:both}.row{margin-left:-15px;margin-right:-15px}.row:after{content:"";display:table;clear:both}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{background-color:#fafafa}caption{padding-top:6px;padding-bottom:6px;color:#737373;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;vertical-align:top;border-top:1px solid #ccc}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered{border:1px solid #ccc}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#5a5a5a;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#333}.form-control{display:block;width:100%;height:32px;padding:6px 6px;font-size:12px;line-height:1.5;color:#333;background-color:#fefefe;background-image:none;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-success .form-control-feedback{color:#79a548}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-warning .form-control-feedback{color:#e8a33d}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-error .form-control-feedback{color:#c83c3c}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 6px;font-size:12px;line-height:1.5;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default:hover{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary:hover{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success:hover{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info:hover{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning:hover{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger:hover{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:2px;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#424242}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.5;color:#fff;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#d7d7d7;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-top-left-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px 4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px 12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;background-color:#ededed;border:1px solid #ccc;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px 12px;font-size:15px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px 4px;font-size:11px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover{background-color:#5f8139}.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover{background-color:#4392d7}.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#d88b1a}.label-danger{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:700;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#737373;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert{padding:11px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#79a548;border-color:transparent;color:#fff}.alert-success hr{border-top-color:transparent}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;border-color:transparent;color:#fff}.alert-info hr{border-top-color:transparent}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;border-color:transparent;color:#fff}.alert-warning hr{border-top-color:transparent}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;border-color:transparent;color:#fff}.alert-danger hr{border-top-color:transparent}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#dedede;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:11px;line-height:18px;color:#fff;text-align:center;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:14px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:2px}.well-sm{padding:9px;border-radius:2px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header:after{content:"";display:table;clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:after{content:"";display:table;clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:1px 1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.tooltip{position:absolute;z-index:1070;display:block;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:11px;opacity:0}.tooltip.in{opacity:1}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-left .tooltip-arrow{bottom:0;right:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-right .tooltip-arrow{bottom:0;left:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-left .tooltip-arrow{top:0;right:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-right .tooltip-arrow{top:0;left:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}html{height:100%;overflow:hidden}body{height:100%;overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu{background-color:#292929;color:#f5f5f5;position:fixed;top:45px;left:0;bottom:0;width:40px;max-width:100%;z-index:1000;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-modulemenu .active>a{color:#f5f5f5}.scaffold-toolbar{overflow:auto;background-color:#292929;color:#f5f5f5;z-index:1000;position:fixed;top:45px;left:0;right:0;bottom:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}.scaffold-toolbar .active>a{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}}@media (min-width:992px){.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}@media (max-width:991px){.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu{background-color:#292929}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent{background-color:#292929}@media (max-width:991px){.scaffold-toolbar-expanded .toolbar-item-search{display:none}}.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}@media (max-width:991px){.scaffold-search-expanded .toolbar-item{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}}.scaffold-search-expanded .topbar-button-search{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}@media (max-width:991px){.topbar-header{padding-right:80px!important}}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}}.toolbar:after{clear:both;display:table;content:''}.toolbar-list{list-style:none;padding:0;margin:0}.toolbar-list:after{clear:both;display:table;content:''}@media (min-width:992px){.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}@media (min-width:992px){.toolbar-item-link{border:none}}.open .toolbar-item-link{background-color:#292929}@media (min-width:992px){.toolbar-item-title{display:none}}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li{position:relative}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.dropdown-table-icon{width:16px;padding-right:.5em}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{position:relative;display:inline-block;height:32px;width:32px;vertical-align:middle}.avatar-image{display:block;height:32px;width:32px;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout .media-body{vertical-align:middle}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-body>:last-child{margin-bottom:0}.callout-sm{margin:10px 0;padding:10px}.callout-sm .callout-title{font-size:1em;margin:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media{margin:0}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media{margin:0}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media{margin:0}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media{margin:0}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media{margin:0}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{position:absolute;display:block;text-align:center;top:0;left:0;right:0;bottom:0}.icon-overlay{position:absolute;bottom:0;right:0;height:68.75%;width:68.75%;text-align:center}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre;word-break:break-all;word-wrap:break-word}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.module-docheader{position:fixed;width:100%;top:0;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0;border-left:none;border-right:none;border-bottom:none;border-radius:0;margin-left:-24px;margin-right:-24px;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px 24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}.clearfix:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.panel-heading:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs{display:none!important}.visible-sm{display:none!important}.visible-md{display:none!important}.visible-lg{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal}.chosen-container-single .chosen-drop{margin-top:-1px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#e8a33d;color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:4px 20px 4px 5px;max-width:100%;background-color:#e8a33d;background-clip:padding-box;color:#fff;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:5px;display:block;width:12px;height:12px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:after{content:"ï€";font-family:FontAwesome;padding-left:2px;vertical-align:top;color:#fff}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}.gridder{margin:15px;margin-left:-15px;margin-right:-15px;padding:0;list-style-type:none;font-size:0}.gridder-list,.gridder-show{font-size:12px}.gridder-list{display:inline-block;vertical-align:top;padding-left:15px;padding-right:15px;position:relative}.gridder-list.selectedItem:after{position:absolute;border:15px solid transparent;border-bottom-color:#fff;border-top:0;bottom:0;left:50%;margin-left:-7.5px;content:''}.gridder-list .gridder-item{background-color:#fff;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:30px;padding:10px;min-height:200px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform;cursor:pointer;position:relative}.gridder-list .gridder-item:focus,.gridder-list .gridder-item:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.gridder-list .gridder-item .label{padding:3px 6px;font-size:12px;vertical-align:top;border-radius:10px;min-width:28px;display:inline-block}.gridder-show{background-color:#fff;display:block;float:left;width:100%;position:relative;margin-bottom:15px}.gridder-show .gridder-padding{padding:30px}.gridder-show .gridder-title{border-bottom:1px solid #ccc;margin-bottom:15px}.gridder-content{display:none}.gridder-list{width:100%}@media (min-width:768px){.gridder-list{width:50%}}@media (min-width:992px){.gridder-list{width:25%}}.card{overflow:hidden;border-radius:2px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;box-shadow:0 1px 1px rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}a.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 2px 1px rgba(0,0,0,.3)}.card-container{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-large{width:calc(100% - 20px)}}.card-size-fixed-small{width:calc(100% - 20px)}@media (min-width:624px){.card-size-fixed-small{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-fixed-small{width:300px}}.card-content,.card-footer,.card-header,.card-image{padding:1.5em 1.5em 0 1.5em}.card-content:last-child,.card-footer:last-child,.card-header:last-child,.card-image:last-child{padding-bottom:1.5em}.card-content :first-child,.card-footer :first-child,.card-header :first-child,.card-image :first-child{margin-top:0}.card-content :last-child,.card-footer :last-child,.card-header :last-child,.card-image :last-child{margin-bottom:0}.card-image{position:relative;padding-left:0;padding-right:0}.card-image:first-child{padding-top:0}.card-image:first-child .card-image-badge{top:.75em}.card-image:last-child{padding-bottom:0}.card-image .card-image-badge{position:absolute;top:1.5em;right:.75em}.card-image img{display:block;height:auto;width:100%;margin:0 auto}.card-header .card-icon{float:left;margin-right:.75em}.card-header .card-header-body{display:block;overflow:hidden}.card-header .card-title{font-family:inherit;font-weight:500;display:block;font-size:1.35em;line-height:1.2em;margin:0}.card-header .card-subtitle{display:block;margin-top:.5em;font-size:1em;line-height:1.2em;opacity:.5}.card-header .card-longdesc{margin-top:1em}.card-content{height:100%}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}.alert-notice{background-color:#333;border-color:transparent;color:#fff}.alert-notice hr{border-top-color:transparent}.alert-notice .alert-link{color:#e6e5e5}.alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);border:0}.alert a{color:inherit;text-decoration:underline}.alert .media{margin:0}.alert .media .fa-stack>.fa:first-child{opacity:.2}.alert .media-body{vertical-align:middle}.alert-title{font-size:1.12em;font-weight:700;margin:0 0 .25em}.alert-body,.alert-message{margin:0;font-size:.9em}.alert-body>:last-child,.alert-message>:last-child{margin-bottom:0}.alert-body>ul,.alert-message>ul{padding-left:1.5em}.alert-dismissible .close{opacity:.5;padding:1px;top:-3px;right:-22px;color:inherit}.alert-dismissible .close:hover{opacity:1;color:inherit}#alert-container{width:400px;position:absolute;right:5px;top:46px;z-index:10000}#alert-container .alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 2px 0 0 rgba(0,0,0,.15);position:relative;margin:5px auto}#alert-container .alert.fade.in{opacity:.95}body.backend .module{background:#f5f5f5}.content-area{padding-bottom:35px}.content-area>h3{margin-top:0}.content-area>:last-child{margin-bottom:0}.logo-pageheader img{padding-bottom:3px}img.logo{vertical-align:bottom}.typo3-message>h4{margin-bottom:0}.typo3-message p{margin-top:9px}.t3-install-displaytwinimageimages{border:1px solid #ccc;padding:10px}.t3-install-displaytwinimagetextarea pre{border-top:0}.bg-transparent-emulation{padding:10px;text-align:center;background:url(../../../../../../typo3/sysext/install/Resources/Public/Images/bg_transparent_emulation.png)}.bg-transparent-emulation img{max-width:300px}.alert-notice{background-color:#eee;border-color:#bbb;color:#333}.alert-notice hr{border-top-color:#aeaeae}.alert-notice .alert-link{color:#1a1919}.nav-pills>li>a{border-radius:0}h1:first-child{margin-top:0}.typo3-docheader-buttons,.typo3-docheader-functions{min-height:20px}.item{margin:1em;border:1px solid #ddd}.item .item-heading{padding:1em;background-color:#ddd}.item .item-body{padding:1em}.list-group-item a{display:block}.list-group-item.active a{color:#fff}.caret{border:0;padding-left:10px}.caret:after{position:relative;top:-8px;left:-10px;content:"";font-family:FontAwesome}.collapsed .caret:after{content:"";font-family:FontAwesome}.panel-heading{position:relative}.panel-heading .panel-checkbox{margin:0;position:absolute;left:1em;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.panel-heading .panel-checkbox+.panel-title{padding-left:18px}.panel-heading .message{display:block;padding-left:16px;margin-top:5px}a[data-toggle=collapse]{display:block}@media (min-width:992px){.affix-bottom{position:absolute}body.standalone .affix-top{position:relative}.affix{position:fixed;top:35px}body.backend .affix-top{position:fixed;top:35px}body.backend .leftNavigation{min-height:425px}}hr{border-top-color:#ddd}.copyright .panel-default:last-child{margin-bottom:0}#fixed-footer-handler{height:32px}.fixed{position:fixed;bottom:0;background-color:grey}.fixed .footer-innerWrap{padding:1.5em}@media (max-width:991px){#menuWrapper{position:relative!important;margin-bottom:30px}}#mobileMenuWrapper{margin-bottom:10px}#install-menu-button{float:right;margin-bottom:20px}#install-menu-button .navbar-toggle{border:0;background:#fff}#install-menu-button .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#000}#install-menu-button .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}a[data-toggle=collapse]{text-decoration:none}.panel-group-flat .panel-body,.panel-group-rst .panel-body{padding-right:0}.panel-flat,.panel-rst,.panel-version{border:0;border-left:2px solid #d7d7d7;border-radius:0;margin:0}.panel-flat.panel-default .panel-heading,.panel-rst.panel-default .panel-heading,.panel-version.panel-default .panel-heading{background:#f5f5f5}.panel-flat.panel-breaking,.panel-flat.panel-danger,.panel-rst.panel-breaking,.panel-rst.panel-danger,.panel-version.panel-breaking,.panel-version.panel-danger{border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading,.panel-flat.panel-danger>.panel-heading,.panel-rst.panel-breaking>.panel-heading,.panel-rst.panel-danger>.panel-heading,.panel-version.panel-breaking>.panel-heading,.panel-version.panel-danger>.panel-heading{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading .badge,.panel-flat.panel-danger>.panel-heading .badge,.panel-rst.panel-breaking>.panel-heading .badge,.panel-rst.panel-danger>.panel-heading .badge,.panel-version.panel-breaking>.panel-heading .badge,.panel-version.panel-danger>.panel-heading .badge{color:#c83c3c;background-color:#fff}.panel-flat.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.panel-flat.panel-breaking.risk-high>.panel-heading,.panel-flat.panel-danger.risk-high>.panel-heading,.panel-rst.panel-breaking.risk-high>.panel-heading,.panel-rst.panel-danger.risk-high>.panel-heading,.panel-version.panel-breaking.risk-high>.panel-heading,.panel-version.panel-danger.risk-high>.panel-heading{background:#c83c3c;color:#f5f5f5}.panel-flat.panel-breaking.risk-medium>.panel-heading,.panel-flat.panel-danger.risk-medium>.panel-heading,.panel-rst.panel-breaking.risk-medium>.panel-heading,.panel-rst.panel-danger.risk-medium>.panel-heading,.panel-version.panel-breaking.risk-medium>.panel-heading,.panel-version.panel-danger.risk-medium>.panel-heading{background:#f5dbdb;color:#1e1e1e}.panel-flat.panel-breaking.risk-low>.panel-heading,.panel-flat.panel-danger.risk-low>.panel-heading,.panel-rst.panel-breaking.risk-low>.panel-heading,.panel-rst.panel-danger.risk-low>.panel-heading,.panel-version.panel-breaking.risk-low>.panel-heading,.panel-version.panel-danger.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-breaking .panel-progress .panel-progress-bar,.panel-flat.panel-danger .panel-progress .panel-progress-bar,.panel-rst.panel-breaking .panel-progress .panel-progress-bar,.panel-rst.panel-danger .panel-progress .panel-progress-bar,.panel-version.panel-breaking .panel-progress .panel-progress-bar,.panel-version.panel-danger .panel-progress .panel-progress-bar{background-color:#c83c3c}.panel-flat.panel-deprecation,.panel-flat.panel-warning,.panel-rst.panel-deprecation,.panel-rst.panel-warning,.panel-version.panel-deprecation,.panel-version.panel-warning{border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading,.panel-flat.panel-warning>.panel-heading,.panel-rst.panel-deprecation>.panel-heading,.panel-rst.panel-warning>.panel-heading,.panel-version.panel-deprecation>.panel-heading,.panel-version.panel-warning>.panel-heading{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading .badge,.panel-flat.panel-warning>.panel-heading .badge,.panel-rst.panel-deprecation>.panel-heading .badge,.panel-rst.panel-warning>.panel-heading .badge,.panel-version.panel-deprecation>.panel-heading .badge,.panel-version.panel-warning>.panel-heading .badge{color:#e8a33d;background-color:#fff}.panel-flat.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-flat.panel-deprecation.risk-high>.panel-heading,.panel-flat.panel-warning.risk-high>.panel-heading,.panel-rst.panel-deprecation.risk-high>.panel-heading,.panel-rst.panel-warning.risk-high>.panel-heading,.panel-version.panel-deprecation.risk-high>.panel-heading,.panel-version.panel-warning.risk-high>.panel-heading{background:#e8a33d;color:#f5f5f5}.panel-flat.panel-deprecation.risk-medium>.panel-heading,.panel-flat.panel-warning.risk-medium>.panel-heading,.panel-rst.panel-deprecation.risk-medium>.panel-heading,.panel-rst.panel-warning.risk-medium>.panel-heading,.panel-version.panel-deprecation.risk-medium>.panel-heading,.panel-version.panel-warning.risk-medium>.panel-heading{background:#f8e4c6;color:#1e1e1e}.panel-flat.panel-deprecation.risk-low>.panel-heading,.panel-flat.panel-warning.risk-low>.panel-heading,.panel-rst.panel-deprecation.risk-low>.panel-heading,.panel-rst.panel-warning.risk-low>.panel-heading,.panel-version.panel-deprecation.risk-low>.panel-heading,.panel-version.panel-warning.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-deprecation .panel-progress .panel-progress-bar,.panel-flat.panel-warning .panel-progress .panel-progress-bar,.panel-rst.panel-deprecation .panel-progress .panel-progress-bar,.panel-rst.panel-warning .panel-progress .panel-progress-bar,.panel-version.panel-deprecation .panel-progress .panel-progress-bar,.panel-version.panel-warning .panel-progress .panel-progress-bar{background-color:#e8a33d}.panel-flat.panel-feature,.panel-flat.panel-success,.panel-rst.panel-feature,.panel-rst.panel-success,.panel-version.panel-feature,.panel-version.panel-success{border-color:#79a548}.panel-flat.panel-feature>.panel-heading,.panel-flat.panel-success>.panel-heading,.panel-rst.panel-feature>.panel-heading,.panel-rst.panel-success>.panel-heading,.panel-version.panel-feature>.panel-heading,.panel-version.panel-success>.panel-heading{color:#fff;background-color:#79a548;border-color:#79a548}.panel-flat.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-flat.panel-feature>.panel-heading .badge,.panel-flat.panel-success>.panel-heading .badge,.panel-rst.panel-feature>.panel-heading .badge,.panel-rst.panel-success>.panel-heading .badge,.panel-version.panel-feature>.panel-heading .badge,.panel-version.panel-success>.panel-heading .badge{color:#79a548;background-color:#fff}.panel-flat.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-flat.panel-feature.risk-high>.panel-heading,.panel-flat.panel-success.risk-high>.panel-heading,.panel-rst.panel-feature.risk-high>.panel-heading,.panel-rst.panel-success.risk-high>.panel-heading,.panel-version.panel-feature.risk-high>.panel-heading,.panel-version.panel-success.risk-high>.panel-heading{background:#79a548;color:#f5f5f5}.panel-flat.panel-feature.risk-medium>.panel-heading,.panel-flat.panel-success.risk-medium>.panel-heading,.panel-rst.panel-feature.risk-medium>.panel-heading,.panel-rst.panel-success.risk-medium>.panel-heading,.panel-version.panel-feature.risk-medium>.panel-heading,.panel-version.panel-success.risk-medium>.panel-heading{background:#ddeacf;color:#1e1e1e}.panel-flat.panel-feature.risk-low>.panel-heading,.panel-flat.panel-success.risk-low>.panel-heading,.panel-rst.panel-feature.risk-low>.panel-heading,.panel-rst.panel-success.risk-low>.panel-heading,.panel-version.panel-feature.risk-low>.panel-heading,.panel-version.panel-success.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-feature .panel-progress .panel-progress-bar,.panel-flat.panel-success .panel-progress .panel-progress-bar,.panel-rst.panel-feature .panel-progress .panel-progress-bar,.panel-rst.panel-success .panel-progress .panel-progress-bar,.panel-version.panel-feature .panel-progress .panel-progress-bar,.panel-version.panel-success .panel-progress .panel-progress-bar{background-color:#79a548}.panel-flat.panel-important,.panel-flat.panel-info,.panel-rst.panel-important,.panel-rst.panel-info,.panel-version.panel-important,.panel-version.panel-info{border-color:#6daae0}.panel-flat.panel-important>.panel-heading,.panel-flat.panel-info>.panel-heading,.panel-rst.panel-important>.panel-heading,.panel-rst.panel-info>.panel-heading,.panel-version.panel-important>.panel-heading,.panel-version.panel-info>.panel-heading{color:#fff;background-color:#6daae0;border-color:#6daae0}.panel-flat.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-flat.panel-important>.panel-heading .badge,.panel-flat.panel-info>.panel-heading .badge,.panel-rst.panel-important>.panel-heading .badge,.panel-rst.panel-info>.panel-heading .badge,.panel-version.panel-important>.panel-heading .badge,.panel-version.panel-info>.panel-heading .badge{color:#6daae0;background-color:#fff}.panel-flat.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-flat.panel-important.risk-high>.panel-heading,.panel-flat.panel-info.risk-high>.panel-heading,.panel-rst.panel-important.risk-high>.panel-heading,.panel-rst.panel-info.risk-high>.panel-heading,.panel-version.panel-important.risk-high>.panel-heading,.panel-version.panel-info.risk-high>.panel-heading{background:#6daae0;color:#f5f5f5}.panel-flat.panel-important.risk-medium>.panel-heading,.panel-flat.panel-info.risk-medium>.panel-heading,.panel-rst.panel-important.risk-medium>.panel-heading,.panel-rst.panel-info.risk-medium>.panel-heading,.panel-version.panel-important.risk-medium>.panel-heading,.panel-version.panel-info.risk-medium>.panel-heading{background:#ebf3fb;color:#1e1e1e}.panel-flat.panel-important.risk-low>.panel-heading,.panel-flat.panel-info.risk-low>.panel-heading,.panel-rst.panel-important.risk-low>.panel-heading,.panel-rst.panel-info.risk-low>.panel-heading,.panel-version.panel-important.risk-low>.panel-heading,.panel-version.panel-info.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-important .panel-progress .panel-progress-bar,.panel-flat.panel-info .panel-progress .panel-progress-bar,.panel-rst.panel-important .panel-progress .panel-progress-bar,.panel-rst.panel-info .panel-progress .panel-progress-bar,.panel-version.panel-important .panel-progress .panel-progress-bar,.panel-version.panel-info .panel-progress .panel-progress-bar{background-color:#6daae0}.panel-flat .panel-heading,.panel-rst .panel-heading,.panel-version .panel-heading{position:relative}.panel-flat .panel-heading a.link-action,.panel-rst .panel-heading a.link-action,.panel-version .panel-heading a.link-action{cursor:pointer}.panel-flat .panel-heading strong,.panel-rst .panel-heading strong,.panel-version .panel-heading strong{line-height:1.5em}.panel-flat pre,.panel-rst pre,.panel-version pre{margin:0;border-radius:0;border:0;border-top:1px solid #d7d7d7;white-space:pre-wrap;word-break:normal;word-wrap:normal}.upgrade_analysis_item_to_filter pre a{text-decoration:underline}#phpinfo table{width:100%;table-layout:fixed;word-wrap:break-word} \ No newline at end of file +@charset "UTF-8";html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLight.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLight.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLight.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLight.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLight.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:200;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-ExtraLightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-ExtraLightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-ExtraLightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-ExtraLightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-ExtraLightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Light.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Light.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Light.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Light.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Light.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:300;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-LightIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-LightIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-LightIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-LightIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-LightIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Regular.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Regular.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Regular.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Regular.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Regular.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:400;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-It.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-It.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-It.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-It.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-It.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Semibold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Semibold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Semibold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Semibold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Semibold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:600;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-SemiboldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-SemiboldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-SemiboldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-SemiboldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-SemiboldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Bold.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Bold.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Bold.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Bold.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Bold.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:700;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BoldIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BoldIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BoldIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BoldIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BoldIt.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:normal;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-Black.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-Black.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-Black.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-Black.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-Black.ttf) format("truetype")}@font-face{font-family:'Source Sans Pro';font-weight:900;font-style:italic;font-stretch:normal;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/EOT/SourceSansPro-BlackIt.eot) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF2/TTF/SourceSansPro-BlackIt.ttf.woff2) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/WOFF/OTF/SourceSansPro-BlackIt.otf.woff) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/OTF/SourceSansPro-BlackIt.otf) format("opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/SourceSansPro/TTF/SourceSansPro-BlackIt.ttf) format("truetype")}@font-face{font-family:FontAwesome;src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?v=4.7.0);src:url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.eot?#iefix&v=4.7.0) format("embedded-opentype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff2?v=4.7.0) format("woff2"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.woff?v=4.7.0) format("woff"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.ttf?v=4.7.0) format("truetype"),url(../../../../../../typo3/sysext/backend/Resources/Public/Fonts/FontAwesome/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-webkit-transform:scale(-1,1);transform:scale(-1,1)}.fa-flip-vertical{-webkit-transform:scale(1,-1);transform:scale(1,-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-rotate-90{-webkit-filter:none;filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:"ï€"}.fa-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:"ï€"}.fa-search-plus:before{content:""}.fa-search-minus:before{content:"ï€"}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:"ï€"}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before{content:"ï€"}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:"ï€"}.fa-map-marker:before{content:"ï"}.fa-adjust:before{content:"ï‚"}.fa-tint:before{content:"ïƒ"}.fa-edit:before,.fa-pencil-square-o:before{content:"ï„"}.fa-share-square-o:before{content:"ï…"}.fa-check-square-o:before{content:"ï†"}.fa-arrows:before{content:"ï‡"}.fa-step-backward:before{content:"ïˆ"}.fa-fast-backward:before{content:"ï‰"}.fa-backward:before{content:"ïŠ"}.fa-play:before{content:"ï‹"}.fa-pause:before{content:"ïŒ"}.fa-stop:before{content:"ï"}.fa-forward:before{content:"ïŽ"}.fa-fast-forward:before{content:"ï"}.fa-step-forward:before{content:"ï‘"}.fa-eject:before{content:"ï’"}.fa-chevron-left:before{content:"ï“"}.fa-chevron-right:before{content:"ï”"}.fa-plus-circle:before{content:"ï•"}.fa-minus-circle:before{content:"ï–"}.fa-times-circle:before{content:"ï—"}.fa-check-circle:before{content:"ï˜"}.fa-question-circle:before{content:"ï™"}.fa-info-circle:before{content:"ïš"}.fa-crosshairs:before{content:"ï›"}.fa-times-circle-o:before{content:"ïœ"}.fa-check-circle-o:before{content:"ï"}.fa-ban:before{content:"ïž"}.fa-arrow-left:before{content:"ï "}.fa-arrow-right:before{content:"ï¡"}.fa-arrow-up:before{content:"ï¢"}.fa-arrow-down:before{content:"ï£"}.fa-mail-forward:before,.fa-share:before{content:"ï¤"}.fa-expand:before{content:"ï¥"}.fa-compress:before{content:"ï¦"}.fa-plus:before{content:"ï§"}.fa-minus:before{content:"ï¨"}.fa-asterisk:before{content:"ï©"}.fa-exclamation-circle:before{content:"ïª"}.fa-gift:before{content:"ï«"}.fa-leaf:before{content:"ï¬"}.fa-fire:before{content:"ï"}.fa-eye:before{content:"ï®"}.fa-eye-slash:before{content:"ï°"}.fa-exclamation-triangle:before,.fa-warning:before{content:"ï±"}.fa-plane:before{content:"ï²"}.fa-calendar:before{content:"ï³"}.fa-random:before{content:"ï´"}.fa-comment:before{content:"ïµ"}.fa-magnet:before{content:"ï¶"}.fa-chevron-up:before{content:"ï·"}.fa-chevron-down:before{content:"ï¸"}.fa-retweet:before{content:"ï¹"}.fa-shopping-cart:before{content:"ïº"}.fa-folder:before{content:"ï»"}.fa-folder-open:before{content:"ï¼"}.fa-arrows-v:before{content:"ï½"}.fa-arrows-h:before{content:"ï¾"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"ï‚€"}.fa-twitter-square:before{content:"ï‚"}.fa-facebook-square:before{content:"ï‚‚"}.fa-camera-retro:before{content:""}.fa-key:before{content:"ï‚„"}.fa-cogs:before,.fa-gears:before{content:"ï‚…"}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:"ï‚Š"}.fa-sign-out:before{content:"ï‚‹"}.fa-linkedin-square:before{content:"ï‚Œ"}.fa-thumb-tack:before{content:"ï‚"}.fa-external-link:before{content:"ï‚Ž"}.fa-sign-in:before{content:"ï‚"}.fa-trophy:before{content:"ï‚‘"}.fa-github-square:before{content:"ï‚’"}.fa-upload:before{content:"ï‚“"}.fa-lemon-o:before{content:"ï‚”"}.fa-phone:before{content:"ï‚•"}.fa-square-o:before{content:"ï‚–"}.fa-bookmark-o:before{content:"ï‚—"}.fa-phone-square:before{content:""}.fa-twitter:before{content:"ï‚™"}.fa-facebook-f:before,.fa-facebook:before{content:"ï‚š"}.fa-github:before{content:"ï‚›"}.fa-unlock:before{content:"ï‚œ"}.fa-credit-card:before{content:"ï‚"}.fa-feed:before,.fa-rss:before{content:"ï‚ž"}.fa-hdd-o:before{content:"ï‚ "}.fa-bullhorn:before{content:"ï‚¡"}.fa-bell:before{content:""}.fa-certificate:before{content:"ï‚£"}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:"ï‚¥"}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before{content:""}.fa-arrow-circle-right:before{content:"ï‚©"}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:"ï‚«"}.fa-globe:before{content:""}.fa-wrench:before{content:"ï‚"}.fa-tasks:before{content:"ï‚®"}.fa-filter:before{content:"ï‚°"}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before{content:"ïƒ"}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:"ïƒ"}.fa-table:before{content:""}.fa-magic:before{content:"ïƒ"}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:"ïƒ"}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:"ïƒ "}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:"ïƒ"}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:"ï‚¢"}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:"ï„€"}.fa-angle-double-right:before{content:"ï„"}.fa-angle-double-up:before{content:"ï„‚"}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:"ï„„"}.fa-angle-right:before{content:"ï„…"}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:"ï„Š"}.fa-mobile-phone:before,.fa-mobile:before{content:"ï„‹"}.fa-circle-o:before{content:"ï„Œ"}.fa-quote-left:before{content:"ï„"}.fa-quote-right:before{content:"ï„Ž"}.fa-spinner:before{content:"ï„"}.fa-circle:before{content:"ï„‘"}.fa-mail-reply:before,.fa-reply:before{content:"ï„’"}.fa-github-alt:before{content:"ï„“"}.fa-folder-o:before{content:"ï„”"}.fa-folder-open-o:before{content:"ï„•"}.fa-smile-o:before{content:""}.fa-frown-o:before{content:"ï„™"}.fa-meh-o:before{content:"ï„š"}.fa-gamepad:before{content:"ï„›"}.fa-keyboard-o:before{content:"ï„œ"}.fa-flag-o:before{content:"ï„"}.fa-flag-checkered:before{content:"ï„ž"}.fa-terminal:before{content:"ï„ "}.fa-code:before{content:"ï„¡"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"ï„¢"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"ï„£"}.fa-location-arrow:before{content:""}.fa-crop:before{content:"ï„¥"}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:"ï„©"}.fa-exclamation:before{content:""}.fa-superscript:before{content:"ï„«"}.fa-subscript:before{content:""}.fa-eraser:before{content:"ï„"}.fa-puzzle-piece:before{content:"ï„®"}.fa-microphone:before{content:"ï„°"}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:"ï„´"}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:"ï„·"}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:"ï„»"}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:"ï…€"}.fa-ellipsis-h:before{content:"ï…"}.fa-ellipsis-v:before{content:"ï…‚"}.fa-rss-square:before{content:"ï…ƒ"}.fa-play-circle:before{content:"ï…„"}.fa-ticket:before{content:"ï……"}.fa-minus-square:before{content:"ï…†"}.fa-minus-square-o:before{content:"ï…‡"}.fa-level-up:before{content:"ï…ˆ"}.fa-level-down:before{content:"ï…‰"}.fa-check-square:before{content:"ï…Š"}.fa-pencil-square:before{content:"ï…‹"}.fa-external-link-square:before{content:"ï…Œ"}.fa-share-square:before{content:"ï…"}.fa-compass:before{content:"ï…Ž"}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:"ï…"}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:"ï…‘"}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:"ï…’"}.fa-eur:before,.fa-euro:before{content:"ï…“"}.fa-gbp:before{content:"ï…”"}.fa-dollar:before,.fa-usd:before{content:"ï…•"}.fa-inr:before,.fa-rupee:before{content:"ï…–"}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:"ï…—"}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:"ï…˜"}.fa-krw:before,.fa-won:before{content:"ï…™"}.fa-bitcoin:before,.fa-btc:before{content:"ï…š"}.fa-file:before{content:"ï…›"}.fa-file-text:before{content:"ï…œ"}.fa-sort-alpha-asc:before{content:"ï…"}.fa-sort-alpha-desc:before{content:"ï…ž"}.fa-sort-amount-asc:before{content:"ï… "}.fa-sort-amount-desc:before{content:"ï…¡"}.fa-sort-numeric-asc:before{content:"ï…¢"}.fa-sort-numeric-desc:before{content:"ï…£"}.fa-thumbs-up:before{content:"ï…¤"}.fa-thumbs-down:before{content:"ï…¥"}.fa-youtube-square:before{content:"ï…¦"}.fa-youtube:before{content:"ï…§"}.fa-xing:before{content:"ï…¨"}.fa-xing-square:before{content:"ï…©"}.fa-youtube-play:before{content:"ï…ª"}.fa-dropbox:before{content:"ï…«"}.fa-stack-overflow:before{content:"ï…¬"}.fa-instagram:before{content:"ï…"}.fa-flickr:before{content:"ï…®"}.fa-adn:before{content:"ï…°"}.fa-bitbucket:before{content:"ï…±"}.fa-bitbucket-square:before{content:"ï…²"}.fa-tumblr:before{content:"ï…³"}.fa-tumblr-square:before{content:"ï…´"}.fa-long-arrow-down:before{content:"ï…µ"}.fa-long-arrow-up:before{content:"ï…¶"}.fa-long-arrow-left:before{content:"ï…·"}.fa-long-arrow-right:before{content:"ï…¸"}.fa-apple:before{content:"ï…¹"}.fa-windows:before{content:"ï…º"}.fa-android:before{content:"ï…»"}.fa-linux:before{content:"ï…¼"}.fa-dribbble:before{content:"ï…½"}.fa-skype:before{content:"ï…¾"}.fa-foursquare:before{content:""}.fa-trello:before{content:"ï†"}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:"ï†"}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:"ï†"}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:"ï†"}.fa-yahoo:before{content:""}.fa-google:before{content:"ï† "}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:"ï†"}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:"ï‡"}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:"ï‡"}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:"ï‡"}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:"ï‡"}.fa-sliders:before{content:""}.fa-share-alt:before{content:"ï‡ "}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:"ï‡"}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:"ïˆ"}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:"ïˆ"}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:"ïˆ"}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:"ïˆ"}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:"ïˆ"}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"ï‰"}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:"ï‰"}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:"ï‰"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:"ï‰"}.fa-creative-commons:before{content:""}.fa-gg:before{content:"ï‰ "}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:"ï‰"}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:"ïŠ"}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:"ïŠ"}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:"ïŠ"}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:"ïŠ"}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:"ïŠ "}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:"ïŠ"}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:"ï‹€"}.fa-id-badge:before{content:"ï‹"}.fa-drivers-license:before,.fa-id-card:before{content:"ï‹‚"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:"ï‹„"}.fa-free-code-camp:before{content:"ï‹…"}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"ï‹Š"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"ï‹‹"}.fa-shower:before{content:"ï‹Œ"}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:"ï‹"}.fa-podcast:before{content:"ï‹Ž"}.fa-window-maximize:before{content:"ï‹"}.fa-window-minimize:before{content:"ï‹‘"}.fa-window-restore:before{content:"ï‹’"}.fa-times-rectangle:before,.fa-window-close:before{content:"ï‹“"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"ï‹”"}.fa-bandcamp:before{content:"ï‹•"}.fa-grav:before{content:"ï‹–"}.fa-etsy:before{content:"ï‹—"}.fa-imdb:before{content:""}.fa-ravelry:before{content:"ï‹™"}.fa-eercast:before{content:"ï‹š"}.fa-microchip:before{content:"ï‹›"}.fa-snowflake-o:before{content:"ï‹œ"}.fa-superpowers:before{content:"ï‹"}.fa-wpexplorer:before{content:"ï‹ž"}.fa-meetup:before{content:"ï‹ "}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}*{box-sizing:border-box}:after,:before{box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:transparent}body{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:12px;line-height:1.5;color:#000;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#212424;text-decoration:none}a:focus,a:hover{color:#000;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive{display:block;max-width:100%;height:auto}.img-rounded{border-radius:2px}.img-thumbnail{padding:4px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:18px;margin-bottom:18px;border:0;border-top:1px solid #7a7a7a}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#737373}.h1,.h2,.h3,h1,h2,h3{margin-top:18px;margin-bottom:9px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:9px;margin-bottom:9px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:27px}.h2,h2{font-size:19px}.h3,h3{font-size:17px}.h4,h4{font-size:15px}.h5,h5{font-size:12px}.h6,h6{font-size:11px}p{margin:0 0 9px}.lead{margin-bottom:18px;font-size:13px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:18px}}.small,small{font-size:91%}.mark,mark{background-color:#fbefdd;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.initialism,.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#737373}.text-primary{color:#0078e6}a.text-primary:focus,a.text-primary:hover{color:#005db3}.text-success{color:#79a548}a.text-success:focus,a.text-success:hover{color:#5f8139}.text-info{color:#6daae0}a.text-info:focus,a.text-info:hover{color:#4392d7}.text-warning{color:#e8a33d}a.text-warning:focus,a.text-warning:hover{color:#d88b1a}.text-danger{color:#c83c3c}a.text-danger:focus,a.text-danger:hover{color:#a32e2e}.bg-primary{color:#fff}.bg-primary{background-color:#0078e6}a.bg-primary:focus,a.bg-primary:hover{background-color:#005db3}.bg-success{background-color:#d1e2bd}a.bg-success:focus,a.bg-success:hover{background-color:#b8d39a}.bg-info{background-color:#ebf3fb}a.bg-info:focus,a.bg-info:hover{background-color:#c1dbf2}.bg-warning{background-color:#fbefdd}a.bg-warning:focus,a.bg-warning:hover{background-color:#f6d9af}.bg-danger{background-color:#efc7c7}a.bg-danger:focus,a.bg-danger:hover{background-color:#e49f9f}.page-header{padding-bottom:8px;margin:36px 0 18px;border-bottom:1px solid #f5f5f5}ol,ul{margin-top:0;margin-bottom:9px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled,.modulemenu .modulemenu-group-container{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:18px}dd,dt{line-height:1.5}dt{font-weight:700}dd{margin-left:0}.dl-horizontal dd:after,.form-irre-header-body dl dd:after{content:"";display:table;clear:both}@media (min-width:992px){.dl-horizontal dt,.form-irre-header-body dl dt{float:left;width:70px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd,.form-irre-header-body dl dd{margin-left:90px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #d7d7d7}.initialism{font-size:90%}blockquote{padding:9px 18px;margin:0 0 18px;font-size:15px;border-left:5px solid #f5f5f5}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.5;color:#d7d7d7}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #f5f5f5;border-left:0;text-align:right}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:18px;font-style:normal;line-height:1.5}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:2px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:2px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;box-shadow:none}pre{display:block;padding:8.5px;margin:0 0 9px;font-size:11px;line-height:1.5;word-break:break-all;word-wrap:break-word;color:#5a5a5a;background-color:#f5f5f5;border:1px solid #ccc;border-radius:2px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container:after{content:"";display:table;clear:both}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.container-fluid:after{content:"";display:table;clear:both}.row{margin-left:-15px;margin-right:-15px}.row:after{content:"";display:table;clear:both}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}.col-xs-pull-0{right:auto}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-3{right:25%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-6{right:50%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-9{right:75%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-12{right:100%}.col-xs-push-0{left:auto}.col-xs-push-1{left:8.33333333%}.col-xs-push-2{left:16.66666667%}.col-xs-push-3{left:25%}.col-xs-push-4{left:33.33333333%}.col-xs-push-5{left:41.66666667%}.col-xs-push-6{left:50%}.col-xs-push-7{left:58.33333333%}.col-xs-push-8{left:66.66666667%}.col-xs-push-9{left:75%}.col-xs-push-10{left:83.33333333%}.col-xs-push-11{left:91.66666667%}.col-xs-push-12{left:100%}.col-xs-offset-0{margin-left:0}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-12{margin-left:100%}@media (min-width:768px){.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-pull-0{right:auto}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-12{right:100%}.col-sm-push-0{left:auto}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-push-12{left:100%}.col-sm-offset-0{margin-left:0}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-12{margin-left:100%}}@media (min-width:992px){.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-pull-12{right:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-push-12{left:100%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-12{margin-left:100%}}@media (min-width:1200px){.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-12{right:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-push-12{left:100%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-12{margin-left:100%}}table{background-color:#fafafa}caption{padding-top:6px;padding-bottom:6px;color:#737373;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:18px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:6px;line-height:1.5;vertical-align:top;border-top:1px solid #ccc}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ccc}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ccc}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:6px}.table-bordered{border:1px solid #ccc}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ccc}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f7f7f7}.table-hover>tbody>tr:hover{background-color:#ededed}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#ededed}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e1e0e0}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#d1e2bd}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#c4dbab}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#ebf3fb}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#d6e7f6}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fbefdd}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#f8e4c6}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#efc7c7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#eab3b3}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:13.5px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ccc}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:18px;font-size:18px;line-height:inherit;color:#5a5a5a;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;line-height:normal}input[type=file]{display:block}input[type=range]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:12px;line-height:1.5;color:#333}.form-control{display:block;width:100%;height:32px;padding:6px 6px;font-size:12px;line-height:1.5;color:#333;background-color:#fefefe;background-image:none;border:1px solid #bbb;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#aaa;outline:0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(170,170,170,.6)}.form-control::-moz-placeholder{color:#d7d7d7;opacity:1}.form-control:-ms-input-placeholder{color:#d7d7d7}.form-control::-webkit-input-placeholder{color:#d7d7d7}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#f5f5f5;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{line-height:32px}.input-group-sm input[type=date],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],.input-group-sm input[type=time],.input-group-sm>.input-group-btn>input[type=date].btn,.input-group-sm>.input-group-btn>input[type=datetime-local].btn,.input-group-sm>.input-group-btn>input[type=month].btn,.input-group-sm>.input-group-btn>input[type=time].btn,.input-group-sm>input[type=date].form-control,.input-group-sm>input[type=date].input-group-addon,.input-group-sm>input[type=datetime-local].form-control,.input-group-sm>input[type=datetime-local].input-group-addon,.input-group-sm>input[type=month].form-control,.input-group-sm>input[type=month].input-group-addon,.input-group-sm>input[type=time].form-control,.input-group-sm>input[type=time].input-group-addon,input[type=date].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm,input[type=time].input-sm{line-height:26px}.input-group-lg input[type=date],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],.input-group-lg input[type=time],.input-group-lg>.input-group-btn>input[type=date].btn,.input-group-lg>.input-group-btn>input[type=datetime-local].btn,.input-group-lg>.input-group-btn>input[type=month].btn,.input-group-lg>.input-group-btn>input[type=time].btn,.input-group-lg>input[type=date].form-control,.input-group-lg>input[type=date].input-group-addon,.input-group-lg>input[type=datetime-local].form-control,.input-group-lg>input[type=datetime-local].input-group-addon,.input-group-lg>input[type=month].form-control,.input-group-lg>input[type=month].input-group-addon,.input-group-lg>input[type=time].form-control,.input-group-lg>input[type=time].input-group-addon,input[type=date].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg,input[type=time].input-lg{line-height:41.2px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:18px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:30px}.form-control-static.input-lg,.form-control-static.input-sm,.input-group-lg>.form-control-static.form-control,.input-group-lg>.form-control-static.input-group-addon,.input-group-lg>.input-group-btn>.form-control-static.btn,.input-group-sm>.form-control-static.form-control,.input-group-sm>.form-control-static.input-group-addon,.input-group-sm>.input-group-btn>.form-control-static.btn{padding-left:0;padding-right:0}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn,.input-sm{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.input-group-sm>.input-group-btn>select.btn,.input-group-sm>select.form-control,.input-group-sm>select.input-group-addon,select.input-sm{height:26px;line-height:26px}.input-group-sm>.input-group-btn>select[multiple].btn,.input-group-sm>.input-group-btn>textarea.btn,.input-group-sm>select[multiple].form-control,.input-group-sm>select[multiple].input-group-addon,.input-group-sm>textarea.form-control,.input-group-sm>textarea.input-group-addon,select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:26px;padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.form-group-sm select.form-control{height:26px;line-height:26px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:26px;min-height:29px;padding:5px 4px;font-size:11px;line-height:1.5}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn,.input-lg{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.input-group-lg>.input-group-btn>select.btn,.input-group-lg>select.form-control,.input-group-lg>select.input-group-addon,select.input-lg{height:41.2px;line-height:41.2px}.input-group-lg>.input-group-btn>select[multiple].btn,.input-group-lg>.input-group-btn>textarea.btn,.input-group-lg>select[multiple].form-control,.input-group-lg>select[multiple].input-group-addon,.input-group-lg>textarea.form-control,.input-group-lg>textarea.input-group-addon,select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:41.2px;padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.form-group-lg select.form-control{height:41.2px;line-height:41.2px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:41.2px;min-height:33px;padding:13px 12px;font-size:15px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:40px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:32px;height:32px;line-height:32px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-group-lg>.form-control+.form-control-feedback,.input-group-lg>.input-group-addon+.form-control-feedback,.input-group-lg>.input-group-btn>.btn+.form-control-feedback,.input-lg+.form-control-feedback{width:41.2px;height:41.2px;line-height:41.2px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-group-sm>.form-control+.form-control-feedback,.input-group-sm>.input-group-addon+.form-control-feedback,.input-group-sm>.input-group-btn>.btn+.form-control-feedback,.input-sm+.form-control-feedback{width:26px;height:26px;line-height:26px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#79a548}.has-success .form-control{border-color:#79a548;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#5f8139;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #abcb88}.has-success .input-group-addon{color:#79a548;border-color:#79a548;background-color:#d1e2bd}.has-success .form-control-feedback{color:#79a548}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#e8a33d}.has-warning .form-control{border-color:#e8a33d;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#d88b1a;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #f3ce98}.has-warning .input-group-addon{color:#e8a33d;border-color:#e8a33d;background-color:#fbefdd}.has-warning .form-control-feedback{color:#e8a33d}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#c83c3c}.has-error .form-control{border-color:#c83c3c;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#a32e2e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #de8c8c}.has-error .input-group-addon{color:#c83c3c;border-color:#c83c3c;background-color:#efc7c7}.has-error .form-control-feedback{color:#c83c3c}.has-feedback label~.form-control-feedback{top:23px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#404040}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .checkbox,.form-horizontal .radio{min-height:25px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-group:after{content:"";display:table;clear:both}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:13px;font-size:15px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:5px;font-size:11px}}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 6px;font-size:12px;line-height:1.5;border-radius:2px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;background-image:none;box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#eee;border-color:#bbb}.btn-default.focus,.btn-default:focus{color:#333;background-color:#d5d4d4;border-color:#7b7b7b}.btn-default:hover{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{color:#333;background-color:#d5d4d4;border-color:#9c9c9c}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.btn-default.dropdown-toggle.focus,.open>.btn-default.dropdown-toggle:focus,.open>.btn-default.dropdown-toggle:hover{color:#333;background-color:#c3c3c3;border-color:#7b7b7b}.btn-default.active,.btn-default:active,.open>.btn-default.dropdown-toggle{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#eee;border-color:#bbb}.btn-default .badge{color:#eee;background-color:#333}.btn-primary{color:#fff;background-color:#0078e6;border-color:#006bcd}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#005db3;border-color:#00284d}.btn-primary:hover{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{color:#fff;background-color:#005db3;border-color:#004b8f}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.btn-primary.dropdown-toggle.focus,.open>.btn-primary.dropdown-toggle:focus,.open>.btn-primary.dropdown-toggle:hover{color:#fff;background-color:#004b8f;border-color:#00284d}.btn-primary.active,.btn-primary:active,.open>.btn-primary.dropdown-toggle{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#0078e6;border-color:#006bcd}.btn-primary .badge{color:#0078e6;background-color:#fff}.btn-success{color:#fff;background-color:#79a548;border-color:#6c9340}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#5f8139;border-color:#2b3a1a}.btn-success:hover{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{color:#fff;background-color:#5f8139;border-color:#4d692e}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.btn-success.dropdown-toggle.focus,.open>.btn-success.dropdown-toggle:focus,.open>.btn-success.dropdown-toggle:hover{color:#fff;background-color:#4d692e;border-color:#2b3a1a}.btn-success.active,.btn-success:active,.open>.btn-success.dropdown-toggle{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#79a548;border-color:#6c9340}.btn-success .badge{color:#79a548;background-color:#fff}.btn-info{color:#fff;background-color:#6daae0;border-color:#589edc}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#4392d7;border-color:#205e94}.btn-info:hover{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{color:#fff;background-color:#4392d7;border-color:#2b80cb}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.btn-info.dropdown-toggle.focus,.open>.btn-info.dropdown-toggle:focus,.open>.btn-info.dropdown-toggle:hover{color:#fff;background-color:#2b80cb;border-color:#205e94}.btn-info.active,.btn-info:active,.open>.btn-info.dropdown-toggle{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#6daae0;border-color:#589edc}.btn-info .badge{color:#6daae0;background-color:#fff}.btn-warning{color:#fff;background-color:#e8a33d;border-color:#e59826}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#d88b1a;border-color:#7d510f}.btn-warning:hover{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{color:#fff;background-color:#d88b1a;border-color:#b87716}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.btn-warning.dropdown-toggle.focus,.open>.btn-warning.dropdown-toggle:focus,.open>.btn-warning.dropdown-toggle:hover{color:#fff;background-color:#b87716;border-color:#7d510f}.btn-warning.active,.btn-warning:active,.open>.btn-warning.dropdown-toggle{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#e8a33d;border-color:#e59826}.btn-warning .badge{color:#e8a33d;background-color:#fff}.btn-danger{color:#fff;background-color:#c83c3c;border-color:#b73434}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#a32e2e;border-color:#531818}.btn-danger:hover{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{color:#fff;background-color:#a32e2e;border-color:#872626}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.btn-danger.dropdown-toggle.focus,.open>.btn-danger.dropdown-toggle:focus,.open>.btn-danger.dropdown-toggle:hover{color:#fff;background-color:#872626;border-color:#531818}.btn-danger.active,.btn-danger:active,.open>.btn-danger.dropdown-toggle{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c83c3c;border-color:#b73434}.btn-danger .badge{color:#c83c3c;background-color:#fff}.btn-link{color:#212424;font-weight:400;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#000;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#d7d7d7;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:12px 12px;font-size:15px;line-height:1.3333333;border-radius:2px}.btn-group-sm>.btn,.btn-sm{padding:4px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-group-xs>.btn,.btn-xs{padding:2px 4px;font-size:11px;line-height:1.5;border-radius:2px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height,visibility;transition-property:height,visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:12px;text-align:left;background-color:#292929;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:2px;box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:8px 0;overflow:hidden;background-color:#424242}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.5;color:#fff;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{text-decoration:none;color:#fff;background-color:#424242}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;outline:0;background-color:#424242}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#d7d7d7}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:11px;line-height:1.5;color:#d7d7d7;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:992px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar:after{content:"";display:table;clear:both}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group-lg.btn-group>.btn+.dropdown-toggle,.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{box-shadow:none}.btn .caret{margin-left:0}.btn-group-lg>.btn .caret,.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-group-lg>.btn .caret,.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after{content:"";display:table;clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:2px;border-top-left-radius:2px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 6px;font-size:12px;font-weight:400;line-height:1;color:#333;text-align:center;background-color:#f5f5f5;border:1px solid #bbb;border-radius:2px}.input-group-addon.input-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:4px 4px;font-size:11px;border-radius:2px}.input-group-addon.input-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:12px 12px;font-size:15px;border-radius:2px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav:after{content:"";display:table;clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:6px 12px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#f5f5f5}.nav>li.disabled>a{color:#d7d7d7}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#5a5a5a;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#f5f5f5;border-color:#212424}.nav .nav-divider{height:1px;margin:8px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ccc}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.5;border:1px solid transparent;border-radius:2px 2px 0 0}.nav-tabs>li>a:hover{border-color:#d7d7d7 #d7d7d7 #ccc}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#000;background-color:#ededed;border:1px solid #ccc;border-bottom-color:transparent;cursor:default}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:2px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#0078e6}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified,.nav-tabs.nav-justified{width:100%}.nav-justified>li,.nav-tabs.nav-justified>li{float:none}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li,.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a,.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified,.nav-tabs.nav-justified{border-bottom:0}.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:2px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ccc}@media (min-width:768px){.nav-tabs-justified>li>a,.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ccc;border-radius:2px 2px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#ccc}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.pagination{display:inline-block;padding-left:0;margin:18px 0;border-radius:2px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 6px;line-height:1.5;text-decoration:none;color:#212424;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#000;background-color:#f5f5f5;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;background-color:#0078e6;border-color:#0078e6;cursor:default}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#d7d7d7;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:12px 12px;font-size:15px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.pagination-sm>li>a,.pagination-sm>li>span{padding:4px 4px;font-size:11px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:2px;border-top-left-radius:2px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:2px;border-top-right-radius:2px}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label:empty{display:none}.btn .label{position:relative;top:-1px}a.label:focus,a.label:hover{color:#fff;text-decoration:none;cursor:pointer}.label-default{background-color:#d7d7d7}.label-default[href]:focus,.label-default[href]:hover{background-color:#bebdbd}.label-primary{background-color:#0078e6}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#005db3}.label-success{background-color:#79a548}.label-success[href]:focus,.label-success[href]:hover{background-color:#5f8139}.label-info{background-color:#6daae0}.label-info[href]:focus,.label-info[href]:hover{background-color:#4392d7}.label-warning{background-color:#e8a33d}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#d88b1a}.label-danger{background-color:#c83c3c}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#a32e2e}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:11px;font-weight:700;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#737373;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#212424;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.thumbnail{display:block;padding:4px;margin-bottom:18px;line-height:1.5;background-color:#fff;border:1px solid #ddd;border-radius:2px;-webkit-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}.thumbnail .caption{padding:9px;color:#000}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#212424}.alert{padding:11px;margin-bottom:18px;border:1px solid transparent;border-radius:2px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:31px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#79a548;border-color:transparent;color:#fff}.alert-success hr{border-top-color:transparent}.alert-success .alert-link{color:#e6e5e5}.alert-info{background-color:#6daae0;border-color:transparent;color:#fff}.alert-info hr{border-top-color:transparent}.alert-info .alert-link{color:#e6e5e5}.alert-warning{background-color:#e8a33d;border-color:transparent;color:#fff}.alert-warning hr{border-top-color:transparent}.alert-warning .alert-link{color:#e6e5e5}.alert-danger{background-color:#c83c3c;border-color:transparent;color:#fff}.alert-danger hr{border-top-color:transparent}.alert-danger .alert-link{color:#e6e5e5}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:18px;margin-bottom:18px;background-color:#dedede;border-radius:2px;box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0%;height:100%;font-size:11px;line-height:18px;color:#fff;text-align:center;background-color:#0078e6;box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#79a548}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#6daae0}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#e8a33d}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#c83c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:2px;border-top-left-radius:2px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{background-color:#f5f5f5;color:#d7d7d7;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#d7d7d7}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#0078e6;border-color:#0078e6}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#b3dbff}.list-group-item-success{color:#79a548;background-color:#d1e2bd}a.list-group-item-success,button.list-group-item-success{color:#79a548}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#79a548;background-color:#c4dbab}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#79a548;border-color:#79a548}.list-group-item-info{color:#6daae0;background-color:#ebf3fb}a.list-group-item-info,button.list-group-item-info{color:#6daae0}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#6daae0;background-color:#d6e7f6}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#6daae0;border-color:#6daae0}.list-group-item-warning{color:#e8a33d;background-color:#fbefdd}a.list-group-item-warning,button.list-group-item-warning{color:#e8a33d}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#e8a33d;background-color:#f8e4c6}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.list-group-item-danger{color:#c83c3c;background-color:#efc7c7}a.list-group-item-danger,button.list-group-item-danger{color:#c83c3c}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#c83c3c;background-color:#eab3b3}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:18px;background-color:#fff;border:1px solid transparent;border-radius:2px;box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-body:after{content:"";display:table;clear:both}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:1px;border-top-left-radius:1px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:14px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:1px;border-top-left-radius:1px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-left:15px;padding-right:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-right-radius:1px;border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{border-top-left-radius:1px;border-top-right-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:1px}.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:1px;border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:1px;border-bottom-right-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:1px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:1px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ccc}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:18px}.panel-group .panel{margin-bottom:0;border-radius:2px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ccc}.panel-default>.panel-heading{color:#5a5a5a;background-color:#ddd;border-color:#ccc}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ccc}.panel-default>.panel-heading .badge{color:#ddd;background-color:#5a5a5a}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ccc}.panel-primary{border-color:#0078e6}.panel-primary>.panel-heading{color:#fff;background-color:#0078e6;border-color:#0078e6}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#0078e6}.panel-primary>.panel-heading .badge{color:#0078e6;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#0078e6}.panel-success{border-color:#79a548}.panel-success>.panel-heading{color:#79a548;background-color:#d1e2bd;border-color:#79a548}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-success>.panel-heading .badge{color:#d1e2bd;background-color:#79a548}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-info{border-color:#6daae0}.panel-info>.panel-heading{color:#6daae0;background-color:#ebf3fb;border-color:#6daae0}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-info>.panel-heading .badge{color:#ebf3fb;background-color:#6daae0}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-warning{border-color:#e8a33d}.panel-warning>.panel-heading{color:#e8a33d;background-color:#fbefdd;border-color:#e8a33d}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-warning>.panel-heading .badge{color:#fbefdd;background-color:#e8a33d}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-danger{border-color:#c83c3c}.panel-danger>.panel-heading{color:#c83c3c;background-color:#efc7c7;border-color:#c83c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-danger>.panel-heading .badge{color:#efc7c7;background-color:#c83c3c}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#fafafa;border:1px solid #ccc;border-radius:2px;box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:2px}.well-sm{padding:9px;border-radius:2px}.close{float:right;font-size:18px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:5000;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.in{opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header:after{content:"";display:table;clear:both}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.5}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:after{content:"";display:table;clear:both}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:2px;box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:12px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:1px 1px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.tooltip{position:absolute;z-index:1070;display:block;font-family:Verdana,Arial,Helvetica,sans-serif;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:11px;opacity:0}.tooltip.in{opacity:1}.tooltip.top{margin-top:-3px;padding:3px 0}.tooltip.right{margin-left:3px;padding:0 3px}.tooltip.bottom{margin-top:3px;padding:3px 0}.tooltip.left{margin-left:-3px;padding:0 3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#333;border-radius:2px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-left .tooltip-arrow{bottom:0;right:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.top-right .tooltip-arrow{bottom:0;left:3px;margin-bottom:-3px;border-width:3px 3px 0;border-top-color:#333}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-3px;border-width:3px 3px 3px 0;border-right-color:#333}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-3px;border-width:3px 0 3px 3px;border-left-color:#333}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-left .tooltip-arrow{top:0;right:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.tooltip.bottom-right .tooltip-arrow{top:0;left:3px;margin-top:-3px;border-width:0 3px 3px;border-bottom-color:#333}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;max-width:100%;height:auto;line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;transition:-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out;transition:transform .6s ease-in-out,-webkit-transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);left:0}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);left:0}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:transparent}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{outline:0;color:#fff;text-decoration:none;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:transparent}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}html{height:100%;overflow:hidden}body{height:100%;overflow:auto}.scaffold{background-color:#f5f5f5;color:#333;position:relative;padding-top:45px;height:100vh}.scaffold-topbar{background-color:#151515;color:#f5f5f5;height:45px;position:fixed;top:0;right:0;left:0}.scaffold-modulemenu{background-color:#292929;color:#f5f5f5;position:fixed;top:45px;left:0;bottom:0;width:40px;max-width:100%;z-index:1000;overflow:hidden}.scaffold-modulemenu a{color:rgba(245,245,245,.7)}.scaffold-modulemenu a:hover{color:#f5f5f5}.scaffold-modulemenu .active>a{color:#f5f5f5}.scaffold-toolbar{overflow:auto;background-color:#292929;color:#f5f5f5;z-index:1000;position:fixed;top:45px;left:0;right:0;bottom:0;display:none}.scaffold-toolbar .dropdown-menu a,.scaffold-toolbar a{color:rgba(245,245,245,.7)}.scaffold-toolbar .dropdown-menu a:focus,.scaffold-toolbar .dropdown-menu a:hover,.scaffold-toolbar a:focus,.scaffold-toolbar a:hover{color:#f5f5f5}.scaffold-toolbar .active>a{color:#f5f5f5}@media (min-width:992px){.scaffold-toolbar{overflow:visible;background-color:transparent;height:45px;top:0;left:auto;bottom:auto;display:block}}@media (max-width:991px){.scaffold-search-expanded .scaffold-toolbar,.scaffold-toolbar-expanded .scaffold-toolbar{display:block}}.scaffold-content{position:fixed!important;top:45px;left:0;right:0;bottom:0}@media (max-width:991px){.scaffold-content{left:0!important}}.scaffold-content-module-iframe,.scaffold-content-navigation-iframe{display:block;border:none;height:100%;width:100%}.scaffold-content-navigation{display:none;position:absolute!important;left:0;top:0;bottom:0;width:300px}.scaffold-content-navigation-component{position:absolute;top:0;bottom:0;left:0;right:0}.scaffold-content-navigation-component #typo3-pagetree-treeContainer>div>.x-panel-body{overflow:auto}.scaffold-content-module{position:absolute!important;top:0;left:0;bottom:0;right:0}@media (max-width:767px){.scaffold-content-module{width:100%}}.scaffold-content-overlay{display:none;position:absolute;z-index:1040;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.65)}.scaffold-modulemenu-expanded .scaffold-content-overlay{display:block}@media (min-width:992px){.scaffold-modulemenu-expanded .scaffold-content-overlay{display:none}}@media (min-width:992px){.scaffold{padding-left:40px}}.scaffold .scaffold-modulemenu{width:40px}@media (max-width:991px){.scaffold .scaffold-modulemenu{display:none}}.scaffold-modulemenu-expanded{display:block;padding-left:230px}.scaffold-modulemenu-expanded .scaffold-modulemenu{width:230px}@media (max-width:991px){.scaffold-modulemenu-expanded .scaffold-modulemenu{display:block}}.scaffold-modulemenu-expanded .scaffold-content{-webkit-transform:translate(230px,0);transform:translate(230px,0)}.scaffold-content-navigation-expanded .scaffold-content-navigation{display:block}.scaffold-content-navigation-expanded .scaffold-content-module{left:300px}@media (min-width:992px){.scaffold .scaffold-content{left:40px}.scaffold-modulemenu-expanded .scaffold-content{left:230px;-webkit-transform:none;transform:none}}.topbar{background-color:inherit;position:relative;height:45px}.topbar a{color:inherit;text-decoration:none}.topbar-button{position:absolute;top:0;display:inline-block;border:0;background-color:#151515;height:45px;width:40px}.topbar-button:focus,.topbar-button:hover{background-color:#1d1d1d}.topbar-button[disabled],.topbar-button[disabled]:focus,.topbar-button[disabled]:hover{background-color:#292929;cursor:not-allowed;opacity:.5}.topbar-button.topbar-button-modulemenu{left:0}@media (min-width:992px){.topbar-button.topbar-button-modulemenu{background-color:#292929}}.topbar-button.topbar-button-navigationcomponent{left:40px}.topbar-button.topbar-button-toolbar{right:40px}.topbar-button.topbar-button-search{right:0}.scaffold-modulemenu-expanded .topbar-button.topbar-button-modulemenu{background-color:#292929}.scaffold-content-navigation-expanded .topbar-button-navigationcomponent{background-color:#292929}@media (max-width:991px){.scaffold-toolbar-expanded .toolbar-item-search{display:none}}.scaffold-toolbar-expanded .topbar-button-toolbar{background-color:#292929}@media (max-width:991px){.scaffold-search-expanded .toolbar-item{display:none}.scaffold-search-expanded .toolbar-item-search{display:block;width:100%}}.scaffold-search-expanded .topbar-button-search{background-color:#292929}.topbar-button-search,.topbar-button-toolbar{display:block}@media (min-width:992px){.topbar-button-search,.topbar-button-toolbar{display:none}}.topbar-header{padding-left:80px}@media (max-width:991px){.topbar-header{padding-right:80px!important}}.topbar-header-site{overflow:hidden;position:relative;max-width:100%;height:45px;line-height:45px;padding-left:1em;padding-right:1em;white-space:nowrap}.topbar-header-site:after,.topbar-header-site:before{display:block;content:'';position:absolute;top:0;bottom:0;width:1em}.topbar-header-site:before{right:0;background:#151515}.topbar-header-site:after{right:1em;background:-webkit-linear-gradient(left,rgba(21,21,21,0) 0,#151515 100%);background:linear-gradient(to right,rgba(21,21,21,0) 0,#151515 100%)}.typo3-in-workspace .topbar-header-site{background-color:#6d860d}.typo3-in-workspace .topbar-header-site:before{background:#6d860d}.typo3-in-workspace .topbar-header-site:after{background:-webkit-linear-gradient(left,rgba(109,134,13,0) 0,#6d860d 100%);background:linear-gradient(to right,rgba(109,134,13,0) 0,#6d860d 100%)}.topbar-header-site-logo{height:45px;display:none;padding-right:.5em}@media (min-width:320px){.topbar-header-site-logo{display:inline-block}}.topbar-header-site-title{line-height:1.2em;display:inline-block;vertical-align:middle}.topbar-header-site-name{display:block}.topbar-header-site-version{opacity:.5}.toolbar{padding:8px}@media (min-width:992px){.toolbar{padding:0;background-color:#151515}}.toolbar:after{clear:both;display:table;content:''}.toolbar-list{list-style:none;padding:0;margin:0}.toolbar-list:after{clear:both;display:table;content:''}@media (min-width:992px){.toolbar-list li:last-child{width:300px}}.toolbar-item{padding:4px;position:relative;display:block;float:left;width:100%}@media (min-width:600px){.toolbar-item{width:50%}}@media (min-width:750px){.toolbar-item{width:33.33%}}@media (min-width:992px){.toolbar-item{padding:0;width:auto;margin-left:1px}}.toolbar-item .dropdown-menu{width:350px}.toolbar-item .dropdown-menu .text-muted{color:#8c8c8c}.toolbar-item .dropdown-menu a:focus .text-muted,.toolbar-item .dropdown-menu a:hover .text-muted{color:#a6a6a6}@media (max-width:991px){.toolbar-item .dropdown-menu{overflow:auto;padding:15px;position:fixed;max-height:90%;max-width:90%;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.toolbar-item .dropdown-backdrop{background:rgba(0,0,0,.65)}}.toolbar-item-avatar{width:28px;margin-right:2px;display:inline-block}.toolbar-item-avatar .avatar{position:absolute;top:50%;left:10px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.toolbar-item-avatar .avatar,.toolbar-item-avatar .avatar-image{height:28px;width:28px}.toolbar-item-badge{position:absolute;bottom:4px;right:4px;padding:3px 4px;border-radius:0;font-size:10px;font-weight:400;min-width:16px}.toolbar-item-link{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border:1px solid rgba(0,0,0,.5);position:relative;display:block;text-decoration:none;padding:9px 10px;height:45px;line-height:27px}.toolbar-item-link:focus,.toolbar-item-link:hover{text-decoration:none}@media (min-width:992px){.toolbar-item-link{border:none}}.open .toolbar-item-link{background-color:#292929}@media (min-width:992px){.toolbar-item-title{display:none}}.toolbar-item-search form{padding:0;margin:0}.toolbar-item-search .toolbar-item-link{padding:0;margin:0;height:0}.toolbar-item-search .form-group{margin:0}.toolbar-item-search .close{color:#fff;text-shadow:none;opacity:1}@media (max-width:991px){.toolbar-item-search .dropdown-menu{top:114px;left:14px;right:14px;width:auto;max-width:none;max-height:none;-webkit-transform:none;transform:none;bottom:14px}}@media (min-width:992px){.toolbar-item-search .dropdown-menu{left:auto;right:0}}.toolbar-item-search .autocomplete-suggestions{position:static!important}.toolbar-item-search .autocomplete-suggestion{border:none}.toolbar-item-search.open .toolbar-item-search-form{position:relative;z-index:991}.toolbar-item-search-field{color:inherit;background-color:#2f2f2f;margin:0;border-radius:0;border:1px solid rgba(0,0,0,.5);height:45px;box-shadow:none}@media (min-width:992px){.toolbar-item-search-field{border:none}}.toolbar-item-search-field:hover{background-color:#333}.toolbar-item-search-field:focus{box-shadow:none;background-color:#555}.module-wrapper{position:relative}.module-wrapper iframe{border:none}.modulemenu .modulemenu-group-container{clear:both}.modulemenu .modulemenu-group{position:relative;padding:5px 0;border-bottom:1px solid rgba(0,0,0,.2)}.modulemenu .modulemenu-group-header,.modulemenu .modulemenu-item-link{position:relative;display:block;cursor:pointer;padding:2px 4px;text-decoration:none}.modulemenu .modulemenu-group-header{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-transform:uppercase}.modulemenu .modulemenu-item-link:focus,.modulemenu .modulemenu-item-link:hover{outline:0;background-color:rgba(0,0,0,.1)}.modulemenu .modulemenu-item.active .modulemenu-item-link{background-color:rgba(0,0,0,.15)}.modulemenu .modulemenu-icon{float:left;margin-right:4px}.modulemenu .modulemenu-icon .fa{font-size:.5em}.modulemenu .modulemenu-group-title,.modulemenu .modulemenu-item-title{white-space:nowrap;text-overflow:ellipsis;padding-top:7px;padding-left:4px;display:none;overflow:hidden}.modulemenu .modulemenu-group-title{padding-right:20px}.modulemenu .modulemenu-group-title .caret{-webkit-transform:rotate(90deg);transform:rotate(90deg);position:absolute;top:17px;right:18px}.modulemenu .expanded .modulemenu-group-title .caret{-webkit-transform:rotate(0);transform:rotate(0)}.scaffold-modulemenu-expanded .modulemenu-group-title,.scaffold-modulemenu-expanded .modulemenu-item-title{display:block}.autocomplete{position:relative}.autocomplete-results{z-index:1000;position:absolute;margin:5px 0;top:100%;left:0;border:1px solid #ddd;border-radius:2px;background-color:#fff;overflow:hidden;box-shadow:0 1px 0 0 rgba(0,0,0,.25)}.autocomplete-suggestion{border-top:1px solid #ddd}.autocomplete-suggestion:first-child{border-top:none}.autocomplete-suggestion-link{padding:5px 13px 5px 28px;display:block;text-decoration:none}.autocomplete-selected .autocomplete-suggestion-link,.autocomplete-suggestion-link:hover{background-color:#fafafa;text-decoration:none}.autocomplete-info{padding:5px 15px}.dropdown-menu{line-height:1.45em;border:0;margin:0;border-radius:0;color:#fff}.dropdown-menu a{color:inherit;display:block}.dropdown-menu a:focus,.dropdown-menu a:hover{color:inherit;text-decoration:none}.dropdown-menu hr{border-top:1px solid rgba(0,0,0,.35);margin:1.25em -15px}.dropdown-menu>:last-child{margin-bottom:0}.dropdown-menu .form-group{margin-bottom:.75em}.dropdown-menu .form-control{border-color:#aaa;color:inherit;border-radius:0;background-color:#333}.dropdown-menu .form-control:focus{box-shadow:none;border-color:#bbb}.dropdown-menu .btn{border:none;border-radius:0;padding:6px 10px}.dropdown-headline{font-size:1.15em;margin-top:0;margin-bottom:.5em}.dropdown-text a{display:inline-block}div.dropdown-menu{padding:1.5em}.dropdown-list{padding-left:0;list-style:none}.dropdown-list>li{position:relative}.dropdown-list>li+li{margin-top:.5em}.dropdown-list-link{display:block;text-decoration:none}.dropdown-list-link:focus,.dropdown-list-link:hover{text-decoration:none}.dropdown-table{display:table;width:100%}.dropdown-table-row{display:table-row}.dropdown-table-column{display:table-cell;padding-top:.25em;padding-bottom:.25em;vertical-align:middle}.dropdown-table-column-top{vertical-align:top}.dropdown-table-icon{width:16px;padding-right:.5em}.dropdown-table-title{white-space:nowrap;padding-right:1.5em}.dropdown-table-title-ellipsis{max-width:230px;overflow:hidden;display:block;white-space:nowrap;text-overflow:ellipsis}.dropdown-table-actions{white-space:nowrap;text-align:right}.dropdown-table-actions-btn{text-align:center;display:inline-block!important;margin-top:-4px;margin-bottom:-4px;padding:4px;vertical-align:middle}.dropdown-table-actions-btn-close:hover,.dropdown-table-actions-btn-edit:hover{background-color:#333}.dropdown-table-actions-btn-delete:hover{background-color:#c83c3c}.avatar{position:relative;display:inline-block;height:32px;width:32px;vertical-align:middle}.avatar-image{display:block;height:32px;width:32px;overflow:hidden;border-radius:50%}.avatar-image:after{display:block;content:'';position:absolute;top:0;left:0;height:100%;width:100%;border-radius:50%;border:1px solid rgba(255,255,255,.1)}.avatar-image>img{display:block;width:100%!important;height:auto!important}.avatar-icon{position:absolute;bottom:0;right:0;height:16px;width:16px}.callout{background-color:#f0f0f0;border-left:3px solid #ccc;margin:20px 0;padding:20px;color:#333}.callout .media{margin:0}.callout .media .fa-stack{color:#fff}.callout .media .fa-stack>.fa:first-child{color:#ccc}.callout .media-body{vertical-align:middle}.callout-icon{margin-top:-2px}.callout-title{font-size:1.3em;margin:0 0 .5em}.callout-body>:last-child{margin-bottom:0}.callout-sm{margin:10px 0;padding:10px}.callout-sm .callout-title{font-size:1em;margin:0}.callout-success{background-color:#d1e2bd;border-color:#79a548;color:#333}.callout-success .media{margin:0}.callout-success .media .fa-stack{color:#fff}.callout-success .media .fa-stack>.fa:first-child{color:#79a548}.callout-info{background-color:#ebf3fb;border-color:#6daae0;color:#333}.callout-info .media{margin:0}.callout-info .media .fa-stack{color:#fff}.callout-info .media .fa-stack>.fa:first-child{color:#6daae0}.callout-warning{background-color:#fbefdd;border-color:#e8a33d;color:#333}.callout-warning .media{margin:0}.callout-warning .media .fa-stack{color:#fff}.callout-warning .media .fa-stack>.fa:first-child{color:#e8a33d}.callout-danger{background-color:#efc7c7;border-color:#c83c3c;color:#333}.callout-danger .media{margin:0}.callout-danger .media .fa-stack{color:#fff}.callout-danger .media .fa-stack>.fa:first-child{color:#c83c3c}.callout-notice{background-color:#f9f9f9;border-color:#a0a0a0;color:#333}.callout-notice .media{margin:0}.callout-notice .media .fa-stack{color:#fff}.callout-notice .media .fa-stack>.fa:first-child{color:#a0a0a0}.icon{position:relative;display:inline-block;overflow:hidden;white-space:nowrap;vertical-align:-22%}.icon img,.icon svg{display:block;height:100%;width:100%;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.icon *{display:block;line-height:inherit}.icon-markup{position:absolute;display:block;text-align:center;top:0;left:0;right:0;bottom:0}.icon-overlay{position:absolute;bottom:0;right:0;height:68.75%;width:68.75%;text-align:center}.icon-color{fill:currentColor}.icon-spin .icon-markup{-webkit-animation:icon-spin 2s infinite linear;animation:icon-spin 2s infinite linear}@-webkit-keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes icon-spin{0%{-webkit-transform:rotate(0);transform:rotate(0)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.icon-state-disabled .icon-markup{opacity:.5}.icon-size-small{height:16px;width:16px;line-height:16px}.icon-size-small .icon-unify{line-height:16px;font-size:14px}.icon-size-small .icon-overlay .icon-unify{line-height:10px;font-size:9px}.icon-size-default{height:32px;width:32px;line-height:32px}.icon-size-default .icon-unify{line-height:32px;font-size:28px}.icon-size-default .icon-overlay .icon-unify{line-height:20px;font-size:18px}.icon-size-large{height:48px;width:48px;line-height:48px}.icon-size-large .icon-unify{line-height:48px;font-size:42px}.icon-size-large .icon-overlay .icon-unify{line-height:30px;font-size:26px}.icon-actions-edit-copy-release,.icon-actions-edit-cut-release,.icon-status-dialog-error,.icon-status-status-current,.icon-status-status-permission-denied{color:#c83c3c}.icon-status-status-sorting-light-asc,.icon-status-status-sorting-light-desc{color:#fff}.icon-status-status-sorting-asc,.icon-status-status-sorting-desc{color:#737373}.icon-status-dialog-information{color:#6daae0}.icon-status-dialog-ok,.icon-status-status-permission-granted{color:#79a548}.icon-status-dialog-notification{color:#333}.icon-status-dialog-warning{color:#e8a33d}.diff{background-color:#fff;border:1px solid #ccc;display:table}.diff-item{display:table-row}.diff-item+.diff-item{border-top:1px solid #ccc}.diff-item-result,.diff-item-title{padding:10px;display:table-cell}.diff-item-title{background-color:#fafafa;padding-right:10px;font-style:italic;white-space:nowrap}.diff-item-result{font-family:Menlo,Monaco,Consolas,"Courier New",monospace;width:100%;white-space:pre;word-break:break-all;word-wrap:break-word}.diff-item-result del{color:#c80c05;background-color:#fff6f6;text-decoration:none}.diff-item-result ins{color:#44a512;background-color:#ebfce3;text-decoration:none}.diff-item-result.diff-item-result-inline{white-space:normal}.module{min-height:100%;width:100%;background-color:#fff;color:inherit}.module-dark{background-color:#333;color:#ccc}.module-loading-indicator{min-height:5px;width:100%;z-index:999999}.module-loading-indicator.nprogress-custom-parent{position:fixed;top:0}.module-docheader{position:fixed;width:100%;top:0;left:0;min-height:65px;z-index:300;background-color:#eee;border-bottom:1px solid #c3c3c3;padding:0 24px;-webkit-transition:margin-top .3s ease-in-out;transition:margin-top .3s ease-in-out}.module-docheader .module-docheader-bar{min-height:26px;margin:4px 0;line-height:26px}.module-docheader .module-docheader-bar.row{margin-left:-15px;margin-right:-15px}.module-docheader .module-docheader-bar label{margin-top:0;margin-bottom:0}.module-docheader .module-docheader-bar .form-inline .form-group{display:table}.module-docheader .module-docheader-bar .form-inline .form-group label{display:table-cell;font-size:11px;font-weight:400;line-height:16px;padding:4px;border-radius:2px 0 0 2px;border:1px solid #bbb;border-right:0;background-color:rgba(0,0,0,.05)}.module-docheader .module-docheader-bar .form-inline .form-group label+select{display:table-cell;border-top-left-radius:0;border-bottom-left-radius:0}.module-docheader .module-docheader-bar .form-group{vertical-align:top;margin:0;display:inline-block}.module-docheader .module-docheader-bar .form-group .form-control{vertical-align:top}.module-docheader .module-docheader-bar .form-inline-spaced{margin:0}.module-docheader .module-docheader-bar .panel{margin:0;border-left:none;border-right:none;border-bottom:none;border-radius:0;margin-left:-24px;margin-right:-24px;background-color:#fafafa;box-shadow:none}.module-docheader .module-docheader-bar .panel .panel-body{padding:8px 24px}@media (max-width:768px){.module-docheader .module-docheader-bar .text-right{text-align:left}}.module-docheader .module-docheader-bar-search{margin-bottom:0}.module-docheader .module-docheader-bar-column-left{float:left}.module-docheader .module-docheader-bar-column-right{float:right}.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:nowrap}@media (max-width:768px){.module-docheader-bar-navigation .module-docheader-bar-column-left{white-space:normal}}.module-docheader-bar-navigation .form-group select{width:100%}.module-body{padding:24px 24px}.module-body>.callout:first-child{margin-top:0}.module-body>.container{padding-left:0;padding-right:0}.module-body .container-small{max-width:768px;margin:0 auto}.module-docheader+.module-body{padding-top:89px}.panel{display:block}.panel:focus,.panel:hover{text-decoration:none}.panel-heading a,.panel-heading a:active,.panel-heading a:focus,.panel-heading a:hover{text-decoration:none;color:inherit}.panel-heading-left{float:left}.panel-heading-right{float:right}.panel-title{font-size:12px}.panel-title-icon,.panel-title-name{display:inline-block;vertical-align:middle}.panel-body>:first-child{margin-top:0}.panel-body>:last-child{margin-bottom:0}.panel-body-highlightlinks>p>a{text-decoration:underline}.panel-table td:first-child,.panel-table th:first-child{padding-left:15px}.panel-table td:last-child,.panel-table th:last-child{padding-right:15px}.panel-progress{background-color:#eee;height:3px;position:relative;width:100%}.panel-progress .panel-progress-bar{display:block;height:100%;background-color:#444}.panel-active{border-color:#444}.panel-active>.panel-heading{color:#fff;background-color:#666;border-color:#444}.panel-active>.panel-heading+.panel-collapse>.panel-body{border-top-color:#444}.panel-active>.panel-heading .badge{color:#666;background-color:#fff}.panel-active>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#444}.clearfix:after,.dropdown-list>li:after,.module-docheader .module-docheader-bar:after,.module-docheader:after,.modulemenu .modulemenu-group-header:after,.modulemenu .modulemenu-item-link:after,.panel-heading:after{content:"";display:table;clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs{display:none!important}.visible-sm{display:none!important}.visible-md{display:none!important}.visible-lg{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (max-width:767px){.visible-xs-block{display:block!important}}@media (max-width:767px){.visible-xs-inline{display:inline!important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline!important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline!important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}@media (min-width:1200px){.visible-lg-block{display:block!important}}@media (min-width:1200px){.visible-lg-inline{display:inline!important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block!important}}@media (max-width:767px){.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:block!important}table.visible-print{display:table!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}}.chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.chosen-container *{box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15);clip:rect(0,0,0,0)}.chosen-container.chosen-with-drop .chosen-drop{clip:auto}.chosen-container a{cursor:pointer}.chosen-container .chosen-single .group-name,.chosen-container .search-choice .group-name{margin-right:4px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:#999}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:2px;background-color:#fff;background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;font-size:1em;font-family:sans-serif;line-height:normal}.chosen-container-single .chosen-drop{margin-top:-1px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;clip:rect(0,0,0,0)}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#e8a33d;color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto;border:1px solid #aaa;background-color:#fff;cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:0 0!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;width:25px}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:4px 20px 4px 5px;max-width:100%;background-color:#e8a33d;background-clip:padding-box;color:#fff;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:5px;display:block;width:12px;height:12px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{text-decoration:none}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:after{content:"ï€";font-family:FontAwesome;padding-left:2px;vertical-align:top;color:#fff}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:none;background:0 0}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:none}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}.gridder{margin:15px;margin-left:-15px;margin-right:-15px;padding:0;list-style-type:none;font-size:0}.gridder-list,.gridder-show{font-size:12px}.gridder-list{display:inline-block;vertical-align:top;padding-left:15px;padding-right:15px;position:relative}.gridder-list.selectedItem:after{position:absolute;border:15px solid transparent;border-bottom-color:#fff;border-top:0;bottom:0;left:50%;margin-left:-7.5px;content:''}.gridder-list .gridder-item{background-color:#fff;box-shadow:0 2px 0 rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:30px;padding:10px;min-height:200px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform;cursor:pointer;position:relative}.gridder-list .gridder-item:focus,.gridder-list .gridder-item:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 3px 0 rgba(0,0,0,.3)}.gridder-list .gridder-item .label{padding:3px 6px;font-size:12px;vertical-align:top;border-radius:10px;min-width:28px;display:inline-block}.gridder-show{background-color:#fff;display:block;float:left;width:100%;position:relative;margin-bottom:15px}.gridder-show .gridder-padding{padding:30px}.gridder-show .gridder-title{border-bottom:1px solid #ccc;margin-bottom:15px}.gridder-content{display:none}.gridder-list{width:100%}@media (min-width:768px){.gridder-list{width:50%}}@media (min-width:992px){.gridder-list{width:25%}}.card{overflow:hidden;border-radius:2px;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;box-shadow:0 1px 1px rgba(0,0,0,.2);border:1px solid #ccc;margin-bottom:20px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;-webkit-transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,-webkit-transform;transition-property:box-shadow,border,transform;transition-property:box-shadow,border,transform,-webkit-transform}a.card:hover{text-decoration:none;border:1px solid #b3b2b2;-webkit-transform:translate(0,-1px);transform:translate(0,-1px);box-shadow:0 2px 1px rgba(0,0,0,.3)}.card-container{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:10px -10px}.card-container .card{margin-left:10px;margin-right:10px}.card-size-large,.card-size-medium,.card-size-small{width:calc(100% - 20px)}@media (min-width:768px){.card-size-small{width:calc(50% - 20px)}}@media (min-width:992px){.card-size-small{width:calc(25% - 20px)}}@media (min-width:768px){.card-size-medium{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-large{width:calc(100% - 20px)}}.card-size-fixed-small{width:calc(100% - 20px)}@media (min-width:624px){.card-size-fixed-small{width:calc(50% - 20px)}}@media (min-width:768px){.card-size-fixed-small{width:300px}}.card-content,.card-footer,.card-header,.card-image{padding:1.5em 1.5em 0 1.5em}.card-content:last-child,.card-footer:last-child,.card-header:last-child,.card-image:last-child{padding-bottom:1.5em}.card-content :first-child,.card-footer :first-child,.card-header :first-child,.card-image :first-child{margin-top:0}.card-content :last-child,.card-footer :last-child,.card-header :last-child,.card-image :last-child{margin-bottom:0}.card-image{position:relative;padding-left:0;padding-right:0}.card-image:first-child{padding-top:0}.card-image:first-child .card-image-badge{top:.75em}.card-image:last-child{padding-bottom:0}.card-image .card-image-badge{position:absolute;top:1.5em;right:.75em}.card-image img{display:block;height:auto;width:100%;margin:0 auto}.card-header .card-icon{float:left;margin-right:.75em}.card-header .card-header-body{display:block;overflow:hidden}.card-header .card-title{font-family:inherit;font-weight:500;display:block;font-size:1.35em;line-height:1.2em;margin:0}.card-header .card-subtitle{display:block;margin-top:.5em;font-size:1em;line-height:1.2em;opacity:.5}.card-header .card-longdesc{margin-top:1em}.card-content{height:100%}.minicolors{position:relative}.userTS .minicolors{position:absolute}.userTS .minicolors-panel{margin-top:31px}.userTS .minicolors-swatch{z-index:100000}.minicolors-sprite{background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Images/colorpicker/jquery.minicolors.png)}.minicolors-swatch{position:absolute;vertical-align:middle;background-position:-80px 0;cursor:text;padding:0;margin:0;display:inline-block;top:50%;left:6px;z-index:2;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);width:20px;height:20px;border-radius:1px}.minicolors-swatch-color{position:absolute;top:0;left:0;right:0;bottom:0;border-radius:inherit}.minicolors-input{float:none;padding-left:32px}.minicolors-panel{margin-top:1px;overflow:hidden;border-radius:2px;position:absolute;width:173px;height:152px;background:#fff;border:solid 1px #bbb;box-shadow:0 0 20px rgba(0,0,0,.2);z-index:99999;box-sizing:content-box;display:none}.minicolors-panel.minicolors-with-swatches{height:182px}.minicolors-panel.minicolors-visible{display:block}.minicolors-position-top .minicolors-panel{top:-154px}.minicolors-position-right .minicolors-panel{right:0}.minicolors-position-bottom .minicolors-panel{top:auto}.minicolors-position-left .minicolors-panel{left:0}.minicolors-with-opacity .minicolors-panel{width:194px}.minicolors .minicolors-grid{position:absolute;top:1px;left:1px;width:150px;height:150px;background-position:-120px 0;cursor:crosshair}.minicolors .minicolors-grid-inner{position:absolute;top:0;left:0;width:150px;height:150px}.minicolors-slider-saturation .minicolors-grid{background-position:-420px 0}.minicolors-slider-saturation .minicolors-grid-inner{background-position:-270px 0;background-image:inherit}.minicolors-slider-brightness .minicolors-grid{background-position:-570px 0}.minicolors-slider-brightness .minicolors-grid-inner{background-color:#000}.minicolors-slider-wheel .minicolors-grid{background-position:-720px 0}.minicolors-opacity-slider,.minicolors-slider{position:absolute;top:1px;left:152px;width:20px;height:150px;background-color:#fff;background-position:0 0;cursor:row-resize}.minicolors-slider-saturation .minicolors-slider{background-position:-60px 0}.minicolors-slider-brightness .minicolors-slider{background-position:-20px 0}.minicolors-slider-wheel .minicolors-slider{background-position:-20px 0}.minicolors-opacity-slider{left:173px;background-position:-40px 0;display:none}.minicolors-with-opacity .minicolors-opacity-slider{display:block}.minicolors-grid .minicolors-picker{position:absolute;top:70px;left:70px;width:12px;height:12px;border:solid 1px #000;border-radius:10px;margin-top:-6px;margin-left:-6px;background:0 0}.minicolors-grid .minicolors-picker>div{position:absolute;top:0;left:0;width:8px;height:8px;border-radius:8px;border:solid 2px #fff;box-sizing:content-box}.minicolors-picker{position:absolute;top:0;left:0;width:18px;height:2px;background:#fff;border:solid 1px #000;margin-top:-2px;box-sizing:content-box}.minicolors-swatches,.minicolors-swatches li{margin:0;padding:0;list-style:none;overflow:hidden;position:absolute;top:157px;left:5px}.minicolors-swatches .minicolors-swatch{position:relative;float:left;cursor:pointer;margin:0 4px 0 0;top:0;left:0;width:20px;height:20px}.minicolors-with-opacity .minicolors-swatches .minicolors-swatch{margin-right:7px}.minicolors-swatch.selected{border-color:#000}::-ms-clear{display:none}#typo3-docbody form{margin-bottom:1.25em}a.typo3-goBack{font-weight:700}a.typo3-goBack img{margin-right:5px;vertical-align:middle}span.typo3-moduleHeader img{margin-right:4px;vertical-align:middle}.has-change .checkbox,.has-change .checkbox-inline,.has-change .control-label,.has-change .help-block,.has-change .radio,.has-change .radio-inline,.has-change.checkbox label,.has-change.checkbox-inline label,.has-change.radio label,.has-change.radio-inline label{color:#6daae0}.has-change .form-control{border-color:#6daae0;box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-change .form-control:focus{border-color:#4392d7;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c1dbf2}.has-change .input-group-addon{color:#6daae0;border-color:#6daae0;background-color:#ebf3fb}.has-change .form-control-feedback{color:#6daae0}.has-change .thumbnail-status{border:1px solid #6daae0}.input-group-icon{width:32px;vertical-align:middle}.input-group-icon img{width:100%;max-height:18px}.input-group-addon{min-width:2.5em}label .icon img{pointer-events:none}.form-control{min-width:120px}.form-control-adapt{width:auto;max-width:100%}.form-control-wrap{margin:9px 0}.form-control-holder{position:relative}.row>.form-group>.form-control-wrap{margin-bottom:0}.form-group .t3js-formengine-field-item{position:relative}.form-group .t3js-formengine-field-item>.t3js-charcounter{left:0;position:absolute;top:100%}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{color:#737373}.form-control-icon{position:absolute;top:50%;left:15px;-webkit-transform:translate(0,-50%);transform:translate(0,-50%);z-index:1}.form-control-icon+.form-control,.form-control-icon+.form-control-clearable .form-control{padding-left:3.25em}.form-group.has-error label:before{font-family:FontAwesome;font-size:12px;text-align:center;content:"ïª";color:#c83c3c;display:inline-block}.form-group.has-error .btn-toolbar label:before{font-family:inherit;font-size:inherit;margin-right:inherit;text-align:inherit;content:'';color:inherit;display:block}.form-group.has-error .input-group-btn label{border-color:#c83c3c}.form-group.has-error .input-group-btn label .t3-icon{color:#c83c3c}.form-group.has-error .input-group-btn label:before{font-family:inherit;font-size:inherit;margin-right:inherit;text-align:inherit;content:'';color:inherit;display:block}select.form-control[multiple],select.form-control[size]{min-height:156px;width:100%!important}select.form-control[size="1"]{height:32px;min-height:0}select.form-control:not([size]),select.form-control[size="1"]{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:not([size])::-ms-expand,select.form-control[size="1"]::-ms-expand{display:none}select.form-control:not([size]):not(.form-select-no-siblings),select.form-control[size="1"]:not(.form-select-no-siblings){background-image:url(../../../../../../typo3/sysext/core/Resources/Public/Icons/T3Icons/actions/actions-view-list-expand.svg);background-position:right 4px center;background-repeat:no-repeat;background-size:16px 16px;padding-right:24px}.form-group-sm select.form-control:not([size]),.form-group-sm select.form-control[size="1"],.input-group-sm>.input-group-btn>select.form-control.btn:not([size]),.input-group-sm>.input-group-btn>select.form-control[size="1"].btn,.input-group-sm>select.form-control:not([size]),.input-group-sm>select.form-control[size="1"],select.form-control:not([size]).input-sm,select.form-control[size="1"].input-sm{line-height:16px}select.form-control>optgroup{margin-top:9px}select.form-control>optgroup:first-child{margin-top:0}select.form-control option{padding-top:2px;padding-bottom:2px}select.icon-select option{padding-left:22px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}.form-notice-capslock{position:absolute;right:6px;top:50%;margin-top:-10px;height:20px;width:20px;padding:3px;z-index:10;background-color:#fff}.form-notice-capslock>img{display:block;opacity:.5}.form-inline-spaced{margin:0 -.5em 18px}.form-inline-spaced .form-group{margin:.5em .5em 0}.form-inline-spaced .form-group label{margin-right:.5em}.form-group-dashed+.form-group-dashed{padding-top:15px;border-top:1px dashed #ccc}.form-section{border:1px solid #ccc;background-color:#fafafa;padding:15px 12px 3px}.form-section+.form-section{margin-top:-1px}.tab-pane>.form-section:first-child{border-top:none}.form-section-headline{margin-top:0;margin-bottom:10px}.form-wizards-wrap{display:table;width:100%}.form-wizards-wrap>.form-wizards-element{display:table-cell;width:100%}.form-wizards-wrap>.form-wizards-items-top{display:table-row}.form-wizards-wrap>.form-wizards-items-aside{display:table-cell;vertical-align:top;padding-left:5px;white-space:nowrap}.form-wizards-wrap>.form-wizards-items-bottom{display:table-row}.form-wizards-wrap>.form-wizards-items-bottom:first-child{margin-top:4px}.form-irre-header{display:table;margin:-5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.form-irre-header-cell{display:table-cell;vertical-align:middle;white-space:nowrap;padding:5px}.form-irre-header-body{width:100%;font-weight:400;white-space:normal}.form-irre-header-body dl{margin-bottom:0}.form-irre-header-icon{padding-right:0}.form-irre-header-control{cursor:auto}.form-irre-header-control .btn-group>.btn{float:none}.form-multigroup-wrap{width:100%;display:table}.form-multigroup-wrap .form-multigroup-item{display:table-cell;width:50%;vertical-align:top}.form-multigroup-wrap .form-multigroup-item+.form-multigroup-item{padding-left:5px}.form-multigroup-wrap .form-multigroup-item-wizard{margin-bottom:5px}.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[multiple],.form-multigroup-wrap .form-multigroup-item-wizard+select.form-control[size]{min-height:125px}.form-multigroup-wrap .form-wizards-wrap{width:100%}.checkbox-row,.radio-row{margin-top:10px;margin-bottom:5px}.checkbox-column,.radio-column{margin-bottom:5px}.checkbox-column>.checkbox,.checkbox-column>.radio,.radio-column>.checkbox,.radio-column>.radio{margin:0}.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:block;margin-left:0;margin-right:10px;margin-bottom:10px;padding:0}@media (max-width:767px){.checkbox-inline.checkbox+.checkbox,.checkbox-inline.checkbox+.radio,.checkbox-inline.radio+.checkbox,.checkbox-inline.radio+.radio,.radio-inline.checkbox+.checkbox,.radio-inline.checkbox+.radio,.radio-inline.radio+.checkbox,.radio-inline.radio+.radio{margin-top:-5px}}@media (min-width:768px){.checkbox-inline.checkbox,.checkbox-inline.radio,.radio-inline.checkbox,.radio-inline.radio{display:inline-block;margin-top:10px}.checkbox-inline.checkbox label,.checkbox-inline.radio label,.radio-inline.checkbox label,.radio-inline.radio label{white-space:nowrap}}textarea.formengine-textarea{resize:none}#typo3-docheader{background:#eee}#typo3-docheader img,#typo3-docheader input{cursor:pointer}#typo3-docheader .t3-icon{margin-bottom:3px}#typo3-docheader .left{float:left}#typo3-docheader .left .t3-icon{margin-right:6px}#typo3-docheader .right{float:right}#typo3-docheader .right .t3-icon{margin-left:6px}#typo3-docheader .buttongroup{float:left;margin-right:6px}#typo3-docheader .buttongroup .c-inputButton{color:inherit;padding:0}#typo3-docheader .buttongroup input.c-inputButton{text-indent:-1000px}#typo3-docheader select{margin-right:12px}#typo3-docheader a{color:#2d2d2d}#typo3-docheader a:hover{color:#000}#typo3-docheader a.active{color:#c3c3c3}#typo3-docheader a.active span{cursor:default}#typo3-docheader .typo3-docheader-buttons,#typo3-docheader .typo3-docheader-functions{color:#2d2d2d;overflow:hidden;padding:0 24px}#typo3-docheader .typo3-docheader-functions{height:27px;line-height:27px}#typo3-docheader .typo3-docheader-functions select{color:#2d2d2d}#typo3-docheader .typo3-docheader-buttons{height:22px;padding-top:3px;padding-bottom:3px;border-bottom:1px solid #c3c3c3}.alert-notice{background-color:#333;border-color:transparent;color:#fff}.alert-notice hr{border-top-color:transparent}.alert-notice .alert-link{color:#e6e5e5}.alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1);border:0}.alert a{color:inherit;text-decoration:underline}.alert .media{margin:0}.alert .media .fa-stack>.fa:first-child{opacity:.2}.alert .media-body{vertical-align:middle}.alert-title{font-size:1.12em;font-weight:700;margin:0 0 .25em}.alert-body,.alert-message{margin:0;font-size:.9em}.alert-body>:last-child,.alert-message>:last-child{margin-bottom:0}.alert-body>ul,.alert-message>ul{padding-left:1.5em}.alert-dismissible .close{opacity:.5;padding:1px;top:-3px;right:-22px;color:inherit}.alert-dismissible .close:hover{opacity:1;color:inherit}#alert-container{width:400px;position:absolute;right:5px;top:46px;z-index:10000}#alert-container .alert{box-shadow:inset 0 0 0 1px rgba(0,0,0,.1),0 2px 0 0 rgba(0,0,0,.15);position:relative;margin:5px auto}#alert-container .alert.fade.in{opacity:.95}body.backend .module{background:#f5f5f5}.content-area{padding-bottom:35px}.content-area>h3{margin-top:0}.content-area>:last-child{margin-bottom:0}.logo-pageheader img{padding-bottom:3px}img.logo{vertical-align:bottom}.typo3-message>h4{margin-bottom:0}.typo3-message p{margin-top:9px}.t3-install-displaytwinimageimages{border:1px solid #ccc;padding:10px}.t3-install-displaytwinimagetextarea pre{border-top:0}.bg-transparent-emulation{padding:10px;text-align:center;background:url(../../../../../../typo3/sysext/install/Resources/Public/Images/bg_transparent_emulation.png)}.bg-transparent-emulation img{max-width:300px}.alert-notice{background-color:#eee;border-color:#bbb;color:#333}.alert-notice hr{border-top-color:#aeaeae}.alert-notice .alert-link{color:#1a1919}.nav-pills>li>a{border-radius:0}h1:first-child{margin-top:0}.typo3-docheader-buttons,.typo3-docheader-functions{min-height:20px}.item{margin:1em;border:1px solid #ddd}.item .item-heading{padding:1em;background-color:#ddd}.item .item-body{padding:1em}.list-group-item a{display:block}.list-group-item.active a{color:#fff}.caret{border:0;padding-left:10px}.caret:after{position:relative;top:-8px;left:-10px;content:"";font-family:FontAwesome}.collapsed .caret:after{content:"";font-family:FontAwesome}.panel-heading{position:relative}.panel-heading .panel-checkbox{margin:0;position:absolute;left:1em;top:50%;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.panel-heading .panel-checkbox+.panel-title{padding-left:18px}.panel-heading .message{display:block;padding-left:16px;margin-top:5px}a[data-toggle=collapse]{display:block}@media (min-width:992px){.affix-bottom{position:absolute}body.standalone .affix-top{position:relative}.affix{position:fixed;top:35px}body.backend .affix-top{position:fixed;top:35px}body.backend .leftNavigation{min-height:425px}}hr{border-top-color:#ddd}.copyright .panel-default:last-child{margin-bottom:0}#fixed-footer-handler{height:32px}.fixed{position:fixed;bottom:0;background-color:grey}.fixed .footer-innerWrap{padding:1.5em}@media (max-width:991px){#menuWrapper{position:relative!important;margin-bottom:30px}}#mobileMenuWrapper{margin-bottom:10px}#install-menu-button{float:right;margin-bottom:20px}#install-menu-button .navbar-toggle{border:0;background:#fff}#install-menu-button .navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px;background-color:#000}#install-menu-button .navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.form-control-clearable{position:relative}.form-control-clearable .form-control{padding-right:2.3em}.form-control-clearable .close{position:absolute;height:16px;z-index:3;top:50%;right:.5em;-webkit-transform:translate(0,-50%);transform:translate(0,-50%)}.form-control-clearable .close .icon{vertical-align:0}.input-group .form-control-clearable{display:table-cell}.input-group .form-control-clearable .form-control{display:block}a[data-toggle=collapse]{text-decoration:none}.panel-group-flat .panel-body,.panel-group-rst .panel-body{padding-right:0}.panel-flat,.panel-rst,.panel-version{border:0;border-left:2px solid #d7d7d7;border-radius:0;margin:0}.panel-flat.panel-default .panel-heading,.panel-rst.panel-default .panel-heading,.panel-version.panel-default .panel-heading{background:#f5f5f5}.panel-flat.panel-breaking,.panel-flat.panel-danger,.panel-rst.panel-breaking,.panel-rst.panel-danger,.panel-version.panel-breaking,.panel-version.panel-danger{border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading,.panel-flat.panel-danger>.panel-heading,.panel-rst.panel-breaking>.panel-heading,.panel-rst.panel-danger>.panel-heading,.panel-version.panel-breaking>.panel-heading,.panel-version.panel-danger>.panel-heading{color:#fff;background-color:#c83c3c;border-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c83c3c}.panel-flat.panel-breaking>.panel-heading .badge,.panel-flat.panel-danger>.panel-heading .badge,.panel-rst.panel-breaking>.panel-heading .badge,.panel-rst.panel-danger>.panel-heading .badge,.panel-version.panel-breaking>.panel-heading .badge,.panel-version.panel-danger>.panel-heading .badge{color:#c83c3c;background-color:#fff}.panel-flat.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-danger>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-breaking>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c83c3c}.panel-flat.panel-breaking.risk-high>.panel-heading,.panel-flat.panel-danger.risk-high>.panel-heading,.panel-rst.panel-breaking.risk-high>.panel-heading,.panel-rst.panel-danger.risk-high>.panel-heading,.panel-version.panel-breaking.risk-high>.panel-heading,.panel-version.panel-danger.risk-high>.panel-heading{background:#c83c3c;color:#f5f5f5}.panel-flat.panel-breaking.risk-medium>.panel-heading,.panel-flat.panel-danger.risk-medium>.panel-heading,.panel-rst.panel-breaking.risk-medium>.panel-heading,.panel-rst.panel-danger.risk-medium>.panel-heading,.panel-version.panel-breaking.risk-medium>.panel-heading,.panel-version.panel-danger.risk-medium>.panel-heading{background:#f5dbdb;color:#1e1e1e}.panel-flat.panel-breaking.risk-low>.panel-heading,.panel-flat.panel-danger.risk-low>.panel-heading,.panel-rst.panel-breaking.risk-low>.panel-heading,.panel-rst.panel-danger.risk-low>.panel-heading,.panel-version.panel-breaking.risk-low>.panel-heading,.panel-version.panel-danger.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-breaking .panel-progress .panel-progress-bar,.panel-flat.panel-danger .panel-progress .panel-progress-bar,.panel-rst.panel-breaking .panel-progress .panel-progress-bar,.panel-rst.panel-danger .panel-progress .panel-progress-bar,.panel-version.panel-breaking .panel-progress .panel-progress-bar,.panel-version.panel-danger .panel-progress .panel-progress-bar{background-color:#c83c3c}.panel-flat.panel-deprecation,.panel-flat.panel-warning,.panel-rst.panel-deprecation,.panel-rst.panel-warning,.panel-version.panel-deprecation,.panel-version.panel-warning{border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading,.panel-flat.panel-warning>.panel-heading,.panel-rst.panel-deprecation>.panel-heading,.panel-rst.panel-warning>.panel-heading,.panel-version.panel-deprecation>.panel-heading,.panel-version.panel-warning>.panel-heading{color:#fff;background-color:#e8a33d;border-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e8a33d}.panel-flat.panel-deprecation>.panel-heading .badge,.panel-flat.panel-warning>.panel-heading .badge,.panel-rst.panel-deprecation>.panel-heading .badge,.panel-rst.panel-warning>.panel-heading .badge,.panel-version.panel-deprecation>.panel-heading .badge,.panel-version.panel-warning>.panel-heading .badge{color:#e8a33d;background-color:#fff}.panel-flat.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-warning>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-deprecation>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e8a33d}.panel-flat.panel-deprecation.risk-high>.panel-heading,.panel-flat.panel-warning.risk-high>.panel-heading,.panel-rst.panel-deprecation.risk-high>.panel-heading,.panel-rst.panel-warning.risk-high>.panel-heading,.panel-version.panel-deprecation.risk-high>.panel-heading,.panel-version.panel-warning.risk-high>.panel-heading{background:#e8a33d;color:#f5f5f5}.panel-flat.panel-deprecation.risk-medium>.panel-heading,.panel-flat.panel-warning.risk-medium>.panel-heading,.panel-rst.panel-deprecation.risk-medium>.panel-heading,.panel-rst.panel-warning.risk-medium>.panel-heading,.panel-version.panel-deprecation.risk-medium>.panel-heading,.panel-version.panel-warning.risk-medium>.panel-heading{background:#f8e4c6;color:#1e1e1e}.panel-flat.panel-deprecation.risk-low>.panel-heading,.panel-flat.panel-warning.risk-low>.panel-heading,.panel-rst.panel-deprecation.risk-low>.panel-heading,.panel-rst.panel-warning.risk-low>.panel-heading,.panel-version.panel-deprecation.risk-low>.panel-heading,.panel-version.panel-warning.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-deprecation .panel-progress .panel-progress-bar,.panel-flat.panel-warning .panel-progress .panel-progress-bar,.panel-rst.panel-deprecation .panel-progress .panel-progress-bar,.panel-rst.panel-warning .panel-progress .panel-progress-bar,.panel-version.panel-deprecation .panel-progress .panel-progress-bar,.panel-version.panel-warning .panel-progress .panel-progress-bar{background-color:#e8a33d}.panel-flat.panel-feature,.panel-flat.panel-success,.panel-rst.panel-feature,.panel-rst.panel-success,.panel-version.panel-feature,.panel-version.panel-success{border-color:#79a548}.panel-flat.panel-feature>.panel-heading,.panel-flat.panel-success>.panel-heading,.panel-rst.panel-feature>.panel-heading,.panel-rst.panel-success>.panel-heading,.panel-version.panel-feature>.panel-heading,.panel-version.panel-success>.panel-heading{color:#fff;background-color:#79a548;border-color:#79a548}.panel-flat.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#79a548}.panel-flat.panel-feature>.panel-heading .badge,.panel-flat.panel-success>.panel-heading .badge,.panel-rst.panel-feature>.panel-heading .badge,.panel-rst.panel-success>.panel-heading .badge,.panel-version.panel-feature>.panel-heading .badge,.panel-version.panel-success>.panel-heading .badge{color:#79a548;background-color:#fff}.panel-flat.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-success>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-feature>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#79a548}.panel-flat.panel-feature.risk-high>.panel-heading,.panel-flat.panel-success.risk-high>.panel-heading,.panel-rst.panel-feature.risk-high>.panel-heading,.panel-rst.panel-success.risk-high>.panel-heading,.panel-version.panel-feature.risk-high>.panel-heading,.panel-version.panel-success.risk-high>.panel-heading{background:#79a548;color:#f5f5f5}.panel-flat.panel-feature.risk-medium>.panel-heading,.panel-flat.panel-success.risk-medium>.panel-heading,.panel-rst.panel-feature.risk-medium>.panel-heading,.panel-rst.panel-success.risk-medium>.panel-heading,.panel-version.panel-feature.risk-medium>.panel-heading,.panel-version.panel-success.risk-medium>.panel-heading{background:#ddeacf;color:#1e1e1e}.panel-flat.panel-feature.risk-low>.panel-heading,.panel-flat.panel-success.risk-low>.panel-heading,.panel-rst.panel-feature.risk-low>.panel-heading,.panel-rst.panel-success.risk-low>.panel-heading,.panel-version.panel-feature.risk-low>.panel-heading,.panel-version.panel-success.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-feature .panel-progress .panel-progress-bar,.panel-flat.panel-success .panel-progress .panel-progress-bar,.panel-rst.panel-feature .panel-progress .panel-progress-bar,.panel-rst.panel-success .panel-progress .panel-progress-bar,.panel-version.panel-feature .panel-progress .panel-progress-bar,.panel-version.panel-success .panel-progress .panel-progress-bar{background-color:#79a548}.panel-flat.panel-important,.panel-flat.panel-info,.panel-rst.panel-important,.panel-rst.panel-info,.panel-version.panel-important,.panel-version.panel-info{border-color:#6daae0}.panel-flat.panel-important>.panel-heading,.panel-flat.panel-info>.panel-heading,.panel-rst.panel-important>.panel-heading,.panel-rst.panel-info>.panel-heading,.panel-version.panel-important>.panel-heading,.panel-version.panel-info>.panel-heading{color:#fff;background-color:#6daae0;border-color:#6daae0}.panel-flat.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-heading+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#6daae0}.panel-flat.panel-important>.panel-heading .badge,.panel-flat.panel-info>.panel-heading .badge,.panel-rst.panel-important>.panel-heading .badge,.panel-rst.panel-info>.panel-heading .badge,.panel-version.panel-important>.panel-heading .badge,.panel-version.panel-info>.panel-heading .badge{color:#6daae0;background-color:#fff}.panel-flat.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-flat.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-rst.panel-info>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-important>.panel-footer+.panel-collapse>.panel-body,.panel-version.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#6daae0}.panel-flat.panel-important.risk-high>.panel-heading,.panel-flat.panel-info.risk-high>.panel-heading,.panel-rst.panel-important.risk-high>.panel-heading,.panel-rst.panel-info.risk-high>.panel-heading,.panel-version.panel-important.risk-high>.panel-heading,.panel-version.panel-info.risk-high>.panel-heading{background:#6daae0;color:#f5f5f5}.panel-flat.panel-important.risk-medium>.panel-heading,.panel-flat.panel-info.risk-medium>.panel-heading,.panel-rst.panel-important.risk-medium>.panel-heading,.panel-rst.panel-info.risk-medium>.panel-heading,.panel-version.panel-important.risk-medium>.panel-heading,.panel-version.panel-info.risk-medium>.panel-heading{background:#ebf3fb;color:#1e1e1e}.panel-flat.panel-important.risk-low>.panel-heading,.panel-flat.panel-info.risk-low>.panel-heading,.panel-rst.panel-important.risk-low>.panel-heading,.panel-rst.panel-info.risk-low>.panel-heading,.panel-version.panel-important.risk-low>.panel-heading,.panel-version.panel-info.risk-low>.panel-heading{background:#fff;color:#1e1e1e}.panel-flat.panel-important .panel-progress .panel-progress-bar,.panel-flat.panel-info .panel-progress .panel-progress-bar,.panel-rst.panel-important .panel-progress .panel-progress-bar,.panel-rst.panel-info .panel-progress .panel-progress-bar,.panel-version.panel-important .panel-progress .panel-progress-bar,.panel-version.panel-info .panel-progress .panel-progress-bar{background-color:#6daae0}.panel-flat .panel-heading,.panel-rst .panel-heading,.panel-version .panel-heading{position:relative}.panel-flat .panel-heading a.link-action,.panel-rst .panel-heading a.link-action,.panel-version .panel-heading a.link-action{cursor:pointer}.panel-flat .panel-heading strong,.panel-rst .panel-heading strong,.panel-version .panel-heading strong{line-height:1.5em}.panel-flat pre,.panel-rst pre,.panel-version pre{margin:0;border-radius:0;border:0;border-top:1px solid #d7d7d7;white-space:pre-wrap;word-break:normal;word-wrap:normal}.upgrade_analysis_item_to_filter pre a{text-decoration:underline}#phpinfo table{width:100%;table-layout:fixed;word-wrap:break-word} \ No newline at end of file diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js new file mode 100644 index 000000000000..5db58ecb6c0a --- /dev/null +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/ExtensionConfiguration.js @@ -0,0 +1,228 @@ +/* + * This file is part of the TYPO3 CMS project. + * + * It is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, either version 2 + * of the License, or any later version. + * + * For the full copyright and license information, please read the + * LICENSE.txt file that was distributed with this source code. + * + * The TYPO3 project - inspiring people to share! + */ + +/** + * Module: TYPO3/CMS/Install/ExtensionConfiguration + */ +define([ + 'jquery', + 'TYPO3/CMS/Install/Router', + 'TYPO3/CMS/Install/FlashMessage', + 'TYPO3/CMS/Install/ProgressBar', + 'TYPO3/CMS/Install/InfoBox', + 'TYPO3/CMS/Install/Severity', + 'bootstrap' +], function($, Router, FlashMessage, ProgressBar, InfoBox, Severity) { + 'use strict'; + + return { + selectorGridderOpener: 't3js-extensionConfiguration-open', + selectorContentContainer: '.t3js-extensionConfiguration-content', + selectorFormListener: '.t3js-extensionConfiguration-form', + selectorWriteToken: '#t3js-extensionConfiguration-write-token', + selectorOutputContainer: '.t3js-extensionConfiguration-output', + selectorSearchInput: '.t3js-extensionConfiguration-search', + + initialize: function() { + var self = this; + + // Get extension configuration list on card open + $(document).on('cardlayout:card-opened', function(event, $card) { + if ($card.hasClass(self.selectorGridderOpener)) { + self.getContent(); + } + }); + + // Focus search field on certain user interactions + $(document).on('keydown', function(e) { + var $searchInput = $(self.selectorSearchInput); + if (e.ctrlKey || e.metaKey) { + // Focus search field on ctrl-f + switch (String.fromCharCode(e.which).toLowerCase()) { + case 'f': + e.preventDefault(); + $searchInput.focus(); + break; + } + } else if (e.keyCode === 27) { + // Clear search on ESC key + e.preventDefault(); + $searchInput.val('').focus(); + } + }); + + // Perform expand collapse on search matches + $(document).on('keyup', this.selectorSearchInput, function() { + var typedQuery = $(this).val(); + var $searchInput = $(self.selectorSearchInput); + $('.search-item').each(function() { + var $item = $(this); + if ($(':contains(' + typedQuery + ')', $item).length > 0 || $('input[value*="' + typedQuery + '"]', $item).length > 0) { + $item.removeClass('hidden').addClass('searchhit'); + } else { + $item.removeClass('searchhit').addClass('hidden'); + } + }); + $('.searchhit').collapse('show'); + // Make search field clearable + require(['jquery.clearable'], function() { + $searchInput.clearable().focus(); + }); + }); + + $(document).on('submit', this.selectorFormListener, function(e) { + e.preventDefault(); + self.write($(this)); + }); + }, + + getContent: function() { + var self = this; + var outputContainer = $(this.selectorContentContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + outputContainer.empty().html(message); + $.ajax({ + url: Router.getUrl('extensionConfigurationGetContent'), + cache: false, + success: function(data) { + if (data.success === true && data.html !== 'undefined' && data.html.length > 0) { + outputContainer.empty().append(data.html); + self.initializeWrap(); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + outputContainer.empty().append(message); + } + }, + error: function(xhr) { + Router.handleAjaxError(xhr); + } + }); + }, + + /** + * Submit the form and show the result message + * + * @param {jQuery} $form The form of the current extension + */ + write: function($form) { + var $outputContainer = $(this.selectorOutputContainer); + var message = ProgressBar.render(Severity.loading, 'Loading...', ''); + $outputContainer.append(message); + var extensionConfiguration = { }; + $.each($form.serializeArray(), function() { + extensionConfiguration[this.name] = this.value; + }); + $.ajax({ + url: Router.getUrl(), + method: 'POST', + data: { + 'install': { + 'token': $(this.selectorWriteToken).text(), + 'action': 'extensionConfigurationWrite', + 'extensionKey': $form.attr('data-extensionKey'), + 'extensionConfiguration': extensionConfiguration + } + }, + success: function (data) { + if (data.success === true && Array.isArray(data.status)) { + data.status.forEach(function(element) { + var message = InfoBox.render(element.severity, element.title, element.message); + $outputContainer.empty().append(message); + }); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().html(message); + } + }, + error: function(xhr) { + Router.handleAjaxError(xhr); + } + }).always(function() { + $outputContainer.find('.alert-loading').remove(); + }); + }, + + /** + * configuration properties + */ + initializeWrap: function() { + $('.t3js-emconf-offset').each(function() { + var $me = $(this), + $parent = $me.parent(), + id = $me.attr('id'), + val = $me.attr('value'), + valArr = val.split(','); + + $me.attr('data-offsetfield-x', '#' + id + '_offset_x') + .attr('data-offsetfield-y', '#' + id + '_offset_y') + .wrap('<div class="hidden"></div>'); + + var elementX = '' + + '<div class="form-multigroup-item">' + + '<div class="input-group">' + + '<div class="input-group-addon">x</div>' + + '<input id="' + id + '_offset_x" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + + '</div>' + + '</div>'; + var elementY = '' + + '<div class="form-multigroup-item">' + + '<div class="input-group">' + + '<div class="input-group-addon">y</div>' + + '<input id="' + id + '_offset_y" class="form-control t3js-emconf-offsetfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + + '</div>' + + '</div>'; + + var offsetGroup = '<div class="form-multigroup-wrap">' + elementX + elementY + '</div>'; + $parent.append(offsetGroup); + $parent.find('.t3js-emconf-offset').keyup(function() { + var $target = $($(this).data('target')); + $target.attr( + 'value', + $($target.data('offsetfield-x')).val() + ',' + $($target.data('offsetfield-y')).val() + ); + }); + }); + + $('.t3js-emconf-wrap').each(function() { + var $me = $(this), + $parent = $me.parent(), + id = $me.attr('id'), + val = $me.attr('value'), + valArr = val.split('|'); + + $me.attr('data-wrapfield-start', '#' + id + '_wrap_start') + .attr('data-wrapfield-end', '#' + id + '_wrap_end') + .wrap('<div class="hidden"></div>'); + + var elementStart = '' + + '<div class="form-multigroup-item">' + + '<input id="' + id + '_wrap_start" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[0]) + '">' + + '</div>'; + var elementEnd = '' + + '<div class="form-multigroup-item">' + + '<input id="' + id + '_wrap_end" class="form-control t3js-emconf-wrapfield" data-target="#' + id + '" value="' + $.trim(valArr[1]) + '">' + + '</div>'; + + var wrapGroup = '<div class="form-multigroup-wrap">' + elementStart + elementEnd + '</div>'; + $parent.append(wrapGroup); + $parent.find('.t3js-emconf-wrapfield').keyup(function() { + var $target = $($(this).data('target')); + $target.attr( + 'value', + $($target.data('wrapfield-start')).val() + '|' + $($target.data('wrapfield-end')).val() + ); + }); + }); + } + }; +}); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js index 529dec90c9e4..f96e18503448 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/LocalConfiguration.js @@ -184,12 +184,14 @@ define([ */ handleButtonScrolling: function() { var $fixedFooterHandler = $('#fixed-footer-handler'); - var $fixedFooter = $('#fixed-footer'); - if (!this.isScrolledIntoView($fixedFooterHandler)) { - $fixedFooter.addClass('fixed'); - $fixedFooter.width($('.t3js-localConfiguration .panel-group').width()); - } else { - $fixedFooter.removeClass('fixed'); + if ($fixedFooterHandler.length > 0) { + var $fixedFooter = $('#fixed-footer'); + if (!this.isScrolledIntoView($fixedFooterHandler)) { + $fixedFooter.addClass('fixed'); + $fixedFooter.width($('.t3js-localConfiguration .panel-group').width()); + } else { + $fixedFooter.removeClass('fixed'); + } } }, diff --git a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js index dbf09e6187d3..1a43de4ad130 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/Modules/Router.js @@ -72,7 +72,7 @@ define([ cache: false, success: function(data) { if (data.success === true) { - self.loadMainLayout(); + self.executeSilentLegacyExtConfExtensionConfigurationUpdate(); } else { self.executeSilentConfigurationUpdate(); } @@ -83,6 +83,55 @@ define([ }); }, + /** + * Legacy layer to upmerge LocalConfiguration EXT/extConf serialized array keys + * to EXTENSIONS array in LocalConfiguration for initial update from v8 to v9. + * + * @deprecated since TYPO3 v9, will be removed with v10 - re-route executeSilentConfigurationUpdate() + * to executeSilentExtensionConfigurationUpdate() on removal of this function. + */ + executeSilentLegacyExtConfExtensionConfigurationUpdate: function() { + var self = this; + $.ajax({ + url: this.getUrl('executeSilentLegacyExtConfExtensionConfigurationUpdate', 'layout'), + cache: false, + success: function(data) { + if (data.success === true) { + self.executeSilentExtensionConfigurationSynchronization(); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().append(message); + } + }, + error: function(xhr) { + self.handleAjaxError(xhr); + } + }); + }, + + /** + * Extensions which come with new default settings in ext_conf_template.txt extension + * configuration files get their new defaults written to LocalConfiguration. + */ + executeSilentExtensionConfigurationSynchronization: function() { + var self = this; + $.ajax({ + url: this.getUrl('executeSilentExtensionConfigurationSynchronization', 'layout'), + cache: false, + success: function(data) { + if (data.success === true) { + self.loadMainLayout(); + } else { + var message = InfoBox.render(Severity.error, 'Something went wrong', ''); + $outputContainer.empty().append(message); + } + }, + error: function(xhr) { + self.handleAjaxError(xhr); + } + }); + }, + loadMainLayout: function() { var self = this; var $outputContainer = $(this.selectorBody); diff --git a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js index 3935d2155ace..7aca611178aa 100644 --- a/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js +++ b/typo3/sysext/install/Resources/Public/JavaScript/RequireJSConfig.js @@ -6,6 +6,7 @@ var require = { 'TYPO3/CMS/Install': 'sysext/install/Resources/Public/JavaScript/Modules/', 'jquery': 'sysext/core/Resources/Public/JavaScript/Contrib/jquery/jquery-3.2.1.min', 'jquery.clearable': 'sysext/backend/Resources/Public/JavaScript/jquery.clearable', + 'TYPO3/CMS/Core/Contrib/jquery.minicolors': 'sysext/core/Resources/Public/JavaScript/Contrib/jquery.minicolors', 'bootstrap': 'sysext/install/Resources/Public/JavaScript/bootstrap.min', 'chosen': 'sysext/install/Resources/Public/JavaScript/chosen.jquery.min' }, diff --git a/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php b/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php index d7973c032069..532b2f05475a 100644 --- a/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php +++ b/typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Rsaauth\Backend; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Utility\CommandUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Utility\StringUtility; @@ -54,14 +55,9 @@ class CommandLineBackend extends AbstractBackend { $this->opensslPath = CommandUtility::getCommand('openssl'); // Get temporary directory from the configuration - $extconf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['rsaauth'], ['allowed_classes' => false]); - if ( - $extconf['temporaryDirectory'] !== '' - && $extconf['temporaryDirectory'][0] === '/' - && @is_dir($extconf['temporaryDirectory']) - && is_writable($extconf['temporaryDirectory']) - ) { - $this->temporaryDirectory = $extconf['temporaryDirectory']; + $path = trim(GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('rsaauth', 'temporaryDirectory')); + if ($path !== '' && $path[0] === '/' && @is_dir($path) && is_writable($path)) { + $this->temporaryDirectory = $path; } else { $this->temporaryDirectory = PATH_site . 'typo3temp/var/transient'; } diff --git a/typo3/sysext/rsaauth/Classes/BackendWarnings.php b/typo3/sysext/rsaauth/Classes/BackendWarnings.php index e15fb346b621..396f4145f707 100644 --- a/typo3/sysext/rsaauth/Classes/BackendWarnings.php +++ b/typo3/sysext/rsaauth/Classes/BackendWarnings.php @@ -13,6 +13,8 @@ namespace TYPO3\CMS\Rsaauth; * * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; +use TYPO3\CMS\Core\Utility\GeneralUtility; /** * This class contains a hook to the backend warnings collection. It checks @@ -33,8 +35,7 @@ class BackendWarnings $lang = $this->getLanguageService(); $warnings['rsaauth_cmdline'] = $lang->sL('LLL:EXT:rsaauth/Resources/Private/Language/locallang.xlf:hook_using_cmdline'); // Check the path - $extconf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['rsaauth'], ['allowed_classes' => false]); - $path = trim($extconf['temporaryDirectory']); + $path = trim(GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('rsaauth', 'temporaryDirectory')); if ($path == '') { // Path is empty $warnings['rsaauth'] = $lang->sL('LLL:EXT:rsaauth/Resources/Private/Language/locallang.xlf:hook_empty_directory'); diff --git a/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php b/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php index b74a403932da..a6231c8b0a5f 100644 --- a/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php +++ b/typo3/sysext/rsaauth/Tests/Unit/Backend/CommandLineBackendTest.php @@ -31,7 +31,7 @@ class CommandLineBackendTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestC if (TYPO3_OS === 'WIN') { $this->markTestSkipped('This test is not available on Windows as auto-detection of openssl path will fail.'); } - + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['rsaauth']['temporaryDirectory'] = ''; $this->subject = new CommandLineBackend(); } diff --git a/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php b/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php index 38af2cbeab4f..2fca23b84de9 100644 --- a/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php +++ b/typo3/sysext/saltedpasswords/Classes/Utility/ExtensionManagerConfigurationUtility.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Saltedpasswords\Utility; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Messaging\FlashMessage; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -146,9 +147,9 @@ class ExtensionManagerConfigurationUtility private function init() { $requestSetup = $this->processPostData((array) $_REQUEST['data']); - $extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'], ['allowed_classes' => false]); - $this->extConf['BE'] = array_merge((array)$extConf['BE.'], (array)$requestSetup['BE.']); - $this->extConf['FE'] = array_merge((array)$extConf['FE.'], (array)$requestSetup['FE.']); + $extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('saltedpasswords'); + $this->extConf['BE'] = array_merge((array)$extConf['BE'], (array)$requestSetup['BE']); + $this->extConf['FE'] = array_merge((array)$extConf['FE'], (array)$requestSetup['FE']); $this->getLanguageService()->includeLLFile('EXT:saltedpasswords/Resources/Private/Language/locallang.xlf'); } diff --git a/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php b/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php index b5f2e983e5bc..5a8b359217fe 100644 --- a/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php +++ b/typo3/sysext/saltedpasswords/Classes/Utility/SaltedPasswordsUtility.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Saltedpasswords\Utility; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Utility\GeneralUtility; @@ -59,11 +60,11 @@ class SaltedPasswordsUtility public static function returnExtConf($mode = TYPO3_MODE) { $currentConfiguration = self::returnExtConfDefaults(); - if (isset($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'])) { - $extensionConfiguration = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'], ['allowed_classes' => false]); + if (isset($GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords'])) { + $extensionConfiguration = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('saltedpasswords'); // Merge default configuration with modified configuration: - if (isset($extensionConfiguration[$mode . '.'])) { - $currentConfiguration = array_merge($currentConfiguration, $extensionConfiguration[$mode . '.']); + if (isset($extensionConfiguration[$mode])) { + $currentConfiguration = array_merge($currentConfiguration, $extensionConfiguration[$mode]); } } return $currentConfiguration; diff --git a/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php b/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php index 642ed4182533..d72c23e8eb5b 100644 --- a/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php +++ b/typo3/sysext/saltedpasswords/Tests/Unit/Salt/SaltFactoryTest.php @@ -33,6 +33,21 @@ class SaltFactoryTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase */ protected function setUp() { + $GLOBALS['TYPO3_CONF_VARS']['EXTENSIONS']['saltedpasswords'] = [ + 'BE' => [ + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + 'FE' => [ + 'enabled' => 1, + 'saltedPWHashingMethod' => \TYPO3\CMS\Saltedpasswords\Salt\Pbkdf2Salt::class, + 'forceSalted' => 0, + 'onlyAuthService' => 0, + 'updatePasswd' => 1, + ], + ]; $this->objectInstance = \TYPO3\CMS\Saltedpasswords\Salt\SaltFactory::getSaltingInstance(); } diff --git a/typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php b/typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php deleted file mode 100644 index c44a3532fe11..000000000000 --- a/typo3/sysext/saltedpasswords/Tests/Unit/Utility/SaltedPasswordsUtilityTest.php +++ /dev/null @@ -1,39 +0,0 @@ -<?php -namespace TYPO3\CMS\Saltedpasswords\Tests\Unit\Utility; - -/* - * This file is part of the TYPO3 CMS project. - * - * It is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, either version 2 - * of the License, or any later version. - * - * For the full copyright and license information, please read the - * LICENSE.txt file that was distributed with this source code. - * - * The TYPO3 project - inspiring people to share! - */ - -/** - * Testcase for SaltedPasswordsUtility - */ -class SaltedPasswordsUtilityTest extends \TYPO3\TestingFramework\Core\Unit\UnitTestCase -{ - /** - * @test - */ - public function doesReturnExtConfReturnDefaultSettingsIfNoExtensionConfigurationIsFound() - { - $this->assertEquals(\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConfDefaults(), \TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConf('TEST_MODE')); - } - - /** - * @test - */ - public function doesReturnExtConfReturnMergedSettingsIfExtensionConfigurationIsFound() - { - $setting = ['setting' => 1]; - $GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['saltedpasswords'] = serialize(['TEST_MODE.' => $setting]); - $this->assertEquals(array_merge(\TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConfDefaults(), $setting), \TYPO3\CMS\Saltedpasswords\Utility\SaltedPasswordsUtility::returnExtConf('TEST_MODE')); - } -} diff --git a/typo3/sysext/scheduler/Classes/Scheduler.php b/typo3/sysext/scheduler/Classes/Scheduler.php index e8428f878a9f..ae33ce6008dd 100644 --- a/typo3/sysext/scheduler/Classes/Scheduler.php +++ b/typo3/sysext/scheduler/Classes/Scheduler.php @@ -14,6 +14,7 @@ namespace TYPO3\CMS\Scheduler; * The TYPO3 project - inspiring people to share! */ +use TYPO3\CMS\Core\Configuration\ExtensionConfiguration; use TYPO3\CMS\Core\Database\Connection; use TYPO3\CMS\Core\Database\ConnectionPool; use TYPO3\CMS\Core\Database\Query\QueryHelper; @@ -39,7 +40,7 @@ class Scheduler implements \TYPO3\CMS\Core\SingletonInterface public function __construct() { // Get configuration from the extension manager - $this->extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['scheduler'], ['allowed_classes' => false]); + $this->extConf = GeneralUtility::makeInstance(ExtensionConfiguration::class)->get('scheduler'); if (empty($this->extConf['maxLifetime'])) { $this->extConf['maxLifetime'] = 1440; } diff --git a/typo3/sysext/scheduler/ext_localconf.php b/typo3/sysext/scheduler/ext_localconf.php index a8ec1ec7c430..a52b690cf9be 100644 --- a/typo3/sysext/scheduler/ext_localconf.php +++ b/typo3/sysext/scheduler/ext_localconf.php @@ -2,10 +2,12 @@ defined('TYPO3_MODE') or die(); // Get the extensions's configuration -$extConf = unserialize($GLOBALS['TYPO3_CONF_VARS']['EXT']['extConf']['scheduler'], ['allowed_classes' => false]); +$showSampleTasks = (bool)\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( + \TYPO3\CMS\Core\Configuration\ExtensionConfiguration::class +)->get('scheduler', 'showSampleTasks'); // If sample tasks should be shown, // register information for the test and sleep tasks -if (!empty($extConf['showSampleTasks'])) { +if ($showSampleTasks) { $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Scheduler\Example\TestTask::class] = [ 'extension' => 'scheduler', 'title' => 'LLL:EXT:scheduler/Resources/Private/Language/locallang.xlf:testTask.name', @@ -19,6 +21,7 @@ if (!empty($extConf['showSampleTasks'])) { 'additionalFields' => \TYPO3\CMS\Scheduler\Example\SleepTaskAdditionalFieldProvider::class ]; } +unset($showSampleTasks); // Add caching framework garbage collection task $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks'][\TYPO3\CMS\Scheduler\Task\CachingFrameworkGarbageCollectionTask::class] = [ -- GitLab