diff --git a/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php b/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php index 6a1c17a1b083d075508d84434dd0b2df9ab73740..0b9321033825562391fe32f168a6becd278ceacb 100644 --- a/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php +++ b/app/code/Magento/Backup/Controller/Adminhtml/Index/Grid.php @@ -15,7 +15,7 @@ class Grid extends \Magento\Backup\Controller\Adminhtml\Index */ public function execute() { - $this->renderLayot(false); + $this->_view->loadLayout(); $this->_view->renderLayout(); } } diff --git a/app/code/Magento/Catalog/Model/Layout/DepersonalizePlugin.php b/app/code/Magento/Catalog/Model/Layout/DepersonalizePlugin.php index 61ec24047fa6a6c5c756fd903c1fba0427b9d549..faacce917f4d3968a4c095f8358f8b759a3ff43c 100644 --- a/app/code/Magento/Catalog/Model/Layout/DepersonalizePlugin.php +++ b/app/code/Magento/Catalog/Model/Layout/DepersonalizePlugin.php @@ -7,25 +7,17 @@ */ namespace Magento\Catalog\Model\Layout; +use Magento\PageCache\Model\DepersonalizeChecker; + /** * Class DepersonalizePlugin */ class DepersonalizePlugin { /** - * @var \Magento\Framework\App\RequestInterface - */ - protected $request; - - /** - * @var \Magento\Framework\Module\Manager - */ - protected $moduleManager; - - /** - * @var \Magento\PageCache\Model\Config + * @var DepersonalizeChecker */ - protected $cacheConfig; + protected $depersonalizeChecker; /** * Catalog session @@ -35,21 +27,15 @@ class DepersonalizePlugin protected $catalogSession; /** + * @param DepersonalizeChecker $depersonalizeChecker * @param \Magento\Catalog\Model\Session $catalogSession - * @param \Magento\Framework\App\RequestInterface $request - * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\PageCache\Model\Config $cacheConfig */ public function __construct( - \Magento\Catalog\Model\Session $catalogSession, - \Magento\Framework\Module\Manager $moduleManager, - \Magento\Framework\App\RequestInterface $request, - \Magento\PageCache\Model\Config $cacheConfig + DepersonalizeChecker $depersonalizeChecker, + \Magento\Catalog\Model\Session $catalogSession ) { $this->catalogSession = $catalogSession; - $this->request = $request; - $this->moduleManager = $moduleManager; - $this->cacheConfig = $cacheConfig; + $this->depersonalizeChecker = $depersonalizeChecker; } /** @@ -61,11 +47,7 @@ class DepersonalizePlugin */ public function afterGenerateXml(\Magento\Framework\View\LayoutInterface $subject, $result) { - if ($this->moduleManager->isEnabled('Magento_PageCache') - && $this->cacheConfig->isEnabled() - && !$this->request->isAjax() - && $subject->isCacheable() - ) { + if ($this->depersonalizeChecker->checkIfDepersonalize($subject)) { $this->catalogSession->clearStorage(); } return $result; diff --git a/app/code/Magento/Checkout/Model/Layout/DepersonalizePlugin.php b/app/code/Magento/Checkout/Model/Layout/DepersonalizePlugin.php index d45d8fbc78d64382d284e3fd5c0d0262412617e2..8726d579e4fea675a73466ab45dc4e4734346066 100644 --- a/app/code/Magento/Checkout/Model/Layout/DepersonalizePlugin.php +++ b/app/code/Magento/Checkout/Model/Layout/DepersonalizePlugin.php @@ -3,50 +3,35 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\Checkout\Model\Layout; +use Magento\PageCache\Model\DepersonalizeChecker; + /** * Class DepersonalizePlugin */ class DepersonalizePlugin { /** - * @var \Magento\Checkout\Model\Session - */ - protected $checkoutSession; - - /** - * @var \Magento\Framework\Module\Manager - */ - protected $moduleManager; - - /** - * @var \Magento\Framework\App\RequestInterface + * @var DepersonalizeChecker */ - protected $request; + protected $depersonalizeChecker; /** - * @var \Magento\PageCache\Model\Config + * @var \Magento\Checkout\Model\Session */ - protected $cacheConfig; + protected $checkoutSession; /** + * @param DepersonalizeChecker $depersonalizeChecker * @param \Magento\Checkout\Model\Session $checkoutSession - * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\Framework\App\RequestInterface $request - * @param \Magento\PageCache\Model\Config $cacheConfig */ public function __construct( - \Magento\Checkout\Model\Session $checkoutSession, - \Magento\Framework\Module\Manager $moduleManager, - \Magento\Framework\App\RequestInterface $request, - \Magento\PageCache\Model\Config $cacheConfig + DepersonalizeChecker $depersonalizeChecker, + \Magento\Checkout\Model\Session $checkoutSession ) { $this->checkoutSession = $checkoutSession; - $this->moduleManager = $moduleManager; - $this->request = $request; - $this->cacheConfig = $cacheConfig; + $this->depersonalizeChecker = $depersonalizeChecker; } /** @@ -58,11 +43,7 @@ class DepersonalizePlugin */ public function afterGenerateXml(\Magento\Framework\View\LayoutInterface $subject, $result) { - if ($this->moduleManager->isEnabled('Magento_PageCache') - && $this->cacheConfig->isEnabled() - && !$this->request->isAjax() - && $subject->isCacheable() - ) { + if ($this->depersonalizeChecker->checkIfDepersonalize($subject)) { $this->checkoutSession->clearStorage(); } return $result; diff --git a/app/code/Magento/Customer/Model/Layout/DepersonalizePlugin.php b/app/code/Magento/Customer/Model/Layout/DepersonalizePlugin.php index c355bed23826e94795338b8ec53c10ea99532231..05ca2de151976c86ce56c93686b13cddc9594304 100644 --- a/app/code/Magento/Customer/Model/Layout/DepersonalizePlugin.php +++ b/app/code/Magento/Customer/Model/Layout/DepersonalizePlugin.php @@ -7,11 +7,18 @@ */ namespace Magento\Customer\Model\Layout; +use Magento\PageCache\Model\DepersonalizeChecker; + /** * Class DepersonalizePlugin */ class DepersonalizePlugin { + /** + * @var DepersonalizeChecker + */ + protected $depersonalizeChecker; + /** * @var \Magento\Framework\Session\SessionManagerInterface */ @@ -27,16 +34,6 @@ class DepersonalizePlugin */ protected $customerFactory; - /** - * @var \Magento\Framework\App\RequestInterface - */ - protected $request; - - /** - * @var \Magento\Framework\Module\Manager - */ - protected $moduleManager; - /** * @var \Magento\Customer\Model\Visitor */ @@ -53,35 +50,24 @@ class DepersonalizePlugin protected $formKey; /** - * @var \Magento\PageCache\Model\Config - */ - protected $cacheConfig; - - /** + * @param DepersonalizeChecker $depersonalizeChecker * @param \Magento\Framework\Session\SessionManagerInterface $session * @param \Magento\Customer\Model\Session $customerSession * @param \Magento\Customer\Model\CustomerFactory $customerFactory - * @param \Magento\Framework\App\RequestInterface $request - * @param \Magento\Framework\Module\Manager $moduleManager * @param \Magento\Customer\Model\Visitor $visitor - * @param \Magento\PageCache\Model\Config $cacheConfig */ public function __construct( + DepersonalizeChecker $depersonalizeChecker, \Magento\Framework\Session\SessionManagerInterface $session, \Magento\Customer\Model\Session $customerSession, \Magento\Customer\Model\CustomerFactory $customerFactory, - \Magento\Framework\App\RequestInterface $request, - \Magento\Framework\Module\Manager $moduleManager, - \Magento\Customer\Model\Visitor $visitor, - \Magento\PageCache\Model\Config $cacheConfig + \Magento\Customer\Model\Visitor $visitor ) { $this->session = $session; $this->customerSession = $customerSession; $this->customerFactory = $customerFactory; - $this->request = $request; - $this->moduleManager = $moduleManager; $this->visitor = $visitor; - $this->cacheConfig = $cacheConfig; + $this->depersonalizeChecker = $depersonalizeChecker; } /** @@ -92,10 +78,7 @@ class DepersonalizePlugin */ public function beforeGenerateXml(\Magento\Framework\View\LayoutInterface $subject) { - if ($this->moduleManager->isEnabled( - 'Magento_PageCache' - ) && $this->cacheConfig->isEnabled() && !$this->request->isAjax() && $subject->isCacheable() - ) { + if ($this->depersonalizeChecker->checkIfDepersonalize($subject)) { $this->customerGroupId = $this->customerSession->getCustomerGroupId(); $this->formKey = $this->session->getData(\Magento\Framework\Data\Form\FormKey::FORM_KEY); } @@ -111,11 +94,7 @@ class DepersonalizePlugin */ public function afterGenerateXml(\Magento\Framework\View\LayoutInterface $subject, $result) { - if ($this->moduleManager->isEnabled('Magento_PageCache') - && $this->cacheConfig->isEnabled() - && !$this->request->isAjax() - && $subject->isCacheable() - ) { + if ($this->depersonalizeChecker->checkIfDepersonalize($subject)) { $this->visitor->setSkipRequestLogging(true); $this->visitor->unsetData(); $this->session->clearStorage(); diff --git a/app/code/Magento/PageCache/Model/DepersonalizeChecker.php b/app/code/Magento/PageCache/Model/DepersonalizeChecker.php new file mode 100644 index 0000000000000000000000000000000000000000..5837cccbc7d0924daf7185f0d428d0f0f6eabf2e --- /dev/null +++ b/app/code/Magento/PageCache/Model/DepersonalizeChecker.php @@ -0,0 +1,63 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\PageCache\Model; + +/** + * Checks if session should be depersonalized in Depersonalize plugin + */ +class DepersonalizeChecker +{ + /** + * Request + * + * @var \Magento\Framework\App\RequestInterface + */ + private $request; + + /** + * Module manager + * + * @var \Magento\Framework\Module\Manager + */ + private $moduleManager; + + /** + * Cache config + * + * @var Config + */ + private $cacheConfig; + + /** + * @param \Magento\Framework\App\RequestInterface $request + * @param \Magento\Framework\Module\Manager $moduleManager + * @param Config $cacheConfig + */ + public function __construct( + \Magento\Framework\App\RequestInterface $request, + \Magento\Framework\Module\Manager $moduleManager, + Config $cacheConfig + ) { + $this->request = $request; + $this->moduleManager = $moduleManager; + $this->cacheConfig = $cacheConfig; + } + + /** + * Check if depersonalize or not + * + * @param \Magento\Framework\View\LayoutInterface $subject + * @return bool + */ + public function checkIfDepersonalize(\Magento\Framework\View\LayoutInterface $subject) + { + return ($this->moduleManager->isEnabled('Magento_PageCache') + && $this->cacheConfig->isEnabled() + && !$this->request->isAjax() + && ($this->request->isGet() || $this->request->isHead()) + && $subject->isCacheable()); + } +} diff --git a/app/code/Magento/PageCache/Model/Layout/DepersonalizePlugin.php b/app/code/Magento/PageCache/Model/Layout/DepersonalizePlugin.php index 79b5dcc9f84c698603d7e9885b0acbae88543669..930ceeb6bdc0c3e764d5c16d64375cf90c693f84 100644 --- a/app/code/Magento/PageCache/Model/Layout/DepersonalizePlugin.php +++ b/app/code/Magento/PageCache/Model/Layout/DepersonalizePlugin.php @@ -3,57 +3,42 @@ * Copyright © 2015 Magento. All rights reserved. * See COPYING.txt for license details. */ - namespace Magento\PageCache\Model\Layout; +use Magento\PageCache\Model\DepersonalizeChecker; + /** * Class DepersonalizePlugin */ class DepersonalizePlugin { /** - * @var \Magento\Framework\App\RequestInterface - */ - protected $request; - - /** - * @var \Magento\Framework\Module\Manager + * @var DepersonalizeChecker */ - protected $moduleManager; + protected $depersonalizeChecker; /** * @var \Magento\Framework\Event\Manager */ protected $eventManager; - /** - * @var \Magento\PageCache\Model\Config - */ - protected $cacheConfig; - /** * @var \Magento\Framework\Message\Session */ protected $messageSession; /** - * @param \Magento\Framework\App\RequestInterface $request - * @param \Magento\Framework\Module\Manager $moduleManager + * @param DepersonalizeChecker $depersonalizeChecker * @param \Magento\Framework\Event\Manager $eventManager - * @param \Magento\PageCache\Model\Config $cacheConfig * @param \Magento\Framework\Message\Session $messageSession */ public function __construct( - \Magento\Framework\App\RequestInterface $request, - \Magento\Framework\Module\Manager $moduleManager, + DepersonalizeChecker $depersonalizeChecker, \Magento\Framework\Event\Manager $eventManager, - \Magento\PageCache\Model\Config $cacheConfig, \Magento\Framework\Message\Session $messageSession ) { - $this->request = $request; - $this->moduleManager = $moduleManager; + $this->depersonalizeChecker = $depersonalizeChecker; $this->eventManager = $eventManager; - $this->cacheConfig = $cacheConfig; $this->messageSession = $messageSession; } @@ -66,11 +51,7 @@ class DepersonalizePlugin */ public function afterGenerateXml(\Magento\Framework\View\LayoutInterface $subject, $result) { - if ($this->moduleManager->isEnabled('Magento_PageCache') - && $this->cacheConfig->isEnabled() - && !$this->request->isAjax() - && $subject->isCacheable() - ) { + if ($this->depersonalizeChecker->checkIfDepersonalize($subject)) { $this->eventManager->dispatch('depersonalize_clear_session'); session_write_close(); $this->messageSession->clearStorage(); diff --git a/app/code/Magento/PageCache/Model/Observer/InvalidateCacheIfChanged.php b/app/code/Magento/PageCache/Model/Observer/InvalidateCacheIfChanged.php new file mode 100644 index 0000000000000000000000000000000000000000..da5f388c6c79a899e389b191951c3866d6c5bbde --- /dev/null +++ b/app/code/Magento/PageCache/Model/Observer/InvalidateCacheIfChanged.php @@ -0,0 +1,54 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\PageCache\Model\Observer; + +/** + * An observer to invalidate full page cache when the content given is changed + */ +class InvalidateCacheIfChanged +{ + /** + * @var \Magento\Framework\App\Cache\TypeListInterface + */ + protected $typeList; + + /** + * Application config object + * + * @var \Magento\PageCache\Model\Config + */ + protected $config; + + /** + * @param \Magento\PageCache\Model\Config $config + * @param \Magento\Framework\App\Cache\TypeListInterface $typeList + */ + public function __construct( + \Magento\PageCache\Model\Config $config, + \Magento\Framework\App\Cache\TypeListInterface $typeList + ) { + $this->config = $config; + $this->typeList = $typeList; + } + + /** + * Invalidate full page cache if content is changed + * + * @param \Magento\Framework\Event\Observer $observer + * @return void + */ + public function execute(\Magento\Framework\Event\Observer $observer) + { + if ($this->config->isEnabled()) { + $object = $observer->getEvent()->getObject(); + if ($object instanceof \Magento\Framework\Object\IdentityInterface) { + if ($object->getIdentities()) { + $this->typeList->invalidate('full_page'); + } + } + } + } +} diff --git a/app/code/Magento/PageCache/etc/events.xml b/app/code/Magento/PageCache/etc/events.xml index 3be6c75f94f9b4e508ea31bfe9d1cfa78e7d5bf1..e368daf233a14f993694a1f7613f85ffb840c471 100644 --- a/app/code/Magento/PageCache/etc/events.xml +++ b/app/code/Magento/PageCache/etc/events.xml @@ -13,7 +13,7 @@ <observer name="invalidate_builtin" instance="Magento\PageCache\Model\Observer\FlushCacheByTags" method="execute" /> </event> <event name="clean_cache_after_reindex"> - <observer name="reindex_cache_flush" instance="Magento\PageCache\Model\Observer\InvalidateCache" method="execute" /> + <observer name="reindex_cache_flush" instance="Magento\PageCache\Model\Observer\InvalidateCacheIfChanged" method="execute" /> </event> <event name="adminhtml_cache_flush_system"> <observer name="flush_system_pagecache" instance="Magento\PageCache\Model\Observer\FlushAllCache" method="execute" /> diff --git a/app/code/Magento/Persistent/Model/Layout/DepersonalizePlugin.php b/app/code/Magento/Persistent/Model/Layout/DepersonalizePlugin.php index 850e262479daa1a5889b5144d87f69a6b617472d..b73ccc8b2275c669958bf5d2fd5cabde74b3b802 100644 --- a/app/code/Magento/Persistent/Model/Layout/DepersonalizePlugin.php +++ b/app/code/Magento/Persistent/Model/Layout/DepersonalizePlugin.php @@ -5,49 +5,35 @@ */ namespace Magento\Persistent\Model\Layout; +use Magento\PageCache\Model\DepersonalizeChecker; + /** * Class DepersonalizePlugin */ class DepersonalizePlugin { /** - * @var \Magento\Persistent\Model\Session - */ - protected $persistentSession; - - /** - * @var \Magento\Framework\App\RequestInterface + * @var DepersonalizeChecker */ - protected $request; + protected $depersonalizeChecker; /** - * @var \Magento\Framework\Module\Manager - */ - protected $moduleManager; - - /** - * @var \Magento\PageCache\Model\Config + * @var \Magento\Persistent\Model\Session */ - protected $cacheConfig; + protected $persistentSession; /** * Constructor * + * @param DepersonalizeChecker $depersonalizeChecker * @param \Magento\Persistent\Model\Session $persistentSession - * @param \Magento\Framework\App\RequestInterface $request - * @param \Magento\Framework\Module\Manager $moduleManager - * @param \Magento\PageCache\Model\Config $cacheConfig */ public function __construct( - \Magento\Persistent\Model\Session $persistentSession, - \Magento\Framework\App\RequestInterface $request, - \Magento\Framework\Module\Manager $moduleManager, - \Magento\PageCache\Model\Config $cacheConfig + DepersonalizeChecker $depersonalizeChecker, + \Magento\Persistent\Model\Session $persistentSession ) { $this->persistentSession = $persistentSession; - $this->request = $request; - $this->moduleManager = $moduleManager; - $this->cacheConfig = $cacheConfig; + $this->depersonalizeChecker = $depersonalizeChecker; } /** @@ -61,11 +47,7 @@ class DepersonalizePlugin \Magento\Framework\View\LayoutInterface $subject, \Magento\Framework\View\LayoutInterface $result ) { - if ($this->moduleManager->isEnabled('Magento_PageCache') - && $this->cacheConfig->isEnabled() - && !$this->request->isAjax() - && $subject->isCacheable() - ) { + if ($this->depersonalizeChecker->checkIfDepersonalize($subject)) { $this->persistentSession->setCustomerId(null); } diff --git a/dev/tests/unit/testsuite/Magento/Catalog/Model/Layout/DepersonalizePluginTest.php b/dev/tests/unit/testsuite/Magento/Catalog/Model/Layout/DepersonalizePluginTest.php index e3785dc0597438b0d723a5cfe4ffe143a504d6c5..ab1f05a08b4c7a680709ac43dc0c50d5a2ae490c 100644 --- a/dev/tests/unit/testsuite/Magento/Catalog/Model/Layout/DepersonalizePluginTest.php +++ b/dev/tests/unit/testsuite/Magento/Catalog/Model/Layout/DepersonalizePluginTest.php @@ -17,30 +17,15 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase */ protected $plugin; - /** - * @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $layoutMock; - /** * @var \Magento\Catalog\Model\Session|\PHPUnit_Framework_MockObject_MockObject */ protected $catalogSessionMock; /** - * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $requestMock; - - /** - * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\PageCache\Model\DepersonalizeChecker|\PHPUnit_Framework_MockObject_MockObject */ - protected $moduleManagerMock; - - /** - * @var \Magento\PageCache\Model\Config|\PHPUnit_Framework_MockObject_MockObject - */ - protected $cacheConfigMock; + protected $depersonalizeCheckerMock; /** * @var \Magento\Framework\View\Layout|\PHPUnit_Framework_MockObject_MockObject @@ -56,82 +41,33 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase '', false ); - $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); - $this->moduleManagerMock = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); - $this->cacheConfigMock = $this->getMock('Magento\PageCache\Model\Config', [], [], '', false); $this->resultLayout = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); + $this->depersonalizeCheckerMock = $this->getMock( + 'Magento\PageCache\Model\DepersonalizeChecker', + [], + [], + '', + false + ); - $this->plugin = (new ObjectManager($this))->getObject('Magento\Catalog\Model\Layout\DepersonalizePlugin', [ - 'catalogSession' => $this->catalogSessionMock, - 'moduleManager' => $this->moduleManagerMock, - 'request' => $this->requestMock, - 'cacheConfig' => $this->cacheConfigMock - ]); + $this->plugin = (new ObjectManager($this))->getObject( + 'Magento\Catalog\Model\Layout\DepersonalizePlugin', + ['catalogSession' => $this->catalogSessionMock, 'depersonalizeChecker' => $this->depersonalizeCheckerMock] + ); } public function testAfterGenerateXml() { - $this->moduleManagerMock->expects($this->once())->method('isEnabled')->with('Magento_PageCache') - ->willReturn(true); - $this->cacheConfigMock->expects($this->once())->method('isEnabled')->willReturn(true); - $this->requestMock->expects($this->once($this->once()))->method('isAjax')->willReturn(false); - $this->layoutMock->expects($this->once())->method('isCacheable')->willReturn(true); $this->catalogSessionMock->expects($this->once())->method('clearStorage'); - - $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $this->resultLayout); - $this->assertEquals($this->resultLayout, $actualResult); - } - - public function testPageCacheModuleIsDisabled() - { - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->willReturn(false); - $this->catalogSessionMock->expects($this->never())->method('clearStorage'); - + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(true); $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $this->resultLayout); $this->assertEquals($this->resultLayout, $actualResult); } - public function testCacheIsDisabledInConfig() + public function testAfterGenerateXmlNoDepersonalize() { - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->willReturn(true); - $this->cacheConfigMock->expects($this->once())->method('isEnabled')->willReturn(false); $this->catalogSessionMock->expects($this->never())->method('clearStorage'); - - $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $this->resultLayout); - $this->assertEquals($this->resultLayout, $actualResult); - } - - public function testIsAjax() - { - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->willReturn(true); - $this->cacheConfigMock->expects($this->once())->method('isEnabled')->willReturn(true); - $this->requestMock->expects($this->once($this->once()))->method('isAjax')->willReturn(true); - $this->catalogSessionMock->expects($this->never())->method('clearStorage'); - - $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $this->resultLayout); - $this->assertEquals($this->resultLayout, $actualResult); - } - - public function testLayoutIsNotCacheable() - { - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->willReturn(true); - $this->cacheConfigMock->expects($this->once())->method('isEnabled')->willReturn(true); - $this->requestMock->expects($this->once($this->once()))->method('isAjax')->willReturn(false); - $this->layoutMock->expects($this->once())->method('isCacheable')->willReturn(false); - $this->catalogSessionMock->expects($this->never())->method('clearStorage'); - + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(false); $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $this->resultLayout); $this->assertEquals($this->resultLayout, $actualResult); } diff --git a/dev/tests/unit/testsuite/Magento/Checkout/Model/Layout/DepersonalizePluginTest.php b/dev/tests/unit/testsuite/Magento/Checkout/Model/Layout/DepersonalizePluginTest.php index b09e0f6a6867208536a7a0b226935a9f86cdb129..666740e8a0e2f119f9ba49af331337fc76604533 100644 --- a/dev/tests/unit/testsuite/Magento/Checkout/Model/Layout/DepersonalizePluginTest.php +++ b/dev/tests/unit/testsuite/Magento/Checkout/Model/Layout/DepersonalizePluginTest.php @@ -29,19 +29,9 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase protected $checkoutSessionMock; /** - * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\PageCache\Model\DepersonalizeChecker|\PHPUnit_Framework_MockObject_MockObject */ - protected $requestMock; - - /** - * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject - */ - protected $moduleManagerMock; - - /** - * @var \Magento\PageCache\Model\Config|\PHPUnit_Framework_MockObject_MockObject - */ - protected $cacheConfigMock; + protected $depersonalizeCheckerMock; /** * SetUp @@ -65,12 +55,17 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); $this->moduleManagerMock = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); $this->cacheConfigMock = $this->getMock('Magento\PageCache\Model\Config', [], [], '', false); + $this->depersonalizeCheckerMock = $this->getMock( + 'Magento\PageCache\Model\DepersonalizeChecker', + [], + [], + '', + false + ); $this->plugin = new \Magento\Checkout\Model\Layout\DepersonalizePlugin( - $this->checkoutSessionMock, - $this->moduleManagerMock, - $this->requestMock, - $this->cacheConfigMock + $this->depersonalizeCheckerMock, + $this->checkoutSessionMock ); } @@ -80,21 +75,24 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase public function testAfterGenerateXml() { $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->will($this->returnValue(true)); - $this->cacheConfigMock->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock->expects($this->once($this->once())) - ->method('isAjax') - ->will($this->returnValue(false)); - $this->layoutMock->expects($this->once()) - ->method('isCacheable') - ->will($this->returnValue(true)); - $this->checkoutSessionMock->expects($this->once()) + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(true); + $this->checkoutSessionMock + ->expects($this->once()) + ->method('clearStorage') + ->will($this->returnValue($expectedResult)); + + $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $expectedResult); + $this->assertEquals($expectedResult, $actualResult); + } + + public function testAfterGenerateXmlNoDepersonalize() + { + $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); + + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(false); + $this->checkoutSessionMock + ->expects($this->never()) ->method('clearStorage') ->will($this->returnValue($expectedResult)); diff --git a/dev/tests/unit/testsuite/Magento/Customer/Model/Layout/DepersonalizePluginTest.php b/dev/tests/unit/testsuite/Magento/Customer/Model/Layout/DepersonalizePluginTest.php index 73c7315d9b953964f794eaf101b3393c6337d058..fd09caa0557437384ed179002e66f10e52d52cd3 100644 --- a/dev/tests/unit/testsuite/Magento/Customer/Model/Layout/DepersonalizePluginTest.php +++ b/dev/tests/unit/testsuite/Magento/Customer/Model/Layout/DepersonalizePluginTest.php @@ -37,30 +37,21 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase */ protected $customerFactoryMock; - /** - * @var \Magento\Framework\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject - */ - protected $requestMock; - /** * @var \Magento\Customer\Model\Customer|\PHPUnit_Framework_MockObject_MockObject */ protected $customerMock; - /** - * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject - */ - protected $moduleManagerMock; - /** * @var \Magento\Log\Model\Visitor|\PHPUnit_Framework_MockObject_MockObject */ protected $visitorMock; /** - * @var \Magento\PageCache\Model\Config|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\PageCache\Model\DepersonalizeChecker|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheConfigMock; + protected $depersonalizeCheckerMock; + /** * SetUp */ @@ -88,7 +79,6 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase '', false ); - $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); $this->customerMock = $this->getMock( 'Magento\Customer\Model\Customer', ['setGroupId', '__wakeup'], @@ -96,168 +86,60 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase '', false ); - $this->moduleManagerMock = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); $this->visitorMock = $this->getMock('Magento\Customer\Model\Visitor', [], [], '', false); $this->customerFactoryMock->expects($this->any()) ->method('create') ->will($this->returnValue($this->customerMock)); - $this->cacheConfigMock = $this->getMock('Magento\PageCache\Model\Config', [], [], '', false); + $this->depersonalizeCheckerMock = $this->getMock( + 'Magento\PageCache\Model\DepersonalizeChecker', + [], + [], + '', + false + ); $this->plugin = new DepersonalizePlugin( + $this->depersonalizeCheckerMock, $this->sessionMock, $this->customerSessionMock, $this->customerFactoryMock, - $this->requestMock, - $this->moduleManagerMock, - $this->visitorMock, - $this->cacheConfigMock + $this->visitorMock ); } - /** - * Test method beforeGenerateXml with enabled module PageCache - */ - public function testBeforeGenerateXmlPageCacheEnabled() + public function testBeforeGenerateXml() { - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->will($this->returnValue(true)); - $this->cacheConfigMock - ->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock - ->expects($this->once()) - ->method('isAjax') - ->will($this->returnValue(false)); - $this->layoutMock + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(true); + $this->customerSessionMock->expects($this->once())->method('getCustomerGroupId'); + $this->sessionMock ->expects($this->once()) - ->method('isCacheable') - ->will($this->returnValue(true)); - $this->customerSessionMock->expects($this->once()) - ->method('getCustomerGroupId'); - $this->sessionMock->expects($this->once()) ->method('getData') ->with($this->equalTo(\Magento\Framework\Data\Form\FormKey::FORM_KEY)); $output = $this->plugin->beforeGenerateXml($this->layoutMock); $this->assertEquals([], $output); } - /** - * Test method beforeGenerateXml with disabled module PageCache - */ - public function testBeforeGenerateXmlPageCacheDisabled() + public function testBeforeGenerateXmlNoDepersonalize() { - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->will($this->returnValue(false)); - $this->requestMock + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(false); + $this->customerSessionMock->expects($this->never())->method('getCustomerGroupId'); + $this->sessionMock ->expects($this->never()) - ->method('isAjax'); - $output = $this->plugin->beforeGenerateXml($this->layoutMock); - $this->assertEquals([], $output); - } - - /** - * Test beforeGenerateXml method with enabled module PageCache and request is Ajax - */ - public function testBeforeGenerateXmlRequestIsAjax() - { - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->will($this->returnValue(true)); - $this->cacheConfigMock - ->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock - ->expects($this->once()) - ->method('isAjax') - ->will($this->returnValue(true)); - $this->layoutMock->expects($this->never()) - ->method('isCacheable'); - $output = $this->plugin->beforeGenerateXml($this->layoutMock); - $this->assertEquals([], $output); - } - - /** - * Test beforeGenerateXml method with enabled module PageCache and request is Ajax and Layout is not cacheable - */ - public function testBeforeGenerateXmlLayoutIsNotCacheable() - { - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->will($this->returnValue(true)); - $this->cacheConfigMock - ->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock - ->expects($this->once()) - ->method('isAjax') - ->will($this->returnValue(false)); - $this->layoutMock->expects($this->once()) - ->method('isCacheable') - ->will($this->returnValue(false)); - $this->customerSessionMock->expects($this->never()) - ->method('getCustomerGroupId'); + ->method('getData'); $output = $this->plugin->beforeGenerateXml($this->layoutMock); $this->assertEquals([], $output); } - /** - * Test method afterGenerateXml with enabled module PageCache - */ - public function testAfterGenerateXmlPageCacheEnabled() + public function testAfterGenerateXml() { $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->will($this->returnValue(true)); - $this->cacheConfigMock - ->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock - ->expects($this->once()) - ->method('isAjax') - ->will($this->returnValue(false)); - $this->layoutMock - ->expects($this->once()) - ->method('isCacheable') - ->will($this->returnValue(true)); - $this->visitorMock - ->expects($this->once()) - ->method('setSkipRequestLogging') - ->with($this->equalTo(true)); - $this->visitorMock - ->expects($this->once()) - ->method('unsetData'); - $this->sessionMock - ->expects($this->once()) - ->method('clearStorage'); - $this->customerSessionMock - ->expects($this->once()) - ->method('clearStorage'); - $this->customerSessionMock - ->expects($this->once()) - ->method('setCustomerGroupId') - ->with($this->equalTo(null)); - $this->customerMock - ->expects($this->once()) - ->method('setGroupId') - ->with($this->equalTo(null)) - ->willReturnSelf(); + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(true); + $this->visitorMock->expects($this->once())->method('setSkipRequestLogging')->with($this->equalTo(true)); + $this->visitorMock->expects($this->once())->method('unsetData'); + $this->sessionMock->expects($this->once())->method('clearStorage'); + $this->customerSessionMock->expects($this->once())->method('clearStorage'); + $this->customerSessionMock->expects($this->once())->method('setCustomerGroupId')->with($this->equalTo(null)); + $this->customerMock->expects($this->once())->method('setGroupId')->with($this->equalTo(null))->willReturnSelf(); $this->sessionMock ->expects($this->once()) ->method('setData') @@ -273,74 +155,18 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase $this->assertSame($expectedResult, $actualResult); } - /** - * Test afterGenerateXml method with disabled module PageCache - */ - public function testAfterGenerateXmlPageCacheDisabled() - { - $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->will($this->returnValue(false)); - $this->requestMock - ->expects($this->never()) - ->method('isAjax'); - $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $expectedResult); - $this->assertSame($expectedResult, $actualResult); - } - - /** - * Test afterGenerateXml method with enabled module PageCache and request is Ajax - */ - public function testAfterGenerateXmlRequestIsAjax() + public function testAfterGenerateXmlNoDepersonalize() { $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->will($this->returnValue(true)); - $this->cacheConfigMock - ->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock - ->expects($this->once()) - ->method('isAjax') - ->will($this->returnValue(true)); - $this->layoutMock->expects($this->never()) - ->method('isCacheable'); - $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $expectedResult); - $this->assertSame($expectedResult, $actualResult); - } - - /** - * Test afterGenerateXml method with enabled module PageCache and request is Ajax and Layout is not cacheable - */ - public function testAfterGenerateXmlLayoutIsNotCacheable() - { - $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->moduleManagerMock - ->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->will($this->returnValue(true)); - $this->cacheConfigMock - ->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->requestMock - ->expects($this->once()) - ->method('isAjax') - ->will($this->returnValue(false)); - $this->layoutMock->expects($this->once()) - ->method('isCacheable') - ->will($this->returnValue(false)); - $this->visitorMock - ->expects($this->never()) - ->method('setSkipRequestLogging'); + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(false); + $this->visitorMock->expects($this->never())->method('setSkipRequestLogging'); + $this->visitorMock->expects($this->never())->method('unsetData'); + $this->sessionMock->expects($this->never())->method('clearStorage'); + $this->customerSessionMock->expects($this->never())->method('clearStorage'); + $this->customerSessionMock->expects($this->never())->method('setCustomerGroupId'); + $this->customerMock->expects($this->never())->method('setGroupId'); + $this->sessionMock->expects($this->never())->method('setData'); + $this->customerSessionMock->expects($this->never())->method('setCustomer'); $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $expectedResult); $this->assertSame($expectedResult, $actualResult); } diff --git a/dev/tests/unit/testsuite/Magento/Framework/Module/ModuleList/LoaderTest.php b/dev/tests/unit/testsuite/Magento/Framework/Module/ModuleList/LoaderTest.php index 5fd6fa94551eb9708cffbccc15cd7be3edfc9b1d..59c449cf5d2f585cd6de81b6875aecdc4dd3fa1b 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/Module/ModuleList/LoaderTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/Module/ModuleList/LoaderTest.php @@ -7,6 +7,7 @@ namespace Magento\Framework\Module\ModuleList; use Magento\Framework\App\Filesystem\DirectoryList; +use Magento\Framework\Xml\Parser; class LoaderTest extends \PHPUnit_Framework_TestCase { @@ -32,6 +33,11 @@ class LoaderTest extends \PHPUnit_Framework_TestCase */ private $converter; + /* + * @var \PHPUnit_Framework_MockObject_MockObject + */ + private $parser; + protected function setUp() { $this->filesystem = $this->getMock('Magento\Framework\Filesystem', [], [], '', false); @@ -41,6 +47,7 @@ class LoaderTest extends \PHPUnit_Framework_TestCase ->with(DirectoryList::MODULES) ->willReturn($this->dir); $this->converter = $this->getMock('Magento\Framework\Module\Declaration\Converter\Dom', [], [], '', false); + $this->parser = $this->getMock('Magento\Framework\Xml\Parser', [], [], '', false); } public function testLoad() @@ -57,11 +64,13 @@ class LoaderTest extends \PHPUnit_Framework_TestCase ['b', null, null, self::$sampleXml], ['c', null, null, self::$sampleXml], ])); - $dom = new \PHPUnit_Framework_Constraint_IsInstanceOf('DOMDocument'); - $this->converter->expects($this->at(0))->method('convert')->with($dom)->willReturn(['a' => $fixture['a']]); - $this->converter->expects($this->at(1))->method('convert')->with($dom)->willReturn(['b' => $fixture['b']]); - $this->converter->expects($this->at(2))->method('convert')->with($dom)->willReturn(['c' => $fixture['c']]); - $object = new Loader($this->filesystem, $this->converter); + $this->converter->expects($this->at(0))->method('convert')->willReturn(['a' => $fixture['a']]); + $this->converter->expects($this->at(1))->method('convert')->willReturn(['b' => $fixture['b']]); + $this->converter->expects($this->at(2))->method('convert')->willReturn(['c' => $fixture['c']]); + $this->parser->expects($this->once())->method('initErrorHandler'); + $this->parser->expects($this->atLeastOnce())->method('loadXML'); + $this->parser->expects($this->atLeastOnce())->method('getDom'); + $object = new Loader($this->filesystem, $this->converter, $this->parser); $result = $object->load(); $this->assertSame(['a', 'c', 'b'], array_keys($result)); $this->assertSame($fixture['a'], $result['a']); @@ -84,10 +93,9 @@ class LoaderTest extends \PHPUnit_Framework_TestCase ['a', null, null, self::$sampleXml], ['b', null, null, self::$sampleXml], ])); - $dom = new \PHPUnit_Framework_Constraint_IsInstanceOf('DOMDocument'); - $this->converter->expects($this->at(0))->method('convert')->with($dom)->willReturn(['a' => $fixture['a']]); - $this->converter->expects($this->at(1))->method('convert')->with($dom)->willReturn(['b' => $fixture['b']]); - $object = new Loader($this->filesystem, $this->converter); + $this->converter->expects($this->at(0))->method('convert')->willReturn(['a' => $fixture['a']]); + $this->converter->expects($this->at(1))->method('convert')->willReturn(['b' => $fixture['b']]); + $object = new Loader($this->filesystem, $this->converter, $this->parser); $object->load(); } } diff --git a/dev/tests/unit/testsuite/Magento/Framework/Xml/ParserTest.php b/dev/tests/unit/testsuite/Magento/Framework/Xml/ParserTest.php index 683e5499dc35d408a3f93569599bb2898766f664..ff512cf3b74edfec86092d234e4367001d5fe91c 100644 --- a/dev/tests/unit/testsuite/Magento/Framework/Xml/ParserTest.php +++ b/dev/tests/unit/testsuite/Magento/Framework/Xml/ParserTest.php @@ -31,4 +31,15 @@ class ParserTest extends \PHPUnit_Framework_TestCase $this->parser->load(__DIR__ . '/_files/data.xml')->xmlToArray() ); } + + /** + * @expectedException \Magento\Framework\Exception + * @expectedExceptionMessage DOMDocument::loadXML(): Opening and ending tag mismatch + */ + public function testLoadXmlInvalid() + { + $sampleInvalidXml = '<?xml version="1.0"?><config></onfig>'; + $this->parser->initErrorHandler(); + $this->parser->loadXML($sampleInvalidXml); + } } diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Model/DepersonalizeCheckerTest.php b/dev/tests/unit/testsuite/Magento/PageCache/Model/DepersonalizeCheckerTest.php new file mode 100644 index 0000000000000000000000000000000000000000..51e314e51699e85b8229e249b0e95715fb33152a --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/PageCache/Model/DepersonalizeCheckerTest.php @@ -0,0 +1,79 @@ +<?php +/** + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\PageCache\Model; + +class DepersonalizeCheckerTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var \Magento\Framework\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject + */ + private $requestMock; + + /** + * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject + */ + private $moduleManagerMock; + + /** + * @var \Magento\PageCache\Model\Config|\PHPUnit_Framework_MockObject_MockObject + */ + private $cacheConfigMock; + + public function setup() + { + $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); + $this->moduleManagerMock = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); + $this->cacheConfigMock = $this->getMock('Magento\PageCache\Model\Config', [], [], '', false); + } + + /** + * @param array $requestResult + * @param bool $moduleManagerResult + * @param bool $cacheConfigResult + * @param bool $layoutResult + * @param bool $can Depersonalize + * @dataProvider checkIfDepersonalizeDataProvider + */ + public function testCheckIfDepersonalize( + array $requestResult, + $moduleManagerResult, + $cacheConfigResult, + $layoutResult, + $canDepersonalize + ) { + $this->requestMock->expects($this->any())->method('isAjax')->willReturn($requestResult['ajax']); + $this->requestMock->expects($this->any())->method('isGet')->willReturn($requestResult['get']); + $this->requestMock->expects($this->any())->method('isHead')->willReturn($requestResult['head']); + $this->moduleManagerMock + ->expects($this->any()) + ->method('isEnabled') + ->with('Magento_PageCache') + ->willReturn($moduleManagerResult); + + $this->cacheConfigMock->expects($this->any())->method('isEnabled')->willReturn($cacheConfigResult); + $layoutMock = $this->getMockForAbstractClass('Magento\Framework\View\LayoutInterface', [], '', false); + $layoutMock->expects($this->any())->method('isCacheable')->willReturn($layoutResult); + + $object = new DepersonalizeChecker($this->requestMock, $this->moduleManagerMock, $this->cacheConfigMock); + $this->assertEquals($canDepersonalize, $object->checkIfDepersonalize($layoutMock)); + } + + /** + * return array + */ + public function checkIfDepersonalizeDataProvider() + { + return [ + [['ajax' => false, 'get' => true, 'head' => false], true, true, true, true], + [['ajax' => false, 'get' => false, 'head' => true], true, true, true, true], + [['ajax' => false, 'get' => false, 'head' => false], true, true, true, false], + [['ajax' => true, 'get' => true, 'head' => false], true, true, true, false], + [['ajax' => false, 'get' => true, 'head' => false], false, true, true, false], + [['ajax' => false, 'get' => true, 'head' => false], true, false, true, false], + [['ajax' => false, 'get' => true, 'head' => false], true, true, false, false], + ]; + } +} diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Model/Layout/DepersonalizePluginTest.php b/dev/tests/unit/testsuite/Magento/PageCache/Model/Layout/DepersonalizePluginTest.php index c3630097d53cdb59f4e1fa64d948fd0edb12b7ae..4e0db0bd6ceb6728bba5023e200de6b377c00e73 100644 --- a/dev/tests/unit/testsuite/Magento/PageCache/Model/Layout/DepersonalizePluginTest.php +++ b/dev/tests/unit/testsuite/Magento/PageCache/Model/Layout/DepersonalizePluginTest.php @@ -23,30 +23,20 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase */ protected $layoutMock; - /** - * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $requestMock; - - /** - * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject - */ - protected $moduleManagerMock; - /** * @var \Magento\Framework\Event\Manager|\PHPUnit_Framework_MockObject_MockObject */ protected $eventManagerMock; /** - * @var \Magento\PageCache\Model\Config|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\Framework\Message\Session|\PHPUnit_Framework_MockObject_MockObject */ - protected $cacheConfigMock; + protected $messageSessionMock; /** - * @var \Magento\Framework\Message\Session|\PHPUnit_Framework_MockObject_MockObject + * @var \Magento\PageCache\Model\DepersonalizeChecker|\PHPUnit_Framework_MockObject_MockObject */ - protected $messageSessionMock; + protected $depersonalizeCheckerMock; /** * SetUp @@ -54,68 +44,49 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase public function setUp() { $this->layoutMock = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); - $this->moduleManagerMock = $this->getMock('Magento\Framework\Module\Manager', [], [], '', false); $this->eventManagerMock = $this->getMock('Magento\Framework\Event\Manager', [], [], '', false); - $this->cacheConfigMock = $this->getMock('Magento\PageCache\Model\Config', [], [], '', false); $this->messageSessionMock = $this->getMock('Magento\Framework\Message\Session', ['clearStorage'], [], '', false ); + $this->depersonalizeCheckerMock = $this->getMock( + 'Magento\PageCache\Model\DepersonalizeChecker', + [], + [], + '', + false + ); $this->plugin = new DepersonalizePlugin( - $this->requestMock, - $this->moduleManagerMock, + $this->depersonalizeCheckerMock, $this->eventManagerMock, - $this->cacheConfigMock, $this->messageSessionMock ); } - /** - * Test method afterGenerateXml with enabled module PageCache - */ - public function testAfterGenerateXmlPageCacheEnabled() + public function testAfterGenerateXml() { $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->cacheConfigMock->expects($this->once()) - ->method('isEnabled') - ->will($this->returnValue(true)); - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->will($this->returnValue(true)); - $this->requestMock->expects($this->once($this->once())) - ->method('isAjax') - ->will($this->returnValue(false)); - $this->layoutMock->expects($this->once()) - ->method('isCacheable') - ->will($this->returnValue(true)); $this->eventManagerMock->expects($this->once()) ->method('dispatch') ->with($this->equalTo('depersonalize_clear_session')); - $this->messageSessionMock->expects($this->once()) - ->method('clearStorage'); + $this->messageSessionMock->expects($this->once())->method('clearStorage'); + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(true); $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $expectedResult); $this->assertEquals($expectedResult, $actualResult); } - /** - * Test method afterGenerateXml with disabled module PageCache - */ - public function testAfterGenerateXmlPageCacheDisabled() + public function testAfterGenerateXmlNoDepersonalize() { + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(false); + $this->eventManagerMock->expects($this->never()) + ->method('dispatch'); + $this->messageSessionMock->expects($this->never())->method('clearStorage'); + $expectedResult = $this->getMock('Magento\Framework\View\Layout', [], [], '', false); - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with($this->equalTo('Magento_PageCache')) - ->will($this->returnValue(false)); - $this->requestMock->expects($this->never()) - ->method('isAjax') - ->will($this->returnValue(false)); $actualResult = $this->plugin->afterGenerateXml($this->layoutMock, $expectedResult); $this->assertEquals($expectedResult, $actualResult); } diff --git a/dev/tests/unit/testsuite/Magento/PageCache/Model/Observer/InvalidateCacheIfChangedTest.php b/dev/tests/unit/testsuite/Magento/PageCache/Model/Observer/InvalidateCacheIfChangedTest.php new file mode 100644 index 0000000000000000000000000000000000000000..02492793b992328d184ec45879fc57f3bf1c38be --- /dev/null +++ b/dev/tests/unit/testsuite/Magento/PageCache/Model/Observer/InvalidateCacheIfChangedTest.php @@ -0,0 +1,86 @@ +<?php +/** + * + * Copyright © 2015 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\PageCache\Model\Observer; + +class InvalidateCacheIfChangedTest extends \PHPUnit_Framework_TestCase +{ + /** @var \Magento\PageCache\Model\Observer\InvalidateCacheIfChanged */ + protected $model; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\PageCache\Model\Config */ + protected $configMock; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\App\Cache\TypeListInterface */ + protected $typeListMock; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Event\Observer */ + protected $observerMock; + + /** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Framework\Object\IdentityInterface */ + protected $objectMock; + + /** + * Set up all mocks and data for test + */ + public function setUp() + { + $this->configMock = $this->getMock( + 'Magento\PageCache\Model\Config', + ['getType', 'isEnabled'], + [], + '', + false + ); + $this->typeListMock = $this->getMock('Magento\Framework\App\Cache\TypeList', [], [], '', false); + + $this->model = new \Magento\PageCache\Model\Observer\InvalidateCacheIfChanged( + $this->configMock, + $this->typeListMock + ); + + $this->observerMock = $this->getMock('Magento\Framework\Event\Observer', [], [], '', false); + $eventMock = $this->getMock('Magento\Framework\Event', ['getObject'], [], '', false); + $this->objectMock = $this->getMockForAbstractClass('Magento\Framework\Object\IdentityInterface', [], '', false); + $eventMock->expects($this->any())->method('getObject')->willReturn($this->objectMock); + $this->observerMock->expects($this->any())->method('getEvent')->willReturn($eventMock); + } + + /** + * @dataProvider invalidateCacheDataProvider + * @param bool $cacheState + */ + public function testExecuteChanged($cacheState) + { + $this->configMock->expects($this->once())->method('isEnabled')->will($this->returnValue($cacheState)); + + if ($cacheState) { + $this->typeListMock->expects($this->once())->method('invalidate')->with($this->equalTo('full_page')); + $this->objectMock->expects($this->once())->method('getIdentities')->will($this->returnValue(['tag_1'])); + } + $this->model->execute($this->observerMock); + } + + /** + * @dataProvider invalidateCacheDataProvider + * @param bool $cacheState + */ + public function testExecuteNoChanged($cacheState) + { + $this->configMock->expects($this->once())->method('isEnabled')->will($this->returnValue($cacheState)); + $this->typeListMock->expects($this->never())->method('invalidate'); + + if ($cacheState) { + $this->objectMock->expects($this->once())->method('getIdentities')->will($this->returnValue([])); + } + $this->model->execute($this->observerMock); + } + + public function invalidateCacheDataProvider() + { + return [[true], [false]]; + } +} diff --git a/dev/tests/unit/testsuite/Magento/Persistent/Model/Layout/DepersonalizePluginTest.php b/dev/tests/unit/testsuite/Magento/Persistent/Model/Layout/DepersonalizePluginTest.php index d48959f5885a3fa4ffee2844509746fa461b10d4..ae84619750d39fbab7bd3132451f61f181aa05d6 100644 --- a/dev/tests/unit/testsuite/Magento/Persistent/Model/Layout/DepersonalizePluginTest.php +++ b/dev/tests/unit/testsuite/Magento/Persistent/Model/Layout/DepersonalizePluginTest.php @@ -15,21 +15,6 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase */ protected $persistentSessionMock; - /** - * @var \Magento\Framework\App\RequestInterface|\PHPUnit_Framework_MockObject_MockObject - */ - protected $requestMock; - - /** - * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject - */ - protected $moduleManagerMock; - - /** - * @var \Magento\PageCache\Model\Config|\PHPUnit_Framework_MockObject_MockObject - */ - protected $cacheConfigMock; - /** * @var \Magento\TestFramework\Helper\ObjectManager */ @@ -40,6 +25,11 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase */ protected $plugin; + /** + * @var \Magento\PageCache\Model\DepersonalizeChecker|\PHPUnit_Framework_MockObject_MockObject + */ + protected $depersonalizeCheckerMock; + /** * Set up * @@ -57,25 +47,13 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase false ); - $this->requestMock = $this->getMockForAbstractClass( - 'Magento\Framework\App\RequestInterface', - [], - '', - false, - true, - true, - ['isAjax'] - ); - $this->moduleManagerMock = $this->getMock( - 'Magento\Framework\Module\Manager', - ['isEnabled'], + $this->requestMock = $this->getMock('Magento\Framework\App\Request\Http', [], [], '', false); + + $this->moduleManagerMock = $this->getMock('Magento\Framework\Module\Manager', ['isEnabled'], [], '', false); + $this->cacheConfigMock = $this->getMock('Magento\PageCache\Model\Config', ['isEnabled'], [], '', false); + $this->depersonalizeCheckerMock = $this->getMock( + 'Magento\PageCache\Model\DepersonalizeChecker', [], - '', - false - ); - $this->cacheConfigMock = $this->getMock( - 'Magento\PageCache\Model\Config', - ['isEnabled'], [], '', false @@ -85,21 +63,12 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase 'Magento\Persistent\Model\Layout\DepersonalizePlugin', [ 'persistentSession' => $this->persistentSessionMock, - 'request' => $this->requestMock, - 'moduleManager' => $this->moduleManagerMock, - 'cacheConfig' => $this->cacheConfigMock + 'depersonalizeChecker' => $this->depersonalizeCheckerMock, ] ); } - /** - * Run test afterGenerateXml method - * - * @param bool $result - * - * @dataProvider dataProviderAfterGenerateXml - */ - public function testAfterGenerateXml($result) + public function testAfterGenerateXml() { /** @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject $subjectMock */ $subjectMock = $this->getMockForAbstractClass( @@ -122,43 +91,38 @@ class DepersonalizePluginTest extends \PHPUnit_Framework_TestCase [] ); - $this->moduleManagerMock->expects($this->once()) - ->method('isEnabled') - ->with('Magento_PageCache') - ->willReturn($result); - $this->cacheConfigMock->expects($this->any()) - ->method('isEnabled') - ->willReturn($result); - $this->requestMock->expects($this->any()) - ->method('isAjax') - ->willReturn(!$result); - $subjectMock->expects($this->any()) - ->method('isCacheable') - ->willReturn($result); - - if ($result) { - $this->persistentSessionMock->expects($this->once()) - ->method('setCustomerId') - ->with(null); - } else { - $this->persistentSessionMock->expects($this->never()) - ->method('setCustomerId') - ->with(null); - } + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(true); + $this->persistentSessionMock->expects($this->once())->method('setCustomerId')->with(null); $this->assertEquals($resultMock, $this->plugin->afterGenerateXml($subjectMock, $resultMock)); } - /** - * Data provider for testAfterGenerateXml - * - * @return array - */ - public function dataProviderAfterGenerateXml() + public function testAfterGenerateXmlNoDepersonalize() { - return [ - ['result' => true], - ['result' => false] - ]; + /** @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject $subjectMock */ + $subjectMock = $this->getMockForAbstractClass( + 'Magento\Framework\View\LayoutInterface', + [], + '', + false, + true, + true, + ['isCacheable'] + ); + /** @var \Magento\Framework\View\LayoutInterface|\PHPUnit_Framework_MockObject_MockObject $resultMock */ + $resultMock = $this->getMockForAbstractClass( + 'Magento\Framework\View\LayoutInterface', + [], + '', + false, + true, + true, + [] + ); + + $this->depersonalizeCheckerMock->expects($this->once())->method('checkIfDepersonalize')->willReturn(false); + $this->persistentSessionMock->expects($this->never())->method('setCustomerId'); + + $this->assertEquals($resultMock, $this->plugin->afterGenerateXml($subjectMock, $resultMock)); } } diff --git a/dev/tests/unit/testsuite/Magento/Setup/Controller/DatabaseCheckTest.php b/dev/tests/unit/testsuite/Magento/Setup/Controller/DatabaseCheckTest.php index 3c062e1406134de1e4a165f2c04f62f0825f8630..e1306a04448d6114f95dc1c88e6498004d9e25fa 100644 --- a/dev/tests/unit/testsuite/Magento/Setup/Controller/DatabaseCheckTest.php +++ b/dev/tests/unit/testsuite/Magento/Setup/Controller/DatabaseCheckTest.php @@ -53,4 +53,10 @@ class DatabaseCheckTest extends \PHPUnit_Framework_TestCase $this->assertArrayHasKey('error', $variables); $this->assertFalse($variables['success']); } + + public function testIndexActionCheckPrefix() + { + $this->installer->expects($this->once())->method('checkDatabaseTablePrefix'); + $this->controller->indexAction(); + } } diff --git a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php index 1ebedf86043fd2307a83ac3f35830afeb1f8de5a..8c777c869e82417a90e684ed24db56a204feac2e 100644 --- a/lib/internal/Magento/Framework/App/ObjectManagerFactory.php +++ b/lib/internal/Magento/Framework/App/ObjectManagerFactory.php @@ -127,6 +127,19 @@ class ObjectManagerFactory } } + // set cache profiler decorator if enabled + if (\Magento\Framework\Profiler::isEnabled()) { + $cacheFactoryArguments = $diConfig->getArguments('Magento\Framework\App\Cache\Frontend\Factory'); + $cacheFactoryArguments['decorators'][] = [ + 'class' => 'Magento\Framework\Cache\Frontend\Decorator\Profiler', + 'parameters' => ['backendPrefixes' => ['Zend_Cache_Backend_', 'Cm_Cache_Backend_']], + ]; + $cacheFactoryConfig = [ + 'Magento\Framework\App\Cache\Frontend\Factory' => ['arguments' => $cacheFactoryArguments] + ]; + $diConfig->extend($cacheFactoryConfig); + } + $sharedInstances = [ 'Magento\Framework\App\DeploymentConfig' => $deploymentConfig, 'Magento\Framework\App\Filesystem\DirectoryList' => $this->directoryList, diff --git a/lib/internal/Magento/Framework/Module/ModuleList/Loader.php b/lib/internal/Magento/Framework/Module/ModuleList/Loader.php index 6c5697243d8647a82de5e655a8b10b22677fe5cd..943ed35520cbc0406eb694274fc8143147cc9d93 100644 --- a/lib/internal/Magento/Framework/Module/ModuleList/Loader.php +++ b/lib/internal/Magento/Framework/Module/ModuleList/Loader.php @@ -9,6 +9,7 @@ namespace Magento\Framework\Module\ModuleList; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Filesystem; use Magento\Framework\Module\Declaration\Converter\Dom; +use Magento\Framework\Xml\Parser; /** * Loader of module list information from the filesystem @@ -29,21 +30,32 @@ class Loader */ private $converter; + /** + * Parser + * + * @var \Magento\Framework\Xml\Parser + */ + private $parser; + /** * Constructor * * @param Filesystem $filesystem * @param Dom $converter + * @param Parser $parser */ - public function __construct(Filesystem $filesystem, Dom $converter) + public function __construct(Filesystem $filesystem, Dom $converter, Parser $parser) { $this->filesystem = $filesystem; $this->converter = $converter; + $this->parser = $parser; + $this->parser->initErrorHandler(); } /** * Loads the full module list information * + * @throws \Magento\Framework\Exception * @return array */ public function load() @@ -52,9 +64,18 @@ class Loader $dir = $this->filesystem->getDirectoryRead(DirectoryList::MODULES); foreach ($dir->search('*/*/etc/module.xml') as $file) { $contents = $dir->readFile($file); - $dom = new \DOMDocument(); - $dom->loadXML($contents); - $data = $this->converter->convert($dom); + + try { + $this->parser->loadXML($contents); + } catch (\Magento\Framework\Exception $e) { + throw new \Magento\Framework\Exception( + 'Invalid Document: ' . $file . PHP_EOL . ' Error: ' . $e->getMessage(), + $e->getCode(), + $e + ); + } + + $data = $this->converter->convert($this->parser->getDom()); $name = key($data); $result[$name] = $data[$name]; } diff --git a/lib/internal/Magento/Framework/Xml/Parser.php b/lib/internal/Magento/Framework/Xml/Parser.php index 46e1303d39fa481cb9420d620d939a06945bd878..02c762922afb447497dc935f649a783a024150d9 100644 --- a/lib/internal/Magento/Framework/Xml/Parser.php +++ b/lib/internal/Magento/Framework/Xml/Parser.php @@ -5,6 +5,8 @@ */ namespace Magento\Framework\Xml; +use \Magento\Framework\Exception; + class Parser { /** @@ -22,6 +24,11 @@ class Parser */ protected $_content = []; + /** + * @var boolean + */ + protected $errorHandlerIsActive = false; + /** * */ @@ -32,6 +39,16 @@ class Parser return $this; } + /** + * Initializes error handler + * + * @return void + */ + public function initErrorHandler() + { + $this->errorHandlerIsActive = true; + } + /** * @return \DOMDocument|null */ @@ -135,7 +152,39 @@ class Parser */ public function loadXML($string) { - $this->getDom()->loadXML($string); + if ($this->errorHandlerIsActive) { + set_error_handler([$this, 'errorHandler']); + } + + try { + $this->getDom()->loadXML($string); + } catch (\Magento\Framework\Exception $e) { + restore_error_handler(); + throw new \Magento\Framework\Exception($e->getMessage(), $e->getCode(), $e); + } + + if ($this->errorHandlerIsActive) { + restore_error_handler(); + } + return $this; } + + /** + * Custom XML lib error handler + * + * @param int $errorNo + * @param string $errorStr + * @param string $errorFile + * @param int $errorLine + * @throws \Magento\Framework\Exception + * @return void + */ + public function errorHandler($errorNo, $errorStr, $errorFile, $errorLine) + { + if ($errorNo != 0) { + $message = "{$errorStr} in {$errorFile} on line {$errorLine}"; + throw new \Magento\Framework\Exception($message); + } + } } diff --git a/setup/pub/magento/setup/create-admin-account.js b/setup/pub/magento/setup/create-admin-account.js index c2cabdb63cffcf9c966bc6b657730f8331a9ff8d..423ef0a341f8e86db3bc7c91e2427725054c2f10 100644 --- a/setup/pub/magento/setup/create-admin-account.js +++ b/setup/pub/magento/setup/create-admin-account.js @@ -18,21 +18,21 @@ angular.module('create-admin-account', ['ngStorage']) return; } var p = $scope.admin.password; - if (p.length > 6 && p.match(/[\d]+/) && p.match(/[a-z]+/) && p.match(/[A-Z]+/) && p.match(/[!@#$%^*()_\/\\\-\+=]+/)) { + if (p.length >= 6 && p.match(/[\d]+/) && p.match(/[a-z]+/) && p.match(/[A-Z]+/) && p.match(/[!@#$%^*()_\/\\\-\+=]+/)) { $scope.admin.passwordStatus.class = 'strong'; $scope.admin.passwordStatus.label = 'Strong'; - } else if (p.length > 6 && p.match(/[\d]+/) && p.match(/[a-z]+/) && p.match(/[A-Z]+/)) { + } else if (p.length >= 6 && p.match(/[\d]+/) && p.match(/[a-z]+/) && p.match(/[A-Z]+/)) { $scope.admin.passwordStatus.class = 'good'; $scope.admin.passwordStatus.label = 'Good'; - } else if (p.length > 6 && p.match(/[\d]+/) && p.match(/[a-zA-Z]+/)) { + } else if (p.length >= 6 && p.match(/[\d]+/) && p.match(/[a-zA-Z]+/)) { + $scope.admin.passwordStatus.class = 'fair'; + $scope.admin.passwordStatus.label = 'Fair'; + } else if (p.length >= 6) { $scope.admin.passwordStatus.class = 'weak'; $scope.admin.passwordStatus.label = 'Weak'; - } else if (p.length > 6) { - $scope.admin.passwordStatus.class = 'to-short'; - $scope.admin.passwordStatus.label = 'Too Short'; } else { - $scope.admin.passwordStatus.class = 'none'; - $scope.admin.passwordStatus.label = 'None'; + $scope.admin.passwordStatus.class = 'too-short'; + $scope.admin.passwordStatus.label = 'Too Short'; } }; @@ -71,7 +71,7 @@ angular.module('create-admin-account', ['ngStorage']) require: "ngModel", link: function(scope, elm, attrs, ctrl){ var validator = function(value){ - var minReg = /^(?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9]{6,}$/, + var minReg = /^(?=.*\d)(?=.*[a-zA-Z]).{6,}$/, isValid = typeof value === 'string' && minReg.test(value); ctrl.$setValidity('checkPassword', isValid); diff --git a/setup/pub/styles/setup.css b/setup/pub/styles/setup.css index e1cc3503329982b2dafb64e3a809772ce1747e47..2b738d61e6ee37fd1d75260db370b4e012fae368 100644 --- a/setup/pub/styles/setup.css +++ b/setup/pub/styles/setup.css @@ -3,4 +3,4 @@ * See COPYING.txt for license details. */ -html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,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:0 0}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]{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}*{box-sizing:border-box}:focus{box-shadow:none;outline:0}.keyfocus :focus{box-shadow:0 0 0 1px #008bdb}embed,img,object,video{max-width:100%}.abs-clearer:after,.form-row:after,.header:after,.ie9 .alert:after,.nav:after,.row:after{content:"";display:table;clear:both}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/light/opensans-300.eot);src:url(../../pub/fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../../pub/fonts/opensans/light/opensans-300.woff) format('woff'),url(../../pub/fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../../pub/fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/regular/opensans-400.eot);src:url(../../pub/fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../../pub/fonts/opensans/regular/opensans-400.woff) format('woff'),url(../../pub/fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../../pub/fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/semibold/opensans-600.eot);src:url(../../pub/fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../../pub/fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../../pub/fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../../pub/fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/bold/opensans-700.eot);src:url(../../pub/fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../../pub/fonts/opensans/bold/opensans-700.woff) format('woff'),url(../../pub/fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../../pub/fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:400;line-height:1.4}h1,h2,h3,h4,h5,h6{font-weight:400;margin-top:0}p{margin:0 0 1em}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}@font-face{font-family:Icons;src:url(../../pub/fonts/icons/icons.eot);src:url(../../pub/fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/icons/icons.woff2) format('woff2'),url(../../pub/fonts/icons/icons.woff) format('woff'),url(../../pub/fonts/icons/icons.ttf) format('truetype'),url(../../pub/fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}[class*=icon-]:after{font-family:Icons}.icon-success-thick:after{content:'\e600'}.icon-success:after{content:'\e601'}.icon-collapse:after{content:'\e602'}.icon-failed-thick:after{content:'\e603'}.icon-failed:after{content:'\e604'}.icon-expand:after{content:'\e605'}.icon-warning:after{content:'\e606'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.8em;left:0;position:absolute;right:0;top:.15em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e600'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e603'}dl,ol,ul{margin-top:0}.list{margin-bottom:1em;padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before{font-family:Icons;font-size:1.6em;left:-.1em;position:absolute;top:-.2em}.list-item-success:before{color:#79a22e;content:'\e601'}.list-item-failed:before{color:#e22626;content:'\e604'}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .5em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(#e04f00 0),color-stop(#f65405 100%));background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:-webkit-linear-gradient(left,color-stop(#f65405 0),color-stop(#e04f00 100%));background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1)}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active{background-color:#574e48}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary.disabled:hover,.ie9 .btn-secondary[disabled]:active,.ie9 .btn-secondary[disabled]:hover{background-color:#514943;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;border-radius:2px;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;vertical-align:top;padding:.43em .55em .5em 0}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{margin-bottom:2.5em;padding-top:1.5em;font-weight:600;font-size:1.25em}.form-legend{width:100%;border-top:1px solid #ccc}.form-legend-light{margin-bottom:1.5em;font-size:1em}.form-legend-expand{transition:opacity .2s linear;cursor:pointer}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e602'}.form-legend-expand:after{margin-left:.5em;font-weight:400;font-size:1.15em;font-family:Icons;content:'\e605';vertical-align:sub}.form-el-checkbox,.form-el-radio{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{border-color:#adadad;border-radius:2px;height:1.4rem;line-height:1;width:1.4rem}.form-el-checkbox:checked+.form-label::before{content:'\e600';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.6rem;width:1.6rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;border-radius:2px;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{position:relative;height:45.2rem;border:1px solid #adadad;overflow:auto;margin:0 0 1.5rem}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fff8d6;border:1px solid #ee7d7d;border-radius:2px;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.4235em .6655em .605em}.check-result-message{margin-left:.5em;min-height:3.68rem;-webkit-align-items:center;-ms-align-items:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}.pseudo-table{display:table}.pseudo-td{display:table-cell}.alert{margin-bottom:3.5rem;padding:2.5rem;-webkit-align-items:center;-ms-align-items:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.alert .spinner{min-width:1em}.ie9 .alert .spinner{float:left}.alert p:last-child{margin-bottom:0}.alert-info{background-color:#fafafa;border:1px solid #ccc}.alert-warning{background-color:#fff8d6;border:1px solid #fff8d6}.alert-icon{margin-right:1.5rem}.ie9 .alert-icon{float:left}[class*=icon-].alert-icon{font-size:3.8rem;min-width:3.8rem}.alert-text{margin-bottom:0}.alert-text~.alert-text{margin-top:1em}.ie9 .alert-text{display:block;margin-left:5.3rem;margin-top:1rem}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0 2rem}.row{margin-left:0;margin-right:0}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-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{min-height:1px;padding-left:0;padding-right:0;position:relative}.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-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:-webkit-linear-gradient(top,#d1d1d1 0,#d4d4d4 100%);background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:.8rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after{display:none}.nav-bar>li.active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a{color:#000}.nav-bar>li.active a:hover{cursor:default}.nav-bar>li.active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:.7rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:.7rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.1rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.1rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:20rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-to-short .password-strength-item:first-child{background-color:#e22626}.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(25% - .6rem)}@-webkit-keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}@-moz-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@-webkit-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@-ms-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span:nth-child(1){-webkit-animation-delay:.27s;-moz-animation-delay:.27s;-ms-animation-delay:.27s;animation-delay:.27s;-webkit-transform:rotate(-315deg);-moz-transform:rotate(-315deg);-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){-webkit-animation-delay:.36s;-moz-animation-delay:.36s;-ms-animation-delay:.36s;animation-delay:.36s;-webkit-transform:rotate(-270deg);-moz-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){-webkit-animation-delay:.45s;-moz-animation-delay:.45s;-ms-animation-delay:.45s;animation-delay:.45s;-webkit-transform:rotate(-225deg);-moz-transform:rotate(-225deg);-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){-webkit-animation-delay:.54s;-moz-animation-delay:.54s;-ms-animation-delay:.54s;animation-delay:.54s;-webkit-transform:rotate(-180deg);-moz-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){-webkit-animation-delay:.63s;-moz-animation-delay:.63s;-ms-animation-delay:.63s;animation-delay:.63s;-webkit-transform:rotate(-135deg);-moz-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){-webkit-animation-delay:.72s;-moz-animation-delay:.72s;-ms-animation-delay:.72s;animation-delay:.72s;-webkit-transform:rotate(-90deg);-moz-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){-webkit-animation-delay:.81s;-moz-animation-delay:.81s;-ms-animation-delay:.81s;animation-delay:.81s;-webkit-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){-webkit-animation-delay:.9;-moz-animation-delay:.9;-ms-animation-delay:.9;animation-delay:.9;-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.spinner>span{-webkit-animation-direction:linear;-moz-animation-direction:linear;-ms-animation-direction:linear;animation-direction:linear;-webkit-animation-duration:.72s;-moz-animation-duration:.72s;-ms-animation-duration:.72s;animation-duration:.72s;-webkit-animation-iteration-count:infinite;-moz-animation-iteration-count:infinite;-ms-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:fade;-moz-animation-name:fade;-ms-animation-name:fade;animation-name:fade;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);transform:scale(0.4);background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../../pub/images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.main{padding-bottom:2rem;padding-top:3rem}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;margin:2.5rem 0 3.5rem 5rem}.page-title{font-size:2rem;margin-bottom:1.3em}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit{margin-bottom:20px}.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.rediness-check-item{margin-bottom:4rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:7.5rem}.readiness-check-content{margin-left:7.5rem;margin-right:22rem}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.rediness-check-side{float:right;padding-left:2.4rem;width:22rem}.rediness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:2rem;margin-top:.7rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .customize-your-store-default .legend{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;margin:1rem 0 2rem;max-height:20rem;overflow-y:auto;padding:1.5rem 2rem 2rem}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}@media all and (max-width:1047px){.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}}@media all and (min-width:768px){html{margin-left:calc(100vw - 100%);margin-right:0;overflow:auto}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}} \ No newline at end of file +html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;font-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,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:0 0}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]{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}*{box-sizing:border-box}:focus{box-shadow:none;outline:0}.keyfocus :focus{box-shadow:0 0 0 1px #008bdb}embed,img,object,video{max-width:100%}.abs-clearer:after,.form-row:after,.header:after,.ie9 .alert:after,.nav:after,.row:after{content:"";display:table;clear:both}.ng-cloak{display:none!important}.hide.hide{display:none}.show.show{display:block}.text-center{text-align:center}.text-right{text-align:right}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/light/opensans-300.eot);src:url(../../pub/fonts/opensans/light/opensans-300.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/light/opensans-300.woff2) format('woff2'),url(../../pub/fonts/opensans/light/opensans-300.woff) format('woff'),url(../../pub/fonts/opensans/light/opensans-300.ttf) format('truetype'),url('../../pub/fonts/opensans/light/opensans-300.svg#Open Sans') format('svg');font-weight:300;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/regular/opensans-400.eot);src:url(../../pub/fonts/opensans/regular/opensans-400.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/regular/opensans-400.woff2) format('woff2'),url(../../pub/fonts/opensans/regular/opensans-400.woff) format('woff'),url(../../pub/fonts/opensans/regular/opensans-400.ttf) format('truetype'),url('../../pub/fonts/opensans/regular/opensans-400.svg#Open Sans') format('svg');font-weight:400;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/semibold/opensans-600.eot);src:url(../../pub/fonts/opensans/semibold/opensans-600.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/semibold/opensans-600.woff2) format('woff2'),url(../../pub/fonts/opensans/semibold/opensans-600.woff) format('woff'),url(../../pub/fonts/opensans/semibold/opensans-600.ttf) format('truetype'),url('../../pub/fonts/opensans/semibold/opensans-600.svg#Open Sans') format('svg');font-weight:600;font-style:normal}@font-face{font-family:'Open Sans';src:url(../../pub/fonts/opensans/bold/opensans-700.eot);src:url(../../pub/fonts/opensans/bold/opensans-700.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/opensans/bold/opensans-700.woff2) format('woff2'),url(../../pub/fonts/opensans/bold/opensans-700.woff) format('woff'),url(../../pub/fonts/opensans/bold/opensans-700.ttf) format('truetype'),url('../../pub/fonts/opensans/bold/opensans-700.svg#Open Sans') format('svg');font-weight:700;font-style:normal}html{font-size:62.5%}body{color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:400;line-height:1.4}h1,h2,h3,h4,h5,h6{font-weight:400;margin-top:0}p{margin:0 0 1em}a{color:#008bdb;text-decoration:none}a:hover{color:#0fa7ff;text-decoration:underline}@font-face{font-family:Icons;src:url(../../pub/fonts/icons/icons.eot);src:url(../../pub/fonts/icons/icons.eot?#iefix) format('embedded-opentype'),url(../../pub/fonts/icons/icons.woff2) format('woff2'),url(../../pub/fonts/icons/icons.woff) format('woff'),url(../../pub/fonts/icons/icons.ttf) format('truetype'),url(../../pub/fonts/icons/icons.svg#Icons) format('svg');font-weight:400;font-style:normal}[class*=icon-]{display:inline-block;line-height:1}[class*=icon-]:after{font-family:Icons}.icon-success-thick:after{content:'\e600'}.icon-success:after{content:'\e601'}.icon-collapse:after{content:'\e602'}.icon-failed-thick:after{content:'\e603'}.icon-failed:after{content:'\e604'}.icon-expand:after{content:'\e605'}.icon-warning:after{content:'\e606'}.icon-failed-round,.icon-success-round{border-radius:100%;color:#fff;font-size:2.5rem;height:1em;position:relative;text-align:center;width:1em}.icon-failed-round:after,.icon-success-round:after{bottom:0;font-size:.8em;left:0;position:absolute;right:0;top:.15em}.icon-success-round{background-color:#79a22e}.icon-success-round:after{content:'\e600'}.icon-failed-round{background-color:#e22626}.icon-failed-round:after{content:'\e603'}dl,ol,ul{margin-top:0}.list{margin-bottom:1em;padding-left:0}.list>li{display:block;margin-bottom:.75em;position:relative}.list>li>.icon-failed,.list>li>.icon-success{font-size:1.6em;left:-.1em;position:absolute;top:0}.list>li>.icon-success{color:#79a22e}.list>li>.icon-failed{color:#e22626}.list-item-failed,.list-item-icon,.list-item-success{padding-left:3.5rem}.list-item-failed:before,.list-item-success:before{font-family:Icons;font-size:1.6em;left:-.1em;position:absolute;top:-.2em}.list-item-success:before{color:#79a22e;content:'\e601'}.list-item-failed:before{color:#e22626;content:'\e604'}.list-definition{margin:0 0 3rem;padding:0}.list-definition>dt{clear:left;float:left}.list-definition>dd{margin-bottom:1em;margin-left:20rem}.btn-wrap{margin:0 auto}.btn-wrap .btn{width:100%}.btn{background:#e3e3e3;border:none;color:#514943;display:inline-block;font-size:1.6rem;font-weight:600;padding:.45em .5em;text-align:center}.btn:hover{background-color:#dbdbdb;color:#514943;text-decoration:none}.btn:active{background-color:#d6d6d6}.btn.disabled,.btn[disabled]{cursor:default;opacity:.5;pointer-events:none}.ie9 .btn.disabled,.ie9 .btn[disabled]{background-color:#f0f0f0;opacity:1;text-shadow:none}.btn-large{padding:.75em 1.25em}.btn-link{background-color:transparent;border:none;color:#008bdb;font-family:1.6rem;font-size:1.5rem}.btn-link:hover{background-color:transparent;color:#0fa7ff}.btn-prime{background-color:#eb5202;color:#fff;text-shadow:1px 1px 0 rgba(0,0,0,.25)}.btn-prime:hover{background-color:#f65405;background-repeat:repeat-x;background-image:linear-gradient(to right,#e04f00 0,#f65405 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e04f00', endColorstr='#f65405', GradientType=1);color:#fff}.btn-prime:active{background-color:#e04f00;background-repeat:repeat-x;background-image:linear-gradient(to right,#f65405 0,#e04f00 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#f65405', endColorstr='#e04f00', GradientType=1)}.ie9 .btn-prime.disabled,.ie9 .btn-prime[disabled]{background-color:#fd6e23}.ie9 .btn-prime.disabled:active,.ie9 .btn-prime.disabled:hover,.ie9 .btn-prime[disabled]:active,.ie9 .btn-prime[disabled]:hover{background-color:#fd6e23;-webkit-filter:none;filter:none}.btn-secondary{background-color:#514943;color:#fff}.btn-secondary:hover{background-color:#5f564f;color:#fff}.btn-secondary:active{background-color:#574e48}.ie9 .btn-secondary.disabled,.ie9 .btn-secondary[disabled]{background-color:#514943}.ie9 .btn-secondary.disabled:active,.ie9 .btn-secondary.disabled:hover,.ie9 .btn-secondary[disabled]:active,.ie9 .btn-secondary[disabled]:hover{background-color:#514943;-webkit-filter:none;filter:none}[class*=btn-wrap-triangle]{overflow:hidden;position:relative}[class*=btn-wrap-triangle] .btn:after{border-style:solid;content:'';height:0;position:absolute;top:0;width:0}.btn-wrap-triangle-right{display:inline-block;padding-right:1.74rem;position:relative}.btn-wrap-triangle-right .btn{text-indent:.92rem}.btn-wrap-triangle-right .btn:after{border-color:transparent transparent transparent #e3e3e3;border-width:1.84rem 0 1.84rem 1.84rem;left:100%;margin-left:-1.74rem}.btn-wrap-triangle-right .btn:hover:after{border-left-color:#dbdbdb}.btn-wrap-triangle-right .btn:active:after{border-left-color:#d6d6d6}.btn-wrap-triangle-right .btn:not(.disabled):active,.btn-wrap-triangle-right .btn:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn.disabled:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:after{border-color:transparent transparent transparent #f0f0f0}.ie9 .btn-wrap-triangle-right .btn.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn[disabled]:hover:after{border-left-color:#f0f0f0}.btn-wrap-triangle-right .btn-prime:after{border-color:transparent transparent transparent #eb5202}.btn-wrap-triangle-right .btn-prime:hover:after{border-left-color:#f65405}.btn-wrap-triangle-right .btn-prime:active:after{border-left-color:#e04f00}.btn-wrap-triangle-right .btn-prime:not(.disabled):active,.btn-wrap-triangle-right .btn-prime:not([disabled]):active{left:1px}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:after{border-color:transparent transparent transparent #fd6e23}.ie9 .btn-wrap-triangle-right .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-right .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-right .btn-prime[disabled]:hover:after{border-left-color:#fd6e23}.btn-wrap-triangle-left{display:inline-block;padding-left:1.74rem}.btn-wrap-triangle-left .btn{text-indent:-.92rem}.btn-wrap-triangle-left .btn:after{border-color:transparent #e3e3e3 transparent transparent;border-width:1.84rem 1.84rem 1.84rem 0;margin-right:-1.74rem;right:100%}.btn-wrap-triangle-left .btn:hover:after{border-right-color:#dbdbdb}.btn-wrap-triangle-left .btn:active:after{border-right-color:#d6d6d6}.btn-wrap-triangle-left .btn:not(.disabled):active,.btn-wrap-triangle-left .btn:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn.disabled:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:after{border-color:transparent #f0f0f0 transparent transparent}.ie9 .btn-wrap-triangle-left .btn.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn[disabled]:hover:after{border-right-color:#f0f0f0}.btn-wrap-triangle-left .btn-prime:after{border-color:transparent #eb5202 transparent transparent}.btn-wrap-triangle-left .btn-prime:hover:after{border-right-color:#e04f00}.btn-wrap-triangle-left .btn-prime:active:after{border-right-color:#f65405}.btn-wrap-triangle-left .btn-prime:not(.disabled):active,.btn-wrap-triangle-left .btn-prime:not([disabled]):active{right:1px}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:after{border-color:transparent #fd6e23 transparent transparent}.ie9 .btn-wrap-triangle-left .btn-prime.disabled:active:after,.ie9 .btn-wrap-triangle-left .btn-prime.disabled:hover:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:active:after,.ie9 .btn-wrap-triangle-left .btn-prime[disabled]:hover:after{border-right-color:#fd6e23}.btn-expand{background-color:transparent;border:none;color:#303030;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.4rem;font-weight:700;padding:0;position:relative}.btn-expand.expanded:after{border-color:transparent transparent #303030;border-width:0 .285em .36em}.btn-expand.expanded:hover:after{border-color:transparent transparent #3d3d3d}.btn-expand:hover{background-color:transparent;border:none;color:#3d3d3d}.btn-expand:hover:after{border-color:#3d3d3d transparent transparent}.btn-expand:after{border-color:#303030 transparent transparent;border-style:solid;border-width:.36em .285em 0;content:'';height:0;left:100%;margin-left:.5em;margin-top:-.18em;position:absolute;top:50%;width:0}[class*=col-] .form-el-input,[class*=col-] .form-el-select{width:100%}.form-fieldset{border:none;margin:0 0 1em;padding:0}.form-row{margin-bottom:2.2rem}.form-row .form-row{margin-bottom:.4rem}.form-row .form-label{display:block;font-weight:600;padding:.6rem 2.1em 0 0;text-align:right}.form-row .form-label.required{position:relative}.form-row .form-label.required:after{color:#eb5202;content:'*';font-size:1.15em;position:absolute;right:.7em;top:.5em}.form-row .form-el-checkbox+.form-label:before,.form-row .form-el-radio+.form-label:before{top:.7rem}.form-row .form-el-checkbox+.form-label:after,.form-row .form-el-radio+.form-label:after{top:1.1rem}input:not([disabled]):focus,textarea:not([disabled]):focus{box-shadow:none}.form-el-input{border:1px solid #adadad;border-radius:2px;color:#303030;padding:.35em .55em .5em}.form-el-input:hover{border-color:#949494}.form-el-input:focus{border-color:#008bdb}.form-label{margin-bottom:.5em}[class*=form-label][for]{cursor:pointer}.form-el-insider-wrap{display:table;width:100%}.form-el-insider-input{display:table-cell;width:100%}.form-el-insider{border-radius:2px;display:table-cell;vertical-align:top;padding:.43em .55em .5em 0}.form-legend,.form-legend-expand,.form-legend-light{display:block;margin:0}.form-legend,.form-legend-expand{margin-bottom:2.5em;padding-top:1.5em;font-weight:600;font-size:1.25em}.form-legend{width:100%;border-top:1px solid #ccc}.form-legend-light{margin-bottom:1.5em;font-size:1em}.form-legend-expand{transition:opacity .2s linear;cursor:pointer}.form-legend-expand:hover{opacity:.85}.form-legend-expand.expanded:after{content:'\e602'}.form-legend-expand:after{margin-left:.5em;font-weight:400;font-size:1.15em;font-family:Icons;content:'\e605';vertical-align:sub}.form-el-checkbox,.form-el-radio{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.form-el-checkbox.disabled+.form-label,.form-el-checkbox.disabled+.form-label:before,.form-el-checkbox[disabled]+.form-label,.form-el-checkbox[disabled]+.form-label:before,.form-el-radio.disabled+.form-label,.form-el-radio.disabled+.form-label:before,.form-el-radio[disabled]+.form-label,.form-el-radio[disabled]+.form-label:before{cursor:default;opacity:.5;pointer-events:none}.form-el-checkbox:not(.disabled)+.form-label:hover:before,.form-el-checkbox:not([disabled])+.form-label:hover:before,.form-el-radio:not(.disabled)+.form-label:hover:before,.form-el-radio:not([disabled])+.form-label:hover:before{border-color:#514943}.form-el-checkbox+.form-label,.form-el-radio+.form-label{font-weight:400;padding-left:2em;padding-right:0;position:relative;text-align:left;transition:border-color .1s linear}.form-el-checkbox+.form-label:before,.form-el-radio+.form-label:before{border:1px solid;content:'';left:0;position:absolute;top:.1rem;transition:border-color .1s linear}.form-el-checkbox+.form-label:before{border-color:#adadad;border-radius:2px;height:1.4rem;line-height:1;width:1.4rem}.form-el-checkbox:checked+.form-label::before{content:'\e600';font-family:Icons}.form-el-radio+.form-label:before{background-color:#fff;border:1px solid #adadad;border-radius:100%;height:1.6rem;width:1.6rem}.form-el-radio+.form-label:after{background:0 0;border:.5rem solid transparent;border-radius:100%;content:'';height:0;left:.4rem;position:absolute;top:.5rem;transition:background .3s linear;width:0}.form-el-radio:checked+.form-label{cursor:default}.form-el-radio:checked+.form-label:after{border-color:#514943}.form-select-label{border:1px solid #adadad;border-radius:2px;color:#303030;cursor:pointer;display:block;overflow:hidden;position:relative}.form-select-label:hover,.form-select-label:hover:after{border-color:#949494}.form-select-label:active,.form-select-label:active:after,.form-select-label:focus,.form-select-label:focus:after{border-color:#008bdb}.form-select-label:after{background:#e3e3e3;border-left:1px solid #adadad;bottom:0;content:'';position:absolute;right:0;top:0;width:2.36em;z-index:-2}.ie9 .form-select-label:after{display:none}.form-select-label:before{border-color:#303030 transparent transparent;border-style:solid;border-width:5px 4px 0;content:'';height:0;margin-right:-4px;margin-top:-2.5px;position:absolute;right:1.18em;top:50%;width:0;z-index:-1}.ie9 .form-select-label:before{display:none}.form-select-label .form-el-select{background:0 0;border:none;border-radius:0;content:'';display:block;margin:0;padding:.35em calc(2.36em + 10%) .5em .55em;width:110%}.ie9 .form-select-label .form-el-select{padding-right:.55em;width:100%}.form-el-select{background:#fff;border:1px solid #adadad;border-radius:2px;color:#303030;display:block;padding:.35em .55em}.multiselect-custom{position:relative;height:45.2rem;border:1px solid #adadad;overflow:auto;margin:0 0 1.5rem}.multiselect-custom ul{margin:0;padding:0;list-style:none;min-width:29rem}.multiselect-custom .item{padding:1rem 1.4rem}.multiselect-custom .selected{background-color:#e0f6fe}.multiselect-custom .form-label{margin-bottom:0}[class*=form-el-].invalid{border-color:#e22626}[class*=form-el-].invalid+.error-container{display:block}.error-container{background-color:#fff8d6;border:1px solid #ee7d7d;border-radius:2px;color:#514943;display:none;font-size:1.19rem;margin-top:.2rem;padding:.4235em .6655em .605em}.check-result-message{margin-left:.5em;min-height:3.68rem;-webkit-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.check-result-text{margin-left:.5em}.pseudo-table{display:table}.pseudo-td{display:table-cell}.alert{margin-bottom:3.5rem;padding:2.5rem;-webkit-align-items:center;-ms-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-flex;display:-ms-flexbox;display:flex}.alert .spinner{min-width:1em}.ie9 .alert .spinner{float:left}.alert p:last-child{margin-bottom:0}.alert-info{background-color:#fafafa;border:1px solid #ccc}.alert-warning{background-color:#fff8d6;border:1px solid #fff8d6}.alert-icon{margin-right:1.5rem}.ie9 .alert-icon{float:left}[class*=icon-].alert-icon{font-size:3.8rem;min-width:3.8rem}.alert-text{margin-bottom:0}.alert-text~.alert-text{margin-top:1em}.ie9 .alert-text{display:block;margin-left:5.3rem;margin-top:1rem}.container{display:block;margin:0 auto 4rem;max-width:100rem;padding:0 2rem}.row{margin-left:0;margin-right:0}.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9,.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-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{min-height:1px;padding-left:0;padding-right:0;position:relative}.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-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}.nav{background-color:#f8f8f8;border-bottom:1px solid #e3e3e3;border-top:1px solid #e3e3e3;display:none;padding:2.2rem 1.5rem 0 0}.nav .btn-group,.nav-bar-outer-actions{float:right;margin-bottom:1.7rem}.nav .btn-group .btn-wrap,.nav-bar-outer-actions .btn-wrap{float:right;margin-left:.5rem;margin-right:.5rem}.nav-bar-outer-actions{margin-top:-10.6rem;padding-right:1.5rem}.btn-wrap-try-again{width:9.5rem}.btn-wrap-next,.btn-wrap-prev{width:8.5rem}.nav-bar{counter-reset:i;float:left;margin:0 1rem 1.7rem 0;padding:0;position:relative;white-space:nowrap}.nav-bar:before{background-color:#d4d4d4;background-repeat:repeat-x;background-image:linear-gradient(to bottom,#d1d1d1 0,#d4d4d4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#d1d1d1', endColorstr='#d4d4d4', GradientType=0);border-bottom:1px solid #d9d9d9;border-top:1px solid #bfbfbf;content:'';height:.8rem;left:5.15rem;position:absolute;right:5.15rem;top:.7rem}.nav-bar>li{display:inline-block;font-size:0;position:relative;vertical-align:top;width:10.3rem}.nav-bar>li:first-child:after{display:none}.nav-bar>li:after{background-color:#514943;content:'';height:.5rem;left:calc(-50% + .25rem);position:absolute;right:calc(50% + .7rem);top:.9rem}.nav-bar>li.disabled:before{bottom:0;content:'';left:0;position:absolute;right:0;top:0;z-index:1}.nav-bar>li.active~li:after{display:none}.nav-bar>li.active~li a:after{background-color:transparent;border-color:transparent;color:#a6a6a6}.nav-bar>li.active a{color:#000}.nav-bar>li.active a:hover{cursor:default}.nav-bar>li.active a:after{background-color:#fff;content:''}.nav-bar a{color:#514943;display:block;font-size:1.2rem;font-weight:600;line-height:1.2;overflow:hidden;padding:3rem .5em 0;position:relative;text-align:center;text-overflow:ellipsis}.nav-bar a:hover{text-decoration:none}.nav-bar a:after{background-color:#514943;border:.4rem solid #514943;border-radius:100%;color:#fff;content:counter(i);counter-increment:i;height:.7rem;left:50%;line-height:.6;margin-left:-.8rem;position:absolute;right:auto;text-align:center;top:.4rem;width:.7rem}.nav-bar a:before{background-color:#d6d6d6;border:1px solid transparent;border-bottom-color:#d9d9d9;border-radius:100%;border-top-color:#bfbfbf;content:'';height:2.1rem;left:50%;line-height:1;margin-left:-1.2rem;position:absolute;top:0;width:2.1rem}.tooltip{display:block;font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif;font-size:1.19rem;font-weight:400;line-height:1.4;opacity:0;position:absolute;visibility:visible;z-index:10}.tooltip.in{opacity:.9}.tooltip.top{margin-top:-4px;padding:8px 0}.tooltip.right{margin-left:4px;padding:0 8px}.tooltip.bottom{margin-top:4px;padding:8px 0}.tooltip.left{margin-left:-4px;padding:0 8px}.tooltip-inner{background-color:#fff;border:1px solid #adadad;border-radius:0;box-shadow:1px 1px 1px #ccc;color:#41362f;max-width:20rem;padding:.5em 1em;text-decoration:none}.tooltip-arrow,.tooltip-arrow:after{border:solid transparent;height:0;position:absolute;width:0}.tooltip-arrow:after{content:'';position:absolute}.tooltip.top .tooltip-arrow,.tooltip.top .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:50%;margin-left:-8px}.tooltip.top-left .tooltip-arrow,.tooltip.top-left .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;margin-bottom:-8px;right:8px}.tooltip.top-right .tooltip-arrow,.tooltip.top-right .tooltip-arrow:after{border-top-color:#949494;border-width:8px 8px 0;bottom:0;left:8px;margin-bottom:-8px}.tooltip.right .tooltip-arrow,.tooltip.right .tooltip-arrow:after{border-right-color:#949494;border-width:8px 8px 8px 0;left:1px;margin-top:-8px;top:50%}.tooltip.right .tooltip-arrow:after{border-right-color:#fff;border-width:6px 7px 6px 0;margin-left:0;margin-top:-6px}.tooltip.left .tooltip-arrow,.tooltip.left .tooltip-arrow:after{border-left-color:#949494;border-width:8px 0 8px 8px;margin-top:-8px;right:0;top:50%}.tooltip.bottom .tooltip-arrow,.tooltip.bottom .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:50%;margin-left:-8px;top:0}.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;margin-top:-8px;right:8px;top:0}.tooltip.bottom-right .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow:after{border-bottom-color:#949494;border-width:0 8px 8px;left:8px;margin-top:-8px;top:0}.password-strength{display:block;margin:0 -.3rem 1em;white-space:nowrap}.password-strength.password-strength-too-short .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child,.password-strength.password-strength-weak .password-strength-item:first-child+.password-strength-item{background-color:#e22626}.password-strength.password-strength-fair .password-strength-item:first-child,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-fair .password-strength-item:first-child+.password-strength-item+.password-strength-item{background-color:#ef672f}.password-strength.password-strength-good .password-strength-item:first-child,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item,.password-strength.password-strength-good .password-strength-item:first-child+.password-strength-item+.password-strength-item+.password-strength-item,.password-strength.password-strength-strong .password-strength-item{background-color:#79a22e}.password-strength .password-strength-item{background-color:#ccc;display:inline-block;font-size:0;height:1.4rem;margin-right:.3rem;width:calc(20% - .6rem)}@-webkit-keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:4rem 0}to{background-position:0 0}}.progress{background-color:#fafafa;border:1px solid #ccc;height:3rem;margin-bottom:3rem;overflow:hidden}.progress-bar{background-color:#79a22e;color:#fff;float:left;font-size:1.19rem;height:100%;line-height:3rem;text-align:center;transition:width .6s ease;width:0}.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.spinner{display:inline-block;font-size:4rem;height:1em;margin-right:1.5rem;position:relative;width:1em}@-webkit-keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}@keyframes fade{0%{background-color:#514943}100%{background-color:#fff}}.spinner>span:nth-child(1){-webkit-animation-delay:.27s;animation-delay:.27s;-webkit-transform:rotate(-315deg);-ms-transform:rotate(-315deg);transform:rotate(-315deg)}.spinner>span:nth-child(2){-webkit-animation-delay:.36s;animation-delay:.36s;-webkit-transform:rotate(-270deg);-ms-transform:rotate(-270deg);transform:rotate(-270deg)}.spinner>span:nth-child(3){-webkit-animation-delay:.45s;animation-delay:.45s;-webkit-transform:rotate(-225deg);-ms-transform:rotate(-225deg);transform:rotate(-225deg)}.spinner>span:nth-child(4){-webkit-animation-delay:.54s;animation-delay:.54s;-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.spinner>span:nth-child(5){-webkit-animation-delay:.63s;animation-delay:.63s;-webkit-transform:rotate(-135deg);-ms-transform:rotate(-135deg);transform:rotate(-135deg)}.spinner>span:nth-child(6){-webkit-animation-delay:.72s;animation-delay:.72s;-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);transform:rotate(-90deg)}.spinner>span:nth-child(7){-webkit-animation-delay:.81s;animation-delay:.81s;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg)}.spinner>span:nth-child(8){-webkit-animation-delay:.9;animation-delay:.9;-webkit-transform:rotate(0deg);-ms-transform:rotate(0deg);transform:rotate(0deg)}.spinner>span{-webkit-animation-direction:linear;animation-direction:linear;-webkit-animation-duration:.72s;animation-duration:.72s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:fade;animation-name:fade;-webkit-transform:scale(0.4);-ms-transform:scale(0.4);transform:scale(0.4);background-color:#fff;border-radius:6px;clip:rect(0 .28571429em .1em 0);height:.1em;margin-top:.5em;position:absolute;width:1em}.ie9 .spinner{background:url(../../pub/images/ajax-loader.gif) center no-repeat}.ie9 .spinner>span{display:none}.main{padding-bottom:2rem;padding-top:3rem}.header{display:none}.header .logo{float:left;height:4.1rem;width:3.5rem}.header-title{font-size:2.8rem;letter-spacing:.02em;margin:2.5rem 0 3.5rem 5rem}.page-title{font-size:2rem;margin-bottom:1.3em}.accent-box{margin-bottom:2rem}.accent-box .btn-prime{margin-top:1.5rem}.page-landing{margin:7.6% auto 0;max-width:44rem;text-align:center}.page-landing .logo{height:5.6rem;margin-bottom:2rem;width:19.2rem}.page-landing .text-version{margin-bottom:3rem}.page-landing .text-welcome{margin-bottom:6.5rem}.page-landing .text-terms{margin-bottom:2.5rem;text-align:center}.page-landing .btn-submit{margin-bottom:20px}.page-license .license-text{margin-bottom:2rem}.page-license .page-license-footer{text-align:right}.rediness-check-item{margin-bottom:4rem}.readiness-check-title{font-size:1.4rem;font-weight:700;margin-bottom:.1rem;margin-left:7.5rem}.readiness-check-content{margin-left:7.5rem;margin-right:22rem}.readiness-check-content .readiness-check-title{margin-left:0}.readiness-check-content .list{margin-top:-.3rem}.rediness-check-side{float:right;padding-left:2.4rem;width:22rem}.rediness-check-side .side-title{margin-bottom:0}.readiness-check-icon{float:left;margin-left:2rem;margin-top:.7rem}.page-web-configuration .form-el-insider-wrap{width:auto}.page-web-configuration .form-el-insider{width:15.4rem}.page-web-configuration .form-el-insider-input .form-el-input{width:16.5rem}.customize-your-store .customize-your-store-default .legend{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.customize-your-store .advanced-modules-count,.customize-your-store .advanced-modules-select{padding-left:1.5rem}.customize-your-store .customize-your-store-advanced{min-width:0}.content-install{margin-bottom:2rem}.console{border:1px solid #ccc;font-family:'Courier New',Courier,monospace;font-weight:300;margin:1rem 0 2rem;max-height:20rem;overflow-y:auto;padding:1.5rem 2rem 2rem}.console .text-danger{color:#e22626}.console .text-success{color:#090}.console .hidden{display:none}.content-success .btn-prime{margin-top:1.5rem}.jumbo-title{font-size:3.6rem}.jumbo-title .jumbo-icon{font-size:3.8rem;margin-right:.25em;position:relative;top:.15em}@media all and (max-width:1047px){.nav{padding-bottom:5.38rem;padding-left:1.5rem;text-align:center}.nav-bar{display:inline-block;float:none;margin-right:0;vertical-align:top}.nav .btn-group,.nav-bar-outer-actions{display:inline-block;float:none;margin-top:-8.48rem;text-align:center;vertical-align:top;width:100%}.nav-bar-outer-actions{padding-right:0}.nav-bar-outer-actions .outer-actions-inner-wrap{display:inline-block}}@media all and (min-width:768px){html{margin-left:calc(100vw - 100%);margin-right:0;overflow:auto}.col-m-1,.col-m-10,.col-m-11,.col-m-12,.col-m-2,.col-m-3,.col-m-4,.col-m-5,.col-m-6,.col-m-7,.col-m-8,.col-m-9{float:left}.col-m-12{width:100%}.col-m-11{width:91.66666667%}.col-m-10{width:83.33333333%}.col-m-9{width:75%}.col-m-8{width:66.66666667%}.col-m-7{width:58.33333333%}.col-m-6{width:50%}.col-m-5{width:41.66666667%}.col-m-4{width:33.33333333%}.col-m-3{width:25%}.col-m-2{width:16.66666667%}.col-m-1{width:8.33333333%}.col-m-pull-12{right:100%}.col-m-pull-11{right:91.66666667%}.col-m-pull-10{right:83.33333333%}.col-m-pull-9{right:75%}.col-m-pull-8{right:66.66666667%}.col-m-pull-7{right:58.33333333%}.col-m-pull-6{right:50%}.col-m-pull-5{right:41.66666667%}.col-m-pull-4{right:33.33333333%}.col-m-pull-3{right:25%}.col-m-pull-2{right:16.66666667%}.col-m-pull-1{right:8.33333333%}.col-m-pull-0{right:auto}.col-m-push-12{left:100%}.col-m-push-11{left:91.66666667%}.col-m-push-10{left:83.33333333%}.col-m-push-9{left:75%}.col-m-push-8{left:66.66666667%}.col-m-push-7{left:58.33333333%}.col-m-push-6{left:50%}.col-m-push-5{left:41.66666667%}.col-m-push-4{left:33.33333333%}.col-m-push-3{left:25%}.col-m-push-2{left:16.66666667%}.col-m-push-1{left:8.33333333%}.col-m-push-0{left:auto}.col-m-offset-12{margin-left:100%}.col-m-offset-11{margin-left:91.66666667%}.col-m-offset-10{margin-left:83.33333333%}.col-m-offset-9{margin-left:75%}.col-m-offset-8{margin-left:66.66666667%}.col-m-offset-7{margin-left:58.33333333%}.col-m-offset-6{margin-left:50%}.col-m-offset-5{margin-left:41.66666667%}.col-m-offset-4{margin-left:33.33333333%}.col-m-offset-3{margin-left:25%}.col-m-offset-2{margin-left:16.66666667%}.col-m-offset-1{margin-left:8.33333333%}.col-m-offset-0{margin-left:0}}@media all and (min-width:1048px){.col-l-1,.col-l-10,.col-l-11,.col-l-12,.col-l-2,.col-l-3,.col-l-4,.col-l-5,.col-l-6,.col-l-7,.col-l-8,.col-l-9{float:left}.col-l-12{width:100%}.col-l-11{width:91.66666667%}.col-l-10{width:83.33333333%}.col-l-9{width:75%}.col-l-8{width:66.66666667%}.col-l-7{width:58.33333333%}.col-l-6{width:50%}.col-l-5{width:41.66666667%}.col-l-4{width:33.33333333%}.col-l-3{width:25%}.col-l-2{width:16.66666667%}.col-l-1{width:8.33333333%}.col-l-pull-12{right:100%}.col-l-pull-11{right:91.66666667%}.col-l-pull-10{right:83.33333333%}.col-l-pull-9{right:75%}.col-l-pull-8{right:66.66666667%}.col-l-pull-7{right:58.33333333%}.col-l-pull-6{right:50%}.col-l-pull-5{right:41.66666667%}.col-l-pull-4{right:33.33333333%}.col-l-pull-3{right:25%}.col-l-pull-2{right:16.66666667%}.col-l-pull-1{right:8.33333333%}.col-l-pull-0{right:auto}.col-l-push-12{left:100%}.col-l-push-11{left:91.66666667%}.col-l-push-10{left:83.33333333%}.col-l-push-9{left:75%}.col-l-push-8{left:66.66666667%}.col-l-push-7{left:58.33333333%}.col-l-push-6{left:50%}.col-l-push-5{left:41.66666667%}.col-l-push-4{left:33.33333333%}.col-l-push-3{left:25%}.col-l-push-2{left:16.66666667%}.col-l-push-1{left:8.33333333%}.col-l-push-0{left:auto}.col-l-offset-12{margin-left:100%}.col-l-offset-11{margin-left:91.66666667%}.col-l-offset-10{margin-left:83.33333333%}.col-l-offset-9{margin-left:75%}.col-l-offset-8{margin-left:66.66666667%}.col-l-offset-7{margin-left:58.33333333%}.col-l-offset-6{margin-left:50%}.col-l-offset-5{margin-left:41.66666667%}.col-l-offset-4{margin-left:33.33333333%}.col-l-offset-3{margin-left:25%}.col-l-offset-2{margin-left:16.66666667%}.col-l-offset-1{margin-left:8.33333333%}.col-l-offset-0{margin-left:0}}@media all and (min-width:1440px){.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9{float:left}.col-xl-12{width:100%}.col-xl-11{width:91.66666667%}.col-xl-10{width:83.33333333%}.col-xl-9{width:75%}.col-xl-8{width:66.66666667%}.col-xl-7{width:58.33333333%}.col-xl-6{width:50%}.col-xl-5{width:41.66666667%}.col-xl-4{width:33.33333333%}.col-xl-3{width:25%}.col-xl-2{width:16.66666667%}.col-xl-1{width:8.33333333%}.col-xl-pull-12{right:100%}.col-xl-pull-11{right:91.66666667%}.col-xl-pull-10{right:83.33333333%}.col-xl-pull-9{right:75%}.col-xl-pull-8{right:66.66666667%}.col-xl-pull-7{right:58.33333333%}.col-xl-pull-6{right:50%}.col-xl-pull-5{right:41.66666667%}.col-xl-pull-4{right:33.33333333%}.col-xl-pull-3{right:25%}.col-xl-pull-2{right:16.66666667%}.col-xl-pull-1{right:8.33333333%}.col-xl-pull-0{right:auto}.col-xl-push-12{left:100%}.col-xl-push-11{left:91.66666667%}.col-xl-push-10{left:83.33333333%}.col-xl-push-9{left:75%}.col-xl-push-8{left:66.66666667%}.col-xl-push-7{left:58.33333333%}.col-xl-push-6{left:50%}.col-xl-push-5{left:41.66666667%}.col-xl-push-4{left:33.33333333%}.col-xl-push-3{left:25%}.col-xl-push-2{left:16.66666667%}.col-xl-push-1{left:8.33333333%}.col-xl-push-0{left:auto}.col-xl-offset-12{margin-left:100%}.col-xl-offset-11{margin-left:91.66666667%}.col-xl-offset-10{margin-left:83.33333333%}.col-xl-offset-9{margin-left:75%}.col-xl-offset-8{margin-left:66.66666667%}.col-xl-offset-7{margin-left:58.33333333%}.col-xl-offset-6{margin-left:50%}.col-xl-offset-5{margin-left:41.66666667%}.col-xl-offset-4{margin-left:33.33333333%}.col-xl-offset-3{margin-left:25%}.col-xl-offset-2{margin-left:16.66666667%}.col-xl-offset-1{margin-left:8.33333333%}.col-xl-offset-0{margin-left:0}}@media all and (max-width:767px){.list-definition>dt{float:none}.list-definition>dd{margin-left:0}.form-row .form-label{text-align:left}.form-row .form-label.required:after{position:static}.nav{padding-bottom:0;padding-left:0;padding-right:0}.nav-bar-outer-actions{margin-top:0}.nav-bar{display:block;margin-bottom:0;margin-left:auto;margin-right:auto;width:30.9rem}.nav-bar:before{display:none}.nav-bar>li{float:left;min-height:9rem}.nav-bar>li:after{display:none}.nav-bar>li:nth-child(4n){clear:both}.nav-bar a{line-height:1.4}.tooltip{display:none!important}.readiness-check-content{margin-right:2rem}.form-el-insider,.form-el-insider-wrap,.page-web-configuration .form-el-insider-input,.page-web-configuration .form-el-insider-input .form-el-input{display:block;width:100%}}@media all and (max-width:479px){.nav-bar{width:23.175rem}.nav-bar>li{width:7.725rem}.nav .btn-group .btn-wrap-try-again,.nav-bar-outer-actions .btn-wrap-try-again{clear:both;display:block;float:none;margin-left:auto;margin-right:auto;margin-top:1rem;padding-top:1rem}} \ No newline at end of file diff --git a/setup/src/Magento/Setup/Controller/DatabaseCheck.php b/setup/src/Magento/Setup/Controller/DatabaseCheck.php index 0f5f911bd16268575ecd44f9e5a3408d705347aa..809496c9a6a0304f12bfc5d5a9b4cd11c221d8df 100644 --- a/setup/src/Magento/Setup/Controller/DatabaseCheck.php +++ b/setup/src/Magento/Setup/Controller/DatabaseCheck.php @@ -47,10 +47,13 @@ class DatabaseCheck extends AbstractActionController public function indexAction() { $params = Json::decode($this->getRequest()->getContent(), Json::TYPE_ARRAY); + try { $installer = $this->installerFactory->create($this->webLogger); $password = isset($params['password']) ? $params['password'] : ''; $installer->checkDatabaseConnection($params['name'], $params['host'], $params['user'], $password); + $tablePrefix = isset($params['tablePrefix']) ? $params['tablePrefix'] : ''; + $installer->checkDatabaseTablePrefix($tablePrefix); return new JsonModel(['success' => true]); } catch (\Exception $e) { return new JsonModel(['success' => false, 'error' => $e->getMessage()]); diff --git a/setup/src/Magento/Setup/Model/Installer.php b/setup/src/Magento/Setup/Model/Installer.php index 6e4ed5761aa0807670519790364e68ceff0d3634..aaac7d81ac2e8f9fd85973faaa53170d317df449 100644 --- a/setup/src/Magento/Setup/Model/Installer.php +++ b/setup/src/Magento/Setup/Model/Installer.php @@ -875,6 +875,24 @@ class Installer return true; } + /** + * Check if database table prefix is valid + * + * @param string $prefix + * @return boolean + * @throws \InvalidArgumentException + */ + public function checkDatabaseTablePrefix($prefix) + { + //The table prefix should contain only letters (a-z), numbers (0-9) or underscores (_); + // the first character should be a letter. + if ($prefix !== '' && !preg_match('/^([a-zA-Z])([[:alnum:]_]+)$/', $prefix)) { + throw new \InvalidArgumentException('Please correct the table prefix format.'); + } + + return true; + } + /** * Return messages * @@ -994,6 +1012,9 @@ class Installer $config[DbConfig::KEY_USER], $config[DbConfig::KEY_PASS] ); + if (isset($config[DbConfig::KEY_PREFIX])) { + $this->checkDatabaseTablePrefix($config[DbConfig::KEY_PREFIX]); + } } /** diff --git a/setup/view/magento/setup/add-database.phtml b/setup/view/magento/setup/add-database.phtml index 7f6c7e68d8fa6f6b51134429ed79a92c93b1b40e..797ba456e7882c1f889385f7463fdfdc2b809698 100644 --- a/setup/view/magento/setup/add-database.phtml +++ b/setup/view/magento/setup/add-database.phtml @@ -337,7 +337,7 @@ id="dbTablePrefix" class="form-el-input" tooltip-placement="right" - tooltip="Enter a tracking prefix to be used for database tables created for this Magento installation. (ex: 'mg1_' )." + tooltip="Enter a prefix for database tables created in this installation. Use letters, numbers or underscores, and begin with a letter (Ex: ‘mg1_’)" tooltip-trigger="focus" tooltip-append-to-body="true" type="text" diff --git a/setup/view/magento/setup/create-admin-account.phtml b/setup/view/magento/setup/create-admin-account.phtml index 14ffe9061f505af3662035080142413cc50f0483..cb6b54e2c631d1b13a4bf2a181e2bf8522804275 100644 --- a/setup/view/magento/setup/create-admin-account.phtml +++ b/setup/view/magento/setup/create-admin-account.phtml @@ -15,10 +15,11 @@ $passwordWizard = sprintf( <div class=\'password-strength-item\'></div> <div class=\'password-strength-item\'></div> <div class=\'password-strength-item\'></div> + <div class=\'password-strength-item\'></div> </div> <p>%s</p>', 'Password Strength:', - 'Must be a mix of at least 7 alpha and numeric characters.(Ex.: BuyIt54).' + 'Enter a mix of 6 or more numbers and letters. For a stronger password, include at least one small letter, big letter, and symbol (Ex: BuyIt$54).' ); ?> @@ -144,7 +145,7 @@ $passwordWizard = sprintf( > <div class="error-container"> <span ng-show="account.adminPassword.$error.checkPassword"> - Please enter at least 7 alpha-numeric characters. + Please enter a mix of at least 6 alpha-numeric characters. </span> <span ng-show="account.adminPassword.$error.required"> Please enter your new password. diff --git a/setup/view/styles/components/tooltips/_password-strength.less b/setup/view/styles/components/tooltips/_password-strength.less index 9f77e70ef6ea06ec64658afff53083d2d6e35f39..1d80388483533f0f9a3f349a5a8c0fe6fb1fed6b 100644 --- a/setup/view/styles/components/tooltips/_password-strength.less +++ b/setup/view/styles/components/tooltips/_password-strength.less @@ -7,7 +7,7 @@ display: block; margin: 0 -.3rem 1em; white-space: nowrap; - &.password-strength-to-short { + &.password-strength-too-short { .password-strength-item { &:first-child { background-color: @color-failed; @@ -17,13 +17,22 @@ &.password-strength-weak { .password-strength-item:first-child, .password-strength-item:first-child + .password-strength-item { + background-color: @color-failed; + } + } + &.password-strength-fair { + .password-strength-item:first-child, + .password-strength-item:first-child + .password-strength-item, + .password-strength-item:first-child + .password-strength-item + .password-strength-item { background-color: @color-warning; } } &.password-strength-good { .password-strength-item:first-child, .password-strength-item:first-child + .password-strength-item, - .password-strength-item:first-child + .password-strength-item + .password-strength-item { + .password-strength-item:first-child + .password-strength-item + .password-strength-item, + .password-strength-item:first-child + .password-strength-item + .password-strength-item + + .password-strength-item { background-color: @color-success; } } @@ -38,6 +47,6 @@ font-size: 0; height: 1.4rem; margin-right: .3rem; - width: ~'calc(25% - .6rem)'; + width: ~'calc(20% - .6rem)'; } }