]> git.immae.eu Git - github/wallabag/wallabag.git/commitdiff
Merge pull request #3165 from wallabag/it-translation-update
authorJérémy Benoist <j0k3r@users.noreply.github.com>
Tue, 6 Jun 2017 09:44:18 +0000 (11:44 +0200)
committerGitHub <noreply@github.com>
Tue, 6 Jun 2017 09:44:18 +0000 (11:44 +0200)
Update Italian translation

82 files changed:
app/AppKernel.php
app/Resources/static/themes/material/css/article.scss
app/Resources/static/themes/material/css/cards.scss
app/Resources/static/themes/material/css/entries.scss
app/config/config.yml
app/config/config_test.yml
app/config/parameters.yml.dist
app/config/parameters_test.yml
app/config/tests/parameters_test.mysql.yml
app/config/tests/parameters_test.pgsql.yml
app/config/tests/parameters_test.sqlite.yml
composer.json
phpunit.xml.dist
src/Wallabag/ApiBundle/Controller/EntryRestController.php
src/Wallabag/ApiBundle/Controller/UserRestController.php [new file with mode: 0644]
src/Wallabag/ApiBundle/Resources/config/routing_rest.yml
src/Wallabag/CoreBundle/Command/InstallCommand.php
src/Wallabag/CoreBundle/Controller/ConfigController.php
src/Wallabag/CoreBundle/Controller/EntryController.php
src/Wallabag/CoreBundle/Controller/TagController.php
src/Wallabag/CoreBundle/DependencyInjection/Configuration.php
src/Wallabag/CoreBundle/DependencyInjection/WallabagCoreExtension.php
src/Wallabag/CoreBundle/Entity/Entry.php
src/Wallabag/CoreBundle/Event/Subscriber/SQLiteCascadeDeleteSubscriber.php
src/Wallabag/CoreBundle/GuzzleSiteAuthenticator/GrabySiteConfigBuilder.php
src/Wallabag/CoreBundle/Helper/ContentProxy.php
src/Wallabag/CoreBundle/Helper/DownloadImages.php
src/Wallabag/CoreBundle/Helper/PreparePagerForEntries.php
src/Wallabag/CoreBundle/Helper/Redirect.php
src/Wallabag/CoreBundle/Helper/RuleBasedTagger.php
src/Wallabag/CoreBundle/Resources/config/services.yml
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/_card_list.html.twig
src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig
src/Wallabag/ImportBundle/Command/ImportCommand.php
src/Wallabag/ImportBundle/Import/AbstractImport.php
src/Wallabag/ImportBundle/Import/BrowserImport.php
src/Wallabag/ImportBundle/Import/InstapaperImport.php
src/Wallabag/ImportBundle/Import/PinboardImport.php
src/Wallabag/ImportBundle/Import/PocketImport.php
src/Wallabag/ImportBundle/Import/ReadabilityImport.php
src/Wallabag/ImportBundle/Import/WallabagImport.php
src/Wallabag/ImportBundle/Import/WallabagV1Import.php
src/Wallabag/ImportBundle/Import/WallabagV2Import.php
src/Wallabag/ImportBundle/Resources/config/services.yml
src/Wallabag/UserBundle/Controller/ManageController.php
src/Wallabag/UserBundle/Entity/User.php
src/Wallabag/UserBundle/EventListener/CreateConfigListener.php
tests/Wallabag/ApiBundle/Controller/DeveloperControllerTest.php
tests/Wallabag/ApiBundle/Controller/EntryRestControllerTest.php
tests/Wallabag/ApiBundle/Controller/TagRestControllerTest.php
tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php [new file with mode: 0644]
tests/Wallabag/ApiBundle/WallabagApiTestCase.php
tests/Wallabag/CoreBundle/Command/ExportCommandTest.php
tests/Wallabag/CoreBundle/Command/InstallCommandTest.php
tests/Wallabag/CoreBundle/Command/TagAllCommandTest.php
tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
tests/Wallabag/CoreBundle/Controller/EntryControllerTest.php
tests/Wallabag/CoreBundle/Controller/ExportControllerTest.php
tests/Wallabag/CoreBundle/Controller/TagControllerTest.php
tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
tests/Wallabag/CoreBundle/Helper/DownloadImagesTest.php
tests/Wallabag/CoreBundle/Helper/RedirectTest.php
tests/Wallabag/CoreBundle/ParamConverter/UsernameRssTokenConverterTest.php
tests/Wallabag/CoreBundle/WallabagCoreTestCase.php
tests/Wallabag/ImportBundle/Command/ImportCommandTest.php
tests/Wallabag/ImportBundle/Command/RedisWorkerCommandTest.php
tests/Wallabag/ImportBundle/Controller/InstapaperControllerTest.php
tests/Wallabag/ImportBundle/Controller/PinboardControllerTest.php
tests/Wallabag/ImportBundle/Controller/ReadabilityControllerTest.php
tests/Wallabag/ImportBundle/Controller/WallabagV1ControllerTest.php
tests/Wallabag/ImportBundle/Controller/WallabagV2ControllerTest.php
tests/Wallabag/ImportBundle/Import/InstapaperImportTest.php
tests/Wallabag/ImportBundle/Import/ReadabilityImportTest.php
tests/Wallabag/ImportBundle/Import/WallabagV1ImportTest.php
tests/Wallabag/ImportBundle/Import/WallabagV2ImportTest.php
tests/Wallabag/ImportBundle/fixtures/instapaper-export.csv
tests/Wallabag/ImportBundle/fixtures/pinboard_export
tests/Wallabag/ImportBundle/fixtures/readability.json
tests/Wallabag/ImportBundle/fixtures/wallabag-v1.json
tests/Wallabag/ImportBundle/fixtures/wallabag-v2.json
tests/Wallabag/UserBundle/Controller/ManageControllerTest.php
web/bundles/wallabagcore/material.css

index b9293498ff60ccf14079e51d217baf48ebb4b617..c50783a6d6901fce9a25d12e6cd9b479daf935af 100644 (file)
@@ -48,6 +48,10 @@ class AppKernel extends Kernel
             $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
             $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
             $bundles[] = new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle();
+
+            if ('test' === $this->getEnvironment()) {
+                $bundles[] = new DAMA\DoctrineTestBundle\DAMADoctrineTestBundle();
+            }
         }
 
         return $bundles;
index 8b67f6bd3c7004b73c6d3cdb64df4d59d5b12c2a..27ff52214d521620f735c2bb7b85a306f8e2d134 100644 (file)
       background-color: $blueAccentColor;
       padding: 0 15px 0 10px;
       margin: auto 2px;
+      border-radius: 6px;
 
       a,
       i {
index f5b79193931248b0d9ede9cf8da6a21a8ab89706..3edbe673eb5d2973013cdec1df4613a83d52c970 100644 (file)
@@ -175,15 +175,66 @@ a.original:not(.waves-effect) {
 }
 
 .card-stacked {
+  display: flex;
+  flex-flow: row wrap;
+
   &:hover ul.tools-list {
-    display: block;
+    display: inline;
+    text-align: right;
+  }
+
+  .preview {
+    max-width: 100px;
+    height: auto;
+    margin-right: 10px;
+    flex: 1;
+
+    img {
+      max-width: 100%;
+      max-height: 100%;
+    }
+  }
+
+  div.metadata {
+    .chip {
+      background-color: $blueAccentColor;
+      padding: 0 15px 0 10px;
+      margin: auto 2px;
+      border-radius: 6px;
+
+      a,
+      i {
+        color: #fff;
+      }
+
+      i.material-icons {
+        float: right;
+        font-size: 20px;
+        line-height: 32px;
+        padding-left: 8px;
+      }
+    }
+  }
+
+  div.card-content {
+    flex: 4;
   }
 
   ul.tools-list {
+    flex: 1;
     display: none;
+    flex-basis: 5em;
+    align-self: flex-end;
+    float: right;
+    max-width: 6em;
   }
 }
 
+#content .collection .collection-item {
+  min-height: 65px;
+  height: auto;
+}
+
 .quickstart .card .card-action a,
 .quickstart .card .card-action a:hover {
   color: #fff !important;
index b6a46a9e1db6dfe15f62e4ee644833d27dfb6d8d..c667be2720d554b4c2440e96d9b55917c2d7667e 100644 (file)
@@ -2,6 +2,15 @@
  * Entries
  * ========================================================================== */
 
+.collection {
+  margin: 15px 15px 0;
+
+  .collection-item {
+    padding: 7px;
+    height: 65px;
+  }
+}
+
 .results {
   height: 1em;
 
index 9792616ec97e0182b8a0d3060215702af1630c41..04f8547dea49dfc953142cb0228908d05ca5cf0a 100644 (file)
@@ -58,6 +58,7 @@ wallabag_core:
     cache_lifetime: 10
     action_mark_as_read: 1
     list_mode: 0
+    fetching_error_message_title: 'No title found'
     fetching_error_message: |
         wallabag can't retrieve contents for this article. Please <a href="http://doc.wallabag.org/en/user/errors_during_fetching.html#how-can-i-help-to-fix-that">troubleshoot this issue</a>.
     api_limit_mass_actions: 10
index f5e2c25ead1bca8ccb1b9980fa48657f5c864c76..c620c35995c3afb97febcfeecf1d3e72191a263e 100644 (file)
@@ -29,7 +29,8 @@ doctrine:
         user: "%test_database_user%"
         password: "%test_database_password%"
         charset: "%test_database_charset%"
-        path: "%test_database_path%"
+        path: "%env(TEST_DATABASE_PATH)%"
+
     orm:
         metadata_cache_driver:
             type: service
index 97f51ed1f676966e5b405cd624cede955a20221d..afcee0399006a400030573bc9c5cf6d0e270c988 100644 (file)
@@ -10,17 +10,18 @@ parameters:
     # database_user: %env.database_user%
     # database_password: %env.database_password%
 
-    database_driver: pdo_sqlite
+    database_driver: pdo_mysql
     database_host: 127.0.0.1
     database_port: ~
-    database_name: symfony
+    database_name: wallabag
     database_user: root
     database_password: ~
-    database_path: "%kernel.root_dir%/../data/db/wallabag.sqlite"
+    # For SQLite, database_path should be "%kernel.root_dir%/../data/db/wallabag.sqlite"
+    database_path: null
     database_table_prefix: wallabag_
     database_socket: null
-    # with MySQL, use "utf8mb4" if you got problem with content with emojis
-    database_charset: utf8
+    # with PostgreSQL and SQLite, you must set "utf8"
+    database_charset: utf8mb4
 
     mailer_transport: smtp
     mailer_host: 127.0.0.1
index 5f2e25bb9bb13ebe021a6e3ca6c00a7d11f51e6b..010785e67c5de8e378ba978602eb96dc60864960 100644 (file)
@@ -5,5 +5,6 @@ parameters:
     test_database_name: null
     test_database_user: null
     test_database_password: null
-    test_database_path: '%kernel.root_dir%/../data/db/wallabag_test.sqlite'
+    test_database_path: "%env(TEST_DATABASE_PATH)%"
+    env(TEST_DATABASE_PATH): "%kernel.root_dir%/../data/db/wallabag_test.sqlite"
     test_database_charset: utf8
index bca2d466364588c62dd13a4d2649d3708a2403d8..36b227fbc800f11ce6dbebb0a9d8eade68d728be 100644 (file)
@@ -6,4 +6,5 @@ parameters:
     test_database_user: root
     test_database_password: ~
     test_database_path: ~
+    env(TEST_DATABASE_PATH): ~
     test_database_charset: utf8mb4
index 3e18d4a0395f41fedced20f96fe9ee6241cb9e64..60f51df6d84e0c6631d15de618726bd294c4acfd 100644 (file)
@@ -6,4 +6,5 @@ parameters:
     test_database_user: travis
     test_database_password: ~
     test_database_path: ~
+    env(TEST_DATABASE_PATH): ~
     test_database_charset: utf8
index b8a5f41a709020ae1e59a3d47f15dd10f47732a5..5c731bf54f6bcc704e45b8910d68bb005876a05f 100644 (file)
@@ -5,5 +5,8 @@ parameters:
     test_database_name: ~
     test_database_user: ~
     test_database_password: ~
-    test_database_path: "%kernel.root_dir%/../data/db/wallabag_test.sqlite"
+    # Using an environnement variable in order to avoid the error "attempt to write a readonly database"
+    # when the schema is dropped then recreate
+    test_database_path: "%env(TEST_DATABASE_PATH)%"
+    env(TEST_DATABASE_PATH): "%kernel.root_dir%/../data/db/wallabag_test.sqlite"
     test_database_charset: utf8
index d8c58de28d9800174e7c72dfe29ce8a69d4358cc..0a170c168db3162a3eb4d082d7f2956400c5faaa 100644 (file)
         "wallabag/tcpdf": "^6.2",
         "simplepie/simplepie": "~1.3.1",
         "willdurand/hateoas-bundle": "~1.0",
-        "htmlawed/htmlawed": "~1.1.19",
         "liip/theme-bundle": "~1.1",
         "lexik/form-filter-bundle": "~5.0",
-        "j0k3r/graby": "~1.0",
+        "j0k3r/graby": "^1.0",
         "friendsofsymfony/user-bundle": "^2.0",
         "friendsofsymfony/oauth-server-bundle": "^1.5",
         "stof/doctrine-extensions-bundle": "^1.2",
         "doctrine/doctrine-fixtures-bundle": "~2.2",
         "doctrine/data-fixtures": "~1.1.1",
         "sensio/generator-bundle": "^3.0",
-        "symfony/phpunit-bridge": "^3.0",
+        "symfony/phpunit-bridge": "^3.3",
         "friendsofphp/php-cs-fixer": "~1.9",
-        "m6web/redis-mock": "^2.0"
+        "m6web/redis-mock": "^2.0",
+        "dama/doctrine-test-bundle": "^1.0"
     },
     "scripts": {
         "post-cmd": [
index 3216b6ffb40818fd4645cc2a15b8ceff68b21920..8f5285e65b9ff196dc17faac326e5b41b54fc41a 100644 (file)
@@ -30,4 +30,8 @@
             </exclude>
         </whitelist>
     </filter>
+
+    <listeners>
+        <listener class="\DAMA\DoctrineTestBundle\PHPUnit\PHPUnitStaticDbConnectionListener" />
+    </listeners>
 </phpunit>
index 31bb67fd7d834ed391f08b2c942ca78d6c1056f9..93c8157e758a934905663846516fccc27b46e50b 100644 (file)
@@ -231,7 +231,6 @@ class EntryRestController extends WallabagRestController
         $this->validateAuthentication();
 
         $urls = json_decode($request->query->get('urls', []));
-        $results = [];
 
         $limit = $this->container->getParameter('wallabag_core.api_limit_mass_actions');
 
@@ -239,32 +238,34 @@ class EntryRestController extends WallabagRestController
             throw new HttpException(400, 'API limit reached');
         }
 
+        $results = [];
+        if (empty($urls)) {
+            return $this->sendResponse($results);
+        }
+
         // handle multiple urls
-        if (!empty($urls)) {
-            foreach ($urls as $key => $url) {
-                $entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId(
-                    $url,
-                    $this->getUser()->getId()
-                );
-
-                $results[$key]['url'] = $url;
-
-                if (false === $entry) {
-                    $entry = $this->get('wallabag_core.content_proxy')->updateEntry(
-                        new Entry($this->getUser()),
-                        $url
-                    );
-                }
+        foreach ($urls as $key => $url) {
+            $entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId(
+                $url,
+                $this->getUser()->getId()
+            );
 
-                $em = $this->getDoctrine()->getManager();
-                $em->persist($entry);
-                $em->flush();
+            $results[$key]['url'] = $url;
 
-                $results[$key]['entry'] = $entry instanceof Entry ? $entry->getId() : false;
+            if (false === $entry) {
+                $entry = new Entry($this->getUser());
 
-                // entry saved, dispatch event about it!
-                $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
+                $this->get('wallabag_core.content_proxy')->updateEntry($entry, $url);
             }
+
+            $em = $this->getDoctrine()->getManager();
+            $em->persist($entry);
+            $em->flush();
+
+            $results[$key]['entry'] = $entry instanceof Entry ? $entry->getId() : false;
+
+            // entry saved, dispatch event about it!
+            $this->get('event_dispatcher')->dispatch(EntrySavedEvent::NAME, new EntrySavedEvent($entry));
         }
 
         return $this->sendResponse($results);
@@ -273,6 +274,9 @@ class EntryRestController extends WallabagRestController
     /**
      * Create an entry.
      *
+     * If you want to provide the HTML content (which means wallabag won't fetch it from the url), you must provide `content`, `title` & `url` fields **non-empty**.
+     * Otherwise, content will be fetched as normal from the url and values will be overwritten.
+     *
      * @ApiDoc(
      *       parameters={
      *          {"name"="url", "dataType"="string", "required"=true, "format"="http://www.test.com/article.html", "description"="Url for the entry."},
@@ -280,6 +284,11 @@ class EntryRestController extends WallabagRestController
      *          {"name"="tags", "dataType"="string", "required"=false, "format"="tag1,tag2,tag3", "description"="a comma-separated list of tags."},
      *          {"name"="starred", "dataType"="integer", "required"=false, "format"="1 or 0", "description"="entry already starred"},
      *          {"name"="archive", "dataType"="integer", "required"=false, "format"="1 or 0", "description"="entry already archived"},
+     *          {"name"="content", "dataType"="string", "required"=false, "description"="Content of the entry"},
+     *          {"name"="language", "dataType"="string", "required"=false, "description"="Language of the entry"},
+     *          {"name"="preview_picture", "dataType"="string", "required"=false, "description"="Preview picture of the entry"},
+     *          {"name"="published_at", "dataType"="datetime|integer", "format"="YYYY-MM-DDTHH:II:SS+TZ or a timestamp", "required"=false, "description"="Published date of the entry"},
+     *          {"name"="authors", "dataType"="string", "format"="Name Firstname,author2,author3", "required"=false, "description"="Authors of the entry"},
      *       }
      * )
      *
@@ -291,32 +300,46 @@ class EntryRestController extends WallabagRestController
 
         $url = $request->request->get('url');
         $title = $request->request->get('title');
+        $tags = $request->request->get('tags', []);
         $isArchived = $request->request->get('archive');
         $isStarred = $request->request->get('starred');
+        $content = $request->request->get('content');
+        $language = $request->request->get('language');
+        $picture = $request->request->get('preview_picture');
+        $publishedAt = $request->request->get('published_at');
+        $authors = $request->request->get('authors', '');
 
         $entry = $this->get('wallabag_core.entry_repository')->findByUrlAndUserId($url, $this->getUser()->getId());
 
         if (false === $entry) {
             $entry = new Entry($this->getUser());
-            try {
-                $entry = $this->get('wallabag_core.content_proxy')->updateEntry(
-                    $entry,
-                    $url
-                );
-            } catch (\Exception $e) {
-                $this->get('logger')->error('Error while saving an entry', [
-                    'exception' => $e,
-                    'entry' => $entry,
-                ]);
-                $entry->setUrl($url);
-            }
         }
 
-        if (!is_null($title)) {
-            $entry->setTitle($title);
+        try {
+            $this->get('wallabag_core.content_proxy')->updateEntry(
+                $entry,
+                $url,
+                [
+                    'title' => $title,
+                    'html' => $content,
+                    'url' => $url,
+                    'language' => $language,
+                    'date' => $publishedAt,
+                    // faking the preview picture
+                    'open_graph' => [
+                        'og_image' => $picture,
+                    ],
+                    'authors' => explode(',', $authors),
+                ]
+            );
+        } catch (\Exception $e) {
+            $this->get('logger')->error('Error while saving an entry', [
+                'exception' => $e,
+                'entry' => $entry,
+            ]);
+            $entry->setUrl($url);
         }
 
-        $tags = $request->request->get('tags', '');
         if (!empty($tags)) {
             $this->get('wallabag_core.tags_assigner')->assignTagsToEntry($entry, $tags);
         }
@@ -406,7 +429,7 @@ class EntryRestController extends WallabagRestController
         $this->validateUserAccess($entry->getUser()->getId());
 
         try {
-            $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
+            $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
         } catch (\Exception $e) {
             $this->get('logger')->error('Error while saving an entry', [
                 'exception' => $e,
diff --git a/src/Wallabag/ApiBundle/Controller/UserRestController.php b/src/Wallabag/ApiBundle/Controller/UserRestController.php
new file mode 100644 (file)
index 0000000..a1b78e3
--- /dev/null
@@ -0,0 +1,139 @@
+<?php
+
+namespace Wallabag\ApiBundle\Controller;
+
+use FOS\UserBundle\Event\UserEvent;
+use FOS\UserBundle\FOSUserEvents;
+use JMS\Serializer\SerializationContext;
+use Nelmio\ApiDocBundle\Annotation\ApiDoc;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\JsonResponse;
+use Wallabag\UserBundle\Entity\User;
+
+class UserRestController extends WallabagRestController
+{
+    /**
+     * Retrieve current logged in user informations.
+     *
+     * @ApiDoc()
+     *
+     * @return JsonResponse
+     */
+    public function getUserAction()
+    {
+        $this->validateAuthentication();
+
+        return $this->sendUser($this->getUser());
+    }
+
+    /**
+     * Register an user.
+     *
+     * @ApiDoc(
+     *      requirements={
+     *          {"name"="username", "dataType"="string", "required"=true, "description"="The user's username"},
+     *          {"name"="password", "dataType"="string", "required"=true, "description"="The user's password"},
+     *          {"name"="email", "dataType"="string", "required"=true, "description"="The user's email"}
+     *      }
+     * )
+     *
+     * @todo Make this method (or the whole API) accessible only through https
+     *
+     * @return JsonResponse
+     */
+    public function putUserAction(Request $request)
+    {
+        if (!$this->container->getParameter('fosuser_registration')) {
+            $json = $this->get('serializer')->serialize(['error' => "Server doesn't allow registrations"], 'json');
+
+            return (new JsonResponse())->setJson($json)->setStatusCode(403);
+        }
+
+        $userManager = $this->get('fos_user.user_manager');
+        $user = $userManager->createUser();
+        // enable created user by default
+        $user->setEnabled(true);
+
+        $form = $this->createForm('Wallabag\UserBundle\Form\NewUserType', $user, [
+            'csrf_protection' => false,
+        ]);
+
+        // simulate form submission
+        $form->submit([
+            'username' => $request->request->get('username'),
+            'plainPassword' => [
+                'first' => $request->request->get('password'),
+                'second' => $request->request->get('password'),
+            ],
+            'email' => $request->request->get('email'),
+        ]);
+
+        if ($form->isSubmitted() && false === $form->isValid()) {
+            $view = $this->view($form, 400);
+            $view->setFormat('json');
+
+            // handle errors in a more beautiful way than the default view
+            $data = json_decode($this->handleView($view)->getContent(), true)['children'];
+            $errors = [];
+
+            if (isset($data['username']['errors'])) {
+                $errors['username'] = $this->translateErrors($data['username']['errors']);
+            }
+
+            if (isset($data['email']['errors'])) {
+                $errors['email'] = $this->translateErrors($data['email']['errors']);
+            }
+
+            if (isset($data['plainPassword']['children']['first']['errors'])) {
+                $errors['password'] = $this->translateErrors($data['plainPassword']['children']['first']['errors']);
+            }
+
+            $json = $this->get('serializer')->serialize(['error' => $errors], 'json');
+
+            return (new JsonResponse())->setJson($json)->setStatusCode(400);
+        }
+
+        $userManager->updateUser($user);
+
+        // dispatch a created event so the associated config will be created
+        $event = new UserEvent($user, $request);
+        $this->get('event_dispatcher')->dispatch(FOSUserEvents::USER_CREATED, $event);
+
+        return $this->sendUser($user);
+    }
+
+    /**
+     * Send user response.
+     *
+     * @param User $user
+     *
+     * @return JsonResponse
+     */
+    private function sendUser(User $user)
+    {
+        $json = $this->get('serializer')->serialize(
+            $user,
+            'json',
+            SerializationContext::create()->setGroups(['user_api'])
+        );
+
+        return (new JsonResponse())->setJson($json);
+    }
+
+    /**
+     * Translate errors message.
+     *
+     * @param array $errors
+     *
+     * @return array
+     */
+    private function translateErrors($errors)
+    {
+        $translatedErrors = [];
+        foreach ($errors as $error) {
+            $translatedErrors[] = $this->get('translator')->trans($error);
+        }
+
+        return $translatedErrors;
+    }
+}
index 57d37f4b454fa3aa15d3f4d6a36f194fd428d2ee..c0283e71f159603317b1179bbf194c21514c12fa 100644 (file)
@@ -17,3 +17,8 @@ misc:
   type: rest
   resource: "WallabagApiBundle:WallabagRest"
   name_prefix:  api_
+
+user:
+  type: rest
+  resource: "WallabagApiBundle:UserRest"
+  name_prefix:  api_
index 0d9364f6aa4fb30a2c629f033126e254dbb5d722..d9608246e47da188e496a5b7b6874987010cdc39 100644 (file)
@@ -499,20 +499,18 @@ class InstallCommand extends ContainerAwareCommand
         $output = new BufferedOutput();
         $exitCode = $this->getApplication()->run(new ArrayInput($parameters), $output);
 
+        // PDO does not always close the connection after Doctrine commands.
+        // See https://github.com/symfony/symfony/issues/11750.
+        $this->getContainer()->get('doctrine')->getManager()->getConnection()->close();
+
         if (0 !== $exitCode) {
             $this->getApplication()->setAutoExit(true);
 
-            $this->defaultOutput->writeln('');
-            $this->defaultOutput->writeln('<error>The command "'.$command.'" generates some errors: </error>');
-            $this->defaultOutput->writeln($output->fetch());
-
-            die();
+            throw new \RuntimeException(
+                'The command "'.$command."\" generates some errors: \n\n"
+                .$output->fetch());
         }
 
-        // PDO does not always close the connection after Doctrine commands.
-        // See https://github.com/symfony/symfony/issues/11750.
-        $this->getContainer()->get('doctrine')->getManager()->getConnection()->close();
-
         return $this;
     }
 
index 1a80cc1ac12f61cd1d9512bd4d9177636b55e4f6..0e61c642039a98c4ced84493130a6ab4e61c4148 100644 (file)
@@ -250,7 +250,7 @@ class ConfigController extends Controller
             case 'entries':
                 // SQLite doesn't care about cascading remove, so we need to manually remove associated stuff
                 // otherwise they won't be removed ...
-                if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) {
+                if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
                     $this->getDoctrine()->getRepository('WallabagAnnotationBundle:Annotation')->removeAllByUserId($this->getUser()->getId());
                 }
 
@@ -262,7 +262,7 @@ class ConfigController extends Controller
                     ->removeAllByUserId($this->getUser()->getId());
                 break;
             case 'archived':
-                if ($this->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) {
+                if ($this->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
                     $this->removeAnnotationsForArchivedByUserId($this->getUser()->getId());
                 }
 
index 8d2ac6d4cf144fd515bf347ec1d0dfa12beb725d..fafa49f1b0bb69a156db8318a6ab3e9a9c2bba02 100644 (file)
@@ -53,22 +53,17 @@ class EntryController extends Controller
 
     /**
      * Fetch content and update entry.
-     * In case it fails, entry will return to avod loosing the data.
+     * In case it fails, $entry->getContent will return an error message.
      *
      * @param Entry  $entry
      * @param string $prefixMessage Should be the translation key: entry_saved or entry_reloaded
-     *
-     * @return Entry
      */
     private function updateEntry(Entry $entry, $prefixMessage = 'entry_saved')
     {
-        // put default title in case of fetching content failed
-        $entry->setTitle('No title found');
-
         $message = 'flashes.entry.notice.'.$prefixMessage;
 
         try {
-            $entry = $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
+            $this->get('wallabag_core.content_proxy')->updateEntry($entry, $entry->getUrl());
         } catch (\Exception $e) {
             $this->get('logger')->error('Error while saving an entry', [
                 'exception' => $e,
@@ -79,8 +74,6 @@ class EntryController extends Controller
         }
 
         $this->get('session')->getFlashBag()->add('notice', $message);
-
-        return $entry;
     }
 
     /**
@@ -321,8 +314,7 @@ class EntryController extends Controller
 
         $pagerAdapter = new DoctrineORMAdapter($qb->getQuery(), true, false);
 
-        $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')
-            ->prepare($pagerAdapter, $page);
+        $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter);
 
         try {
             $entries->setCurrentPage($page);
index fb6a720b6e9d73d5b2608a505cf36a3a5836ed91..9422bae43644b1796518d14ec5680661e4547fcd 100644 (file)
@@ -70,7 +70,7 @@ class TagController extends Controller
             $em->flush();
         }
 
-        $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'));
+        $redirectUrl = $this->get('wallabag_core.helper.redirect')->to($request->headers->get('referer'), '', true);
 
         return $this->redirect($redirectUrl);
     }
@@ -125,8 +125,7 @@ class TagController extends Controller
 
         $pagerAdapter = new ArrayAdapter($entriesByTag);
 
-        $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')
-            ->prepare($pagerAdapter, $page);
+        $entries = $this->get('wallabag_core.helper.prepare_pager_for_entries')->prepare($pagerAdapter);
 
         try {
             $entries->setCurrentPage($page);
index 75b37729f38eb601c093bd9b786602c63b4c5291..8b5b57442d358d055f203e87e3fa94c94b932521 100644 (file)
@@ -41,6 +41,8 @@ class Configuration implements ConfigurationInterface
                 ->end()
                 ->scalarNode('fetching_error_message')
                 ->end()
+                ->scalarNode('fetching_error_message_title')
+                ->end()
                 ->scalarNode('action_mark_as_read')
                     ->defaultValue(1)
                 ->end()
index c075c19fd993c48d6c77ee88bf34f545d8d3e336..a2a703cb6c40a910abfe1ea99ca0dd9a57fc4616 100644 (file)
@@ -26,6 +26,7 @@ class WallabagCoreExtension extends Extension
         $container->setParameter('wallabag_core.action_mark_as_read', $config['action_mark_as_read']);
         $container->setParameter('wallabag_core.list_mode', $config['list_mode']);
         $container->setParameter('wallabag_core.fetching_error_message', $config['fetching_error_message']);
+        $container->setParameter('wallabag_core.fetching_error_message_title', $config['fetching_error_message_title']);
         $container->setParameter('wallabag_core.api_limit_mass_actions', $config['api_limit_mass_actions']);
 
         $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
index 08a67c34b1f00275b1f61b3cf5bed3b734800560..9a7dd4e7b77e43613e7a1048a847fda7afb724d4 100644 (file)
@@ -550,7 +550,7 @@ class Entry
     }
 
     /**
-     * @return ArrayCollection<Tag>
+     * @return ArrayCollection
      */
     public function getTags()
     {
@@ -685,7 +685,7 @@ class Entry
     }
 
     /**
-     * @return int
+     * @return string
      */
     public function getHttpStatus()
     {
@@ -693,7 +693,7 @@ class Entry
     }
 
     /**
-     * @param int $httpStatus
+     * @param string $httpStatus
      *
      * @return Entry
      */
index 3b4c4cf9fedfdd8d8e5ff1ffd141336873a92a68..5e6af8cc5bc341a13154697f11f0d4af3f676be9 100644 (file)
@@ -45,9 +45,8 @@ class SQLiteCascadeDeleteSubscriber implements EventSubscriber
     public function preRemove(LifecycleEventArgs $args)
     {
         $entity = $args->getEntity();
-
-        if (!$this->doctrine->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver ||
-            !$entity instanceof Entry) {
+        if (!$this->doctrine->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform
+            || !$entity instanceof Entry) {
             return;
         }
 
index c712bb26e2de7c66f487132da00e63e8c718d463..1c56fa9f44279c0fa800abc5726bbd9ad876e043 100644 (file)
@@ -5,7 +5,6 @@ namespace Wallabag\CoreBundle\GuzzleSiteAuthenticator;
 use BD\GuzzleSiteAuthenticator\SiteConfig\SiteConfig;
 use BD\GuzzleSiteAuthenticator\SiteConfig\SiteConfigBuilder;
 use Graby\SiteConfig\ConfigBuilder;
-use OutOfRangeException;
 use Psr\Log\LoggerInterface;
 
 class GrabySiteConfigBuilder implements SiteConfigBuilder
@@ -38,13 +37,7 @@ class GrabySiteConfigBuilder implements SiteConfigBuilder
     }
 
     /**
-     * Builds the SiteConfig for a host.
-     *
-     * @param string $host The "www." prefix is ignored
-     *
-     * @return SiteConfig
-     *
-     * @throws OutOfRangeException If there is no config for $host
+     * {@inheritdoc}
      */
     public function buildForHost($host)
     {
index 4b3e6fbb161fd176ad875b5f3b1d8857037d47df..bfaa197695941af57dde87e751f95d1a1d0cc30c 100644 (file)
@@ -31,22 +31,20 @@ class ContentProxy
     }
 
     /**
-     * Fetch content using graby and hydrate given entry with results information.
-     * In case we couldn't find content, we'll try to use Open Graph data.
+     * Update entry using either fetched or provided content.
      *
-     * We can also force the content, in case of an import from the v1 for example, so the function won't
-     * fetch the content from the website but rather use information given with the $content parameter.
-     *
-     * @param Entry  $entry   Entry to update
-     * @param string $url     Url to grab content for
-     * @param array  $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
-     *
-     * @return Entry
+     * @param Entry  $entry                Entry to update
+     * @param string $url                  Url of the content
+     * @param array  $content              Array with content provided for import with AT LEAST keys title, html, url to skip the fetchContent from the url
+     * @param bool   $disableContentUpdate Whether to skip trying to fetch content using Graby
      */
-    public function updateEntry(Entry $entry, $url, array $content = [])
+    public function updateEntry(Entry $entry, $url, array $content = [], $disableContentUpdate = false)
     {
-        // do we have to fetch the content or the provided one is ok?
-        if (empty($content) || false === $this->validateContent($content)) {
+        if (!empty($content['html'])) {
+            $content['html'] = $this->graby->cleanupHtml($content['html'], $url);
+        }
+
+        if ((empty($content) || false === $this->validateContent($content)) && false === $disableContentUpdate) {
             $fetchedContent = $this->graby->fetchContent($url);
 
             // when content is imported, we have information in $content
@@ -56,8 +54,24 @@ class ContentProxy
             }
         }
 
+        // be sure to keep the url in case of error
+        // so we'll be able to refetch it in the future
+        $content['url'] = !empty($content['url']) ? $content['url'] : $url;
+
+        $this->stockEntry($entry, $content);
+    }
+
+    /**
+     * Stock entry with fetched or imported content.
+     * Will fall back to OpenGraph data if available.
+     *
+     * @param Entry $entry   Entry to stock
+     * @param array $content Array with at least title, url & html
+     */
+    private function stockEntry(Entry $entry, array $content)
+    {
         $title = $content['title'];
-        if (!$title && isset($content['open_graph']['og_title'])) {
+        if (!$title && !empty($content['open_graph']['og_title'])) {
             $title = $content['open_graph']['og_title'];
         }
 
@@ -65,19 +79,30 @@ class ContentProxy
         if (false === $html) {
             $html = $this->fetchingErrorMessage;
 
-            if (isset($content['open_graph']['og_description'])) {
+            if (!empty($content['open_graph']['og_description'])) {
                 $html .= '<p><i>But we found a short description: </i></p>';
                 $html .= $content['open_graph']['og_description'];
             }
         }
 
-        $entry->setUrl($content['url'] ?: $url);
+        $entry->setUrl($content['url']);
         $entry->setTitle($title);
         $entry->setContent($html);
         $entry->setHttpStatus(isset($content['status']) ? $content['status'] : '');
 
-        if (isset($content['date']) && null !== $content['date'] && '' !== $content['date']) {
-            $entry->setPublishedAt(new \DateTime($content['date']));
+        if (!empty($content['date'])) {
+            $date = $content['date'];
+
+            // is it a timestamp?
+            if (filter_var($date, FILTER_VALIDATE_INT) !== false) {
+                $date = '@'.$content['date'];
+            }
+
+            try {
+                $entry->setPublishedAt(new \DateTime($date));
+            } catch (\Exception $e) {
+                $this->logger->warning('Error while defining date', ['e' => $e, 'url' => $content['url'], 'date' => $content['date']]);
+            }
         }
 
         if (!empty($content['authors'])) {
@@ -97,12 +122,12 @@ class ContentProxy
             $entry->setDomainName($domainName);
         }
 
-        if (isset($content['open_graph']['og_image']) && $content['open_graph']['og_image']) {
+        if (!empty($content['open_graph']['og_image'])) {
             $entry->setPreviewPicture($content['open_graph']['og_image']);
         }
 
         // if content is an image define as a preview too
-        if (isset($content['content_type']) && in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) {
+        if (!empty($content['content_type']) && in_array($this->mimeGuesser->guess($content['content_type']), ['jpeg', 'jpg', 'gif', 'png'], true)) {
             $entry->setPreviewPicture($content['url']);
         }
 
@@ -110,17 +135,14 @@ class ContentProxy
             $this->tagger->tag($entry);
         } catch (\Exception $e) {
             $this->logger->error('Error while trying to automatically tag an entry.', [
-                'entry_url' => $url,
+                'entry_url' => $content['url'],
                 'error_msg' => $e->getMessage(),
             ]);
         }
-
-        return $entry;
     }
 
     /**
-     * Validate that the given content as enough value to be used
-     * instead of fetch the content from the url.
+     * Validate that the given content has at least a title, an html and a url.
      *
      * @param array $content
      *
@@ -128,6 +150,6 @@ class ContentProxy
      */
     private function validateContent(array $content)
     {
-        return isset($content['title']) && isset($content['html']) && isset($content['url']) && isset($content['language']) && isset($content['content_type']);
+        return !empty($content['title']) && !empty($content['html']) && !empty($content['url']);
     }
 }
index 0d330d2a315c5f01d9d1d11022cde49c7f29ae86..54e23a052684bc87c3508fd2dbc632d15294c891 100644 (file)
@@ -54,7 +54,7 @@ class DownloadImages
         $crawler = new Crawler($html);
         $result = $crawler
             ->filterXpath('//img')
-            ->extract(array('src'));
+            ->extract(['src']);
 
         $relativePath = $this->getRelativePath($entryId);
 
@@ -66,6 +66,11 @@ class DownloadImages
                 continue;
             }
 
+            // if image contains "&" and we can't find it in the html it might be because it's encoded as &amp;
+            if (false !== stripos($image, '&') && false === stripos($html, $image)) {
+                $image = str_replace('&', '&amp;', $image);
+            }
+
             $html = str_replace($image, $imagePath, $html);
         }
 
@@ -114,7 +119,7 @@ class DownloadImages
         $ext = $this->mimeGuesser->guess($res->getHeader('content-type'));
         $this->logger->debug('DownloadImages: Checking extension', ['ext' => $ext, 'header' => $res->getHeader('content-type')]);
         if (!in_array($ext, ['jpeg', 'jpg', 'gif', 'png'], true)) {
-            $this->logger->error('DownloadImages: Processed image with not allowed extension. Skipping '.$imagePath);
+            $this->logger->error('DownloadImages: Processed image with not allowed extension. Skipping: '.$imagePath);
 
             return false;
         }
index 7d3798b95523b96e13c789df9abb0de18a101a78..df579ebdc1fe260205528dfbd194d1a18462ed1e 100644 (file)
@@ -20,16 +20,15 @@ class PreparePagerForEntries
 
     /**
      * @param AdapterInterface $adapter
-     * @param int              $page
      *
      * @return null|Pagerfanta
      */
-    public function prepare(AdapterInterface $adapter, $page = 1)
+    public function prepare(AdapterInterface $adapter)
     {
         $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
 
         if (null === $user || !is_object($user)) {
-            return null;
+            return;
         }
 
         $entries = new Pagerfanta($adapter);
index f78b7fe0d8b0799879489ec3e48e223b480e1ca3..abc84d089822ab6bf6f8c425f5df6acecddfbe53 100644 (file)
@@ -21,12 +21,13 @@ class Redirect
     }
 
     /**
-     * @param string $url      URL to redirect
-     * @param string $fallback Fallback URL if $url is null
+     * @param string $url                    URL to redirect
+     * @param string $fallback               Fallback URL if $url is null
+     * @param bool   $ignoreActionMarkAsRead Ignore configured action when mark as read
      *
      * @return string
      */
-    public function to($url, $fallback = '')
+    public function to($url, $fallback = '', $ignoreActionMarkAsRead = false)
     {
         $user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
 
@@ -34,7 +35,8 @@ class Redirect
             return $url;
         }
 
-        if (Config::REDIRECT_TO_HOMEPAGE === $user->getConfig()->getActionMarkAsRead()) {
+        if (!$ignoreActionMarkAsRead &&
+              Config::REDIRECT_TO_HOMEPAGE === $user->getConfig()->getActionMarkAsRead()) {
             return $this->router->generate('homepage');
         }
 
index add27db2b4ea0741a06fe1a70dc2ee928a307ca9..509d0dec9c2b70b53b7da3e5822462cd17354af7 100644 (file)
@@ -15,6 +15,7 @@ class RuleBasedTagger
     private $rulerz;
     private $tagRepository;
     private $entryRepository;
+    private $logger;
 
     public function __construct(RulerZ $rulerz, TagRepository $tagRepository, EntryRepository $entryRepository, LoggerInterface $logger)
     {
index a68b2fdcdb875e27f0a05cfae1fd2bf306d8720b..a9b0d2d564a5dc7fcdcd55d99105ae19b5694295 100644 (file)
@@ -41,6 +41,7 @@ services:
         arguments:
             -
                 error_message: '%wallabag_core.fetching_error_message%'
+                error_message_title: '%wallabag_core.fetching_error_message_title%'
             - "@wallabag_core.guzzle.http_client"
             - "@wallabag_core.graby.config_builder"
         calls:
index 174b7b54c3e0727520927539a09380b1fcdc63ee..b64e14363898ba819ea1cbdc82c91714aafe1b3d 100644 (file)
@@ -1,18 +1,28 @@
-<div class="card">
-    <div class="card-stacked">
-        <div class="card-content">
-            <span class="card-title dot-ellipsis dot-resize-update">
-                <a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title | striptags | e('html_attr') }}">
-                    {{ entry.title| striptags | truncate(120, true, '…') | raw }}
-                </a>
-            </span>
-            <ul class="tools-list right">
-                <li>
-                    <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}redo{% endif %}</i></a>
-                    <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isStarred == 0 %}star_border{% else %}star{% endif %}</i></a>
-                    <a title="{{ 'entry.list.delete'|trans }}" onclick="return confirm('{{ 'entry.confirm.delete'|trans|escape('js') }}')" class="tool grey-text delete" href="{{ path('delete_entry', { 'id': entry.id }) }}"><i class="material-icons">delete</i></a>
-                </li>
-            </ul>
+<div class="card-stacked">
+    <div class="preview">{% if entry.previewPicture is not null %}<img src="{{ entry.previewPicture }}" />{% endif %}</div>
+    <div class="card-content">
+        <span class="card-title dot-ellipsis dot-resize-update">
+            <a href="{{ path('view', { 'id': entry.id }) }}" title="{{ entry.title | striptags | e('html_attr') }}">
+                {{ entry.title| striptags | truncate(120, true, '…') | raw }}
+            </a>
+        </span>
+
+        <div class="metadata">
+            <a href="{{ entry.url|e }}" class="grey-text domain" target="_blank" title="{{ entry.domainName|removeWww }}">
+                <span>{{ entry.domainName|removeWww }}</span>
+            </a>
+            {% for tag in entry.tags | slice(0, 3) %}
+                <span class="chip hide-on-med-and-down">
+                    <a href="{{ path('tag_entries', {'slug': tag.slug}) }}">{{ tag.label }}</a>
+                </span>
+            {% endfor %}
         </div>
     </div>
+    <ul class="tools-list hide-on-small-only">
+        <li>
+            <a title="{{ 'entry.list.toogle_as_read'|trans }}" class="tool grey-text" href="{{ path('archive_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isArchived == 0 %}done{% else %}redo{% endif %}</i></a>
+            <a title="{{ 'entry.list.toogle_as_star'|trans }}" class="tool grey-text" href="{{ path('star_entry', { 'id': entry.id }) }}"><i class="material-icons">{% if entry.isStarred == 0 %}star_border{% else %}star{% endif %}</i></a>
+            <a title="{{ 'entry.list.delete'|trans }}" onclick="return confirm('{{ 'entry.confirm.delete'|trans|escape('js') }}')" class="tool grey-text delete" href="{{ path('delete_entry', { 'id': entry.id }) }}"><i class="material-icons">delete</i></a>
+        </li>
+    </ul>
 </div>
index b2d91c9cc3d5f5c22ba9b40b7a5cc4f5c06a855a..6f657b1807f44dac95af9ad98637f4f2ad53d6b3 100644 (file)
@@ -24,9 +24,9 @@
     </div>
 
     <br />
-    <ul class="row data">
+    <ul class="{% if listMode == 1 %}collection{% else %}row data{% endif %}">
         {% for entry in entries %}
-            <li id="entry-{{ entry.id|e }}" class="col {% if listMode == 0 %}l3 m6{% endif %} s12">
+            <li id="entry-{{ entry.id|e }}" class="col {% if listMode == 0 %}l3 m6{% else %}collection-item{% endif %} s12">
                 {% if listMode == 1 %}
                     {% include "@WallabagCore/themes/material/Entry/_card_list.html.twig" with {'entry': entry} only %}
                 {% elseif entry.previewPicture is null %}
index ce72837ad0e8807ca2d2ce98a8aa55accb805233..5f1ab0af018cdf5620ab87f754cf4f24388dbc62 100644 (file)
@@ -5,6 +5,7 @@ namespace Wallabag\ImportBundle\Command;
 use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
 use Symfony\Component\Config\Definition\Exception\Exception;
 use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Output\OutputInterface;
 
@@ -17,9 +18,10 @@ class ImportCommand extends ContainerAwareCommand
             ->setDescription('Import entries from a JSON export')
             ->addArgument('username', InputArgument::REQUIRED, 'User to populate')
             ->addArgument('filepath', InputArgument::REQUIRED, 'Path to the JSON file')
-            ->addOption('importer', null, InputArgument::OPTIONAL, 'The importer to use: v1, v2, instapaper, pinboard, readability, firefox or chrome', 'v1')
-            ->addOption('markAsRead', null, InputArgument::OPTIONAL, 'Mark all entries as read', false)
-            ->addOption('useUserId', null, InputArgument::OPTIONAL, 'Use user id instead of username to find account', false)
+            ->addOption('importer', null, InputOption::VALUE_OPTIONAL, 'The importer to use: v1, v2, instapaper, pinboard, readability, firefox or chrome', 'v1')
+            ->addOption('markAsRead', null, InputOption::VALUE_OPTIONAL, 'Mark all entries as read', false)
+            ->addOption('useUserId', null, InputOption::VALUE_NONE, 'Use user id instead of username to find account')
+            ->addOption('disableContentUpdate', null, InputOption::VALUE_NONE, 'Disable fetching updated content from URL')
         ;
     }
 
@@ -69,6 +71,7 @@ class ImportCommand extends ContainerAwareCommand
         }
 
         $import->setMarkAsRead($input->getOption('markAsRead'));
+        $import->setDisableContentUpdate($input->getOption('disableContentUpdate'));
         $import->setUser($user);
 
         $res = $import
index a61388c016e256e52edab636b5b55ffe2775aa26..9b6242967bc66074e1bfc18b4032268fe4da5e15 100644 (file)
@@ -24,6 +24,7 @@ abstract class AbstractImport implements ImportInterface
     protected $producer;
     protected $user;
     protected $markAsRead;
+    protected $disableContentUpdate = false;
     protected $skippedEntries = 0;
     protected $importedEntries = 0;
     protected $queuedEntries = 0;
@@ -84,6 +85,18 @@ abstract class AbstractImport implements ImportInterface
         return $this->markAsRead;
     }
 
+    /**
+     * Set whether articles should be fetched for updated content.
+     *
+     * @param bool $disableContentUpdate
+     */
+    public function setDisableContentUpdate($disableContentUpdate)
+    {
+        $this->disableContentUpdate = $disableContentUpdate;
+
+        return $this;
+    }
+
     /**
      * Fetch content from the ContentProxy (using graby).
      * If it fails return the given entry to be saved in all case (to avoid user to loose the content).
@@ -91,15 +104,16 @@ abstract class AbstractImport implements ImportInterface
      * @param Entry  $entry   Entry to update
      * @param string $url     Url to grab content for
      * @param array  $content An array with AT LEAST keys title, html, url, language & content_type to skip the fetchContent from the url
-     *
-     * @return Entry
      */
     protected function fetchContent(Entry $entry, $url, array $content = [])
     {
         try {
-            return $this->contentProxy->updateEntry($entry, $url, $content);
+            $this->contentProxy->updateEntry($entry, $url, $content, $this->disableContentUpdate);
         } catch (\Exception $e) {
-            return $entry;
+            $this->logger->error('Error trying to import an entry.', [
+                'entry_url' => $url,
+                'error_msg' => $e->getMessage(),
+            ]);
         }
     }
 
index ef0eeb7e1fb2a80da654efa1770f8db3707cf23d..71e65e5916f04e4216da71c46a2fd272285c2e79 100644 (file)
@@ -201,7 +201,7 @@ abstract class BrowserImport extends AbstractImport
         $entry->setTitle($data['title']);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $data['url'], $data);
+        $this->fetchContent($entry, $data['url'], $data);
 
         if (array_key_exists('tags', $data)) {
             $this->tagsAssigner->assignTagsToEntry(
index 70a53f1af5309e64f1734ede1eb8686facc88b84..3aa12f6fb6960e39fb19e914109fa1f3af5d7c68 100644 (file)
@@ -68,6 +68,14 @@ class InstapaperImport extends AbstractImport
                 continue;
             }
 
+            // last element in the csv is the folder where the content belong
+            // BUT it can also be the status (since status = folder in Instapaper)
+            // and we don't want archive, unread & starred to become a tag
+            $tags = null;
+            if (false === in_array($data[3], ['Archive', 'Unread', 'Starred'])) {
+                $tags = [$data[3]];
+            }
+
             $entries[] = [
                 'url' => $data[0],
                 'title' => $data[1],
@@ -75,6 +83,7 @@ class InstapaperImport extends AbstractImport
                 'is_archived' => $data[3] === 'Archive' || $data[3] === 'Starred',
                 'is_starred' => $data[3] === 'Starred',
                 'html' => false,
+                'tags' => $tags,
             ];
         }
         fclose($handle);
@@ -116,7 +125,15 @@ class InstapaperImport extends AbstractImport
         $entry->setTitle($importedEntry['title']);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $importedEntry['url'], $importedEntry);
+        $this->fetchContent($entry, $importedEntry['url'], $importedEntry);
+
+        if (!empty($importedEntry['tags'])) {
+            $this->tagsAssigner->assignTagsToEntry(
+                $entry,
+                $importedEntry['tags'],
+                $this->em->getUnitOfWork()->getScheduledEntityInsertions()
+            );
+        }
 
         $entry->setArchived($importedEntry['is_archived']);
         $entry->setStarred($importedEntry['is_starred']);
index 489b9257e03b3c46019e988cca3ac8e945b01dad..110b046422ae3c25a7f5be34f59c12e4d11938b2 100644 (file)
@@ -109,7 +109,7 @@ class PinboardImport extends AbstractImport
         $entry->setTitle($data['title']);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $data['url'], $data);
+        $this->fetchContent($entry, $data['url'], $data);
 
         if (!empty($data['tags'])) {
             $this->tagsAssigner->assignTagsToEntry(
index 8835161b16440a009075adce12038894b01c5a12..c1d5b6da0518c33bef64a621336406c1679ad716 100644 (file)
@@ -192,7 +192,7 @@ class PocketImport extends AbstractImport
         $entry->setUrl($url);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $url);
+        $this->fetchContent($entry, $url);
 
         // 0, 1, 2 - 1 if the item is archived - 2 if the item should be deleted
         $entry->setArchived($importedEntry['status'] == 1 || $this->markAsRead);
index de320d23907070b53e4cdaa45c8909bfdab18be1..002b27f46b5b2ace08be9f89ad402672496a9c8a 100644 (file)
@@ -109,7 +109,7 @@ class ReadabilityImport extends AbstractImport
         $entry->setTitle($data['title']);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $data['url'], $data);
+        $this->fetchContent($entry, $data['url'], $data);
 
         $entry->setArchived($data['is_archived']);
         $entry->setStarred($data['is_starred']);
index 0e5382cfe8a7e28a2a76f172add9a46ab6785201..c64ccd64d196095ce8b9e3f913c4f856075f0fa3 100644 (file)
@@ -108,7 +108,7 @@ abstract class WallabagImport extends AbstractImport
         $entry->setTitle($data['title']);
 
         // update entry with content (in case fetching failed, the given entry will be return)
-        $entry = $this->fetchContent($entry, $data['url'], $data);
+        $this->fetchContent($entry, $data['url'], $data);
 
         if (array_key_exists('tags', $data)) {
             $this->tagsAssigner->assignTagsToEntry(
index 59e3ce026c0ae6d76b79c5f9535d36be11ece5d1..1f0df646bc85908e1e194ef403d3a31144c1ef8b 100644 (file)
@@ -4,6 +4,17 @@ namespace Wallabag\ImportBundle\Import;
 
 class WallabagV1Import extends WallabagImport
 {
+    protected $fetchingErrorMessage;
+    protected $fetchingErrorMessageTitle;
+
+    public function __construct($em, $contentProxy, $tagsAssigner, $eventDispatcher, $fetchingErrorMessageTitle, $fetchingErrorMessage)
+    {
+        $this->fetchingErrorMessageTitle = $fetchingErrorMessageTitle;
+        $this->fetchingErrorMessage = $fetchingErrorMessage;
+
+        parent::__construct($em, $contentProxy, $tagsAssigner, $eventDispatcher);
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -43,10 +54,11 @@ class WallabagV1Import extends WallabagImport
             'created_at' => '',
         ];
 
-        // force content to be refreshed in case on bad fetch in the v1 installation
+        // In case of a bad fetch in v1, replace title and content with v2 error strings
+        // If fetching fails again, they will get this instead of the v1 strings
         if (in_array($entry['title'], $this->untitled)) {
-            $data['title'] = '';
-            $data['html'] = '';
+            $data['title'] = $this->fetchingErrorMessageTitle;
+            $data['html'] = $this->fetchingErrorMessage;
         }
 
         if (array_key_exists('tags', $entry) && $entry['tags'] != '') {
index d2a89d79aa77dd2e54abe2ddd479b5880fa36b75..3e085ecff6461b8a36fdc6ebd34225e5835c0623 100644 (file)
@@ -36,8 +36,8 @@ class WallabagV2Import extends WallabagImport
         return [
             'html' => $entry['content'],
             'content_type' => $entry['mimetype'],
-            'is_archived' => (int) ($entry['is_archived'] || $this->markAsRead),
-            'is_starred' => false,
+            'is_archived' => (bool) ($entry['is_archived'] || $this->markAsRead),
+            'is_starred' => (bool) $entry['is_starred'],
         ] + $entry;
     }
 
index 661dc7e1d6c1a293eb4b2250fda4e56d3873afd0..b224a6a2341266eefa6cfde691f9f5d9463a7862 100644 (file)
@@ -35,6 +35,8 @@ services:
             - "@wallabag_core.content_proxy"
             - "@wallabag_core.tags_assigner"
             - "@event_dispatcher"
+            - "%wallabag_core.fetching_error_message_title%"
+            - "%wallabag_core.fetching_error_message%"
         calls:
             - [ setLogger, [ "@logger" ]]
         tags:
index 1c5c86d45501f41c987edba0efa48bf320f3fa93..084f2c67e11ec176a3144cb1fff8ceec622e6139 100644 (file)
@@ -33,9 +33,7 @@ class ManageController extends Controller
         // enable created user by default
         $user->setEnabled(true);
 
-        $form = $this->createForm('Wallabag\UserBundle\Form\NewUserType', $user, [
-            'validation_groups' => ['Profile'],
-        ]);
+        $form = $this->createForm('Wallabag\UserBundle\Form\NewUserType', $user);
         $form->handleRequest($request);
 
         if ($form->isSubmitted() && $form->isValid()) {
index 3a167de740608567ae03b6e42f88ab8d7d512bf6..ed6ce3319c5b89f47781c40961e860a4e71a3f68 100644 (file)
@@ -4,11 +4,11 @@ namespace Wallabag\UserBundle\Entity;
 
 use Doctrine\Common\Collections\ArrayCollection;
 use Doctrine\ORM\Mapping as ORM;
+use JMS\Serializer\Annotation\Groups;
+use JMS\Serializer\Annotation\XmlRoot;
 use Scheb\TwoFactorBundle\Model\Email\TwoFactorInterface;
 use Scheb\TwoFactorBundle\Model\TrustedComputerInterface;
 use FOS\UserBundle\Model\User as BaseUser;
-use JMS\Serializer\Annotation\ExclusionPolicy;
-use JMS\Serializer\Annotation\Expose;
 use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
 use Symfony\Component\Security\Core\User\UserInterface;
 use Wallabag\ApiBundle\Entity\Client;
@@ -18,23 +18,25 @@ use Wallabag\CoreBundle\Entity\Entry;
 /**
  * User.
  *
+ * @XmlRoot("user")
  * @ORM\Entity(repositoryClass="Wallabag\UserBundle\Repository\UserRepository")
  * @ORM\Table(name="`user`")
  * @ORM\HasLifecycleCallbacks()
- * @ExclusionPolicy("all")
  *
  * @UniqueEntity("email")
  * @UniqueEntity("username")
  */
 class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterface
 {
+    /** @Serializer\XmlAttribute */
     /**
      * @var int
      *
-     * @Expose
      * @ORM\Column(name="id", type="integer")
      * @ORM\Id
      * @ORM\GeneratedValue(strategy="AUTO")
+     *
+     * @Groups({"user_api"})
      */
     protected $id;
 
@@ -42,20 +44,40 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
      * @var string
      *
      * @ORM\Column(name="name", type="text", nullable=true)
+     *
+     * @Groups({"user_api"})
      */
     protected $name;
 
     /**
-     * @var date
+     * @var string
+     *
+     * @Groups({"user_api"})
+     */
+    protected $username;
+
+    /**
+     * @var string
+     *
+     * @Groups({"user_api"})
+     */
+    protected $email;
+
+    /**
+     * @var \DateTime
      *
      * @ORM\Column(name="created_at", type="datetime")
+     *
+     * @Groups({"user_api"})
      */
     protected $createdAt;
 
     /**
-     * @var date
+     * @var \DateTime
      *
      * @ORM\Column(name="updated_at", type="datetime")
+     *
+     * @Groups({"user_api"})
      */
     protected $updatedAt;
 
@@ -135,7 +157,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
     }
 
     /**
-     * @return string
+     * @return \DateTime
      */
     public function getCreatedAt()
     {
@@ -143,7 +165,7 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
     }
 
     /**
-     * @return string
+     * @return \DateTime
      */
     public function getUpdatedAt()
     {
index 0bdd1cae061d365a751911de1fc73f5f34c34e00..e4d55c19746ff78f0df97bc052c464426f57b87d 100644 (file)
@@ -5,7 +5,6 @@ namespace Wallabag\UserBundle\EventListener;
 use Doctrine\ORM\EntityManager;
 use FOS\UserBundle\Event\UserEvent;
 use FOS\UserBundle\FOSUserEvents;
-use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Wallabag\CoreBundle\Entity\Config;
 
@@ -47,7 +46,7 @@ class CreateConfigListener implements EventSubscriberInterface
         ];
     }
 
-    public function createConfig(UserEvent $event, $eventName = null, EventDispatcherInterface $eventDispatcher = null)
+    public function createConfig(UserEvent $event)
     {
         $config = new Config($event->getUser());
         $config->setTheme($this->theme);
index 6659443ba44ea461f3be2280a9a3341e9ab7904a..d37cbbf9b04d360b464c83b5dbb54b821f103fe2 100644 (file)
@@ -3,6 +3,7 @@
 namespace Tests\Wallabag\ApiBundle\Controller;
 
 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
+use Wallabag\ApiBundle\Entity\Client;
 
 class DeveloperControllerTest extends WallabagCoreTestCase
 {
@@ -33,14 +34,10 @@ class DeveloperControllerTest extends WallabagCoreTestCase
         $this->assertContains('My app', $alert[0]);
     }
 
-    /**
-     * @depends testCreateClient
-     */
     public function testCreateToken()
     {
         $client = $this->getClient();
-        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
-        $apiClient = $em->getRepository('WallabagApiBundle:Client')->findOneByName('My app');
+        $apiClient = $this->createApiClientForUser('admin');
 
         $client->request('POST', '/oauth/v2/token', [
             'grant_type' => 'password',
@@ -83,6 +80,7 @@ class DeveloperControllerTest extends WallabagCoreTestCase
     public function testRemoveClient()
     {
         $client = $this->getClient();
+        $adminApiClient = $this->createApiClientForUser('admin');
         $em = $client->getContainer()->get('doctrine.orm.entity_manager');
 
         // Try to remove an admin's client with a wrong user
@@ -90,12 +88,8 @@ class DeveloperControllerTest extends WallabagCoreTestCase
         $client->request('GET', '/developer');
         $this->assertContains('no_client', $client->getResponse()->getContent());
 
-        // get an ID of a admin's client
-        $this->logInAs('admin');
-        $nbClients = $em->getRepository('WallabagApiBundle:Client')->findByUser($this->getLoggedInUserId());
-
         $this->logInAs('bob');
-        $client->request('GET', '/developer/client/delete/'.$nbClients[0]->getId());
+        $client->request('GET', '/developer/client/delete/'.$adminApiClient->getId());
         $this->assertEquals(403, $client->getResponse()->getStatusCode());
 
         // Try to remove the admin's client with the good user
@@ -111,7 +105,29 @@ class DeveloperControllerTest extends WallabagCoreTestCase
         $client->click($link);
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
-        $newNbClients = $em->getRepository('WallabagApiBundle:Client')->findByUser($this->getLoggedInUserId());
-        $this->assertGreaterThan(count($newNbClients), count($nbClients));
+        $this->assertNull(
+            $em->getRepository('WallabagApiBundle:Client')->find($adminApiClient->getId()),
+            'The client should have been removed'
+        );
+    }
+
+    /**
+     * @param string $username
+     *
+     * @return Client
+     */
+    private function createApiClientForUser($username)
+    {
+        $client = $this->getClient();
+        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
+        $userManager = $client->getContainer()->get('fos_user.user_manager');
+        $user = $userManager->findUserBy(array('username' => $username));
+        $apiClient = new Client($user);
+        $apiClient->setName('My app');
+        $apiClient->setAllowedGrantTypes(['password']);
+        $em->persist($apiClient);
+        $em->flush();
+
+        return $apiClient;
     }
 }
index bf7d373aa94d57f8716ed59f5f6d02f37ccd3b6f..0968cfafc9d4132cb3e0c0adfe55a15dffab389c 100644 (file)
@@ -3,8 +3,10 @@
 namespace Tests\Wallabag\ApiBundle\Controller;
 
 use Tests\Wallabag\ApiBundle\WallabagApiTestCase;
+use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Entity\Tag;
 use Wallabag\CoreBundle\Helper\ContentProxy;
+use Wallabag\UserBundle\Entity\User;
 
 class EntryRestControllerTest extends WallabagApiTestCase
 {
@@ -342,6 +344,10 @@ class EntryRestControllerTest extends WallabagApiTestCase
             'url' => 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html',
             'tags' => 'google',
             'title' => 'New title for my article',
+            'content' => 'my content',
+            'language' => 'de_DE',
+            'published_at' => '2016-09-08T11:55:58+0200',
+            'authors' => 'bob,helen',
         ]);
 
         $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
@@ -355,6 +361,12 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $this->assertEquals('New title for my article', $content['title']);
         $this->assertEquals(1, $content['user_id']);
         $this->assertCount(2, $content['tags']);
+        $this->assertSame('my content', $content['content']);
+        $this->assertSame('de_DE', $content['language']);
+        $this->assertSame('2016-09-08T11:55:58+0200', $content['published_at']);
+        $this->assertCount(2, $content['published_by']);
+        $this->assertContains('bob', $content['published_by']);
+        $this->assertContains('helen', $content['published_by']);
     }
 
     public function testPostSameEntry()
@@ -801,22 +813,28 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function testDeleteEntriesTagsListAction()
     {
-        $entry = $this->client->getContainer()->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId('http://0.0.0.0/entry4', 1);
+        $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
+        $entry = new Entry($em->getReference(User::class, 1));
+        $entry->setUrl('http://0.0.0.0/test-entry');
+        $entry->addTag((new Tag())->setLabel('foo-tag'));
+        $entry->addTag((new Tag())->setLabel('bar-tag'));
+        $em->persist($entry);
+        $em->flush();
 
-        $tags = $entry->getTags();
-
-        $this->assertCount(4, $tags);
+        $em->clear();
 
         $list = [
             [
-                'url' => 'http://0.0.0.0/entry4',
-                'tags' => 'new tag 1, new tag 2',
+                'url' => 'http://0.0.0.0/test-entry',
+                'tags' => 'foo-tag, bar-tag',
             ],
         ];
 
         $this->client->request('DELETE', '/api/entries/tags/list?list='.json_encode($list));
+        $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
+
+        $entry = $em->getRepository('WallabagCoreBundle:Entry')->find($entry->getId());
+        $this->assertCount(0, $entry->getTags());
     }
 
     public function testPostEntriesListAction()
@@ -841,9 +859,14 @@ class EntryRestControllerTest extends WallabagApiTestCase
 
     public function testDeleteEntriesListAction()
     {
+        $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
+        $em->persist((new Entry($em->getReference(User::class, 1)))->setUrl('http://0.0.0.0/test-entry1'));
+
+        $em->flush();
+        $em->clear();
         $list = [
-            'http://www.lemonde.fr/musiques/article/2017/04/23/loin-de-la-politique-le-printemps-de-bourges-retombe-en-enfance_5115862_1654986.html',
-            'http://0.0.0.0/entry3',
+            'http://0.0.0.0/test-entry1',
+            'http://0.0.0.0/test-entry-not-exist',
         ];
 
         $this->client->request('DELETE', '/api/entries/list?urls='.json_encode($list));
@@ -853,10 +876,10 @@ class EntryRestControllerTest extends WallabagApiTestCase
         $content = json_decode($this->client->getResponse()->getContent(), true);
 
         $this->assertTrue($content[0]['entry']);
-        $this->assertEquals('http://www.lemonde.fr/musiques/article/2017/04/23/loin-de-la-politique-le-printemps-de-bourges-retombe-en-enfance_5115862_1654986.html', $content[0]['url']);
+        $this->assertEquals('http://0.0.0.0/test-entry1', $content[0]['url']);
 
         $this->assertFalse($content[1]['entry']);
-        $this->assertEquals('http://0.0.0.0/entry3', $content[1]['url']);
+        $this->assertEquals('http://0.0.0.0/test-entry-not-exist', $content[1]['url']);
     }
 
     public function testLimitBulkAction()
index 90b132ebecbf4600c1d341d6f7027ad76cfbffca..7f69bd67ca985f4008d0219582088a422014c5a4 100644 (file)
@@ -22,36 +22,35 @@ class TagRestControllerTest extends WallabagApiTestCase
         return end($content);
     }
 
-    /**
-     * @depends testGetUserTags
-     */
-    public function testDeleteUserTag($tag)
+    public function testDeleteUserTag()
     {
-        $tagName = $tag['label'];
+        $tagLabel = 'tagtest';
+        $tag = new Tag();
+        $tag->setLabel($tagLabel);
+
+        $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
+        $em->persist($tag);
+        $em->flush();
+        $em->clear();
 
-        $this->client->request('DELETE', '/api/tags/'.$tag['id'].'.json');
+        $this->client->request('DELETE', '/api/tags/'.$tag->getId().'.json');
 
         $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
 
         $content = json_decode($this->client->getResponse()->getContent(), true);
 
         $this->assertArrayHasKey('label', $content);
-        $this->assertEquals($tag['label'], $content['label']);
-        $this->assertEquals($tag['slug'], $content['slug']);
+        $this->assertEquals($tag->getLabel(), $content['label']);
+        $this->assertEquals($tag->getSlug(), $content['slug']);
 
-        $entries = $this->client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findAllByTagId($this->user->getId(), $tag['id']);
+        $entries = $em->getRepository('WallabagCoreBundle:Entry')
+            ->findAllByTagId($this->user->getId(), $tag->getId());
 
         $this->assertCount(0, $entries);
 
-        $tag = $this->client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Tag')
-            ->findOneByLabel($tagName);
+        $tag = $em->getRepository('WallabagCoreBundle:Tag')->findOneByLabel($tagLabel);
 
-        $this->assertNull($tag, $tagName.' was removed because it begun an orphan tag');
+        $this->assertNull($tag, $tagLabel.' was removed because it begun an orphan tag');
     }
 
     public function dataForDeletingTagByLabel()
diff --git a/tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php b/tests/Wallabag/ApiBundle/Controller/UserRestControllerTest.php
new file mode 100644 (file)
index 0000000..3f4969a
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+
+namespace Tests\Wallabag\ApiBundle\Controller;
+
+use Tests\Wallabag\ApiBundle\WallabagApiTestCase;
+
+class UserRestControllerTest extends WallabagApiTestCase
+{
+    public function testGetUser()
+    {
+        $this->client->request('GET', '/api/user.json');
+        $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
+
+        $content = json_decode($this->client->getResponse()->getContent(), true);
+
+        $this->assertArrayHasKey('id', $content);
+        $this->assertArrayHasKey('email', $content);
+        $this->assertArrayHasKey('name', $content);
+        $this->assertArrayHasKey('username', $content);
+        $this->assertArrayHasKey('created_at', $content);
+        $this->assertArrayHasKey('updated_at', $content);
+
+        $this->assertEquals('bigboss@wallabag.org', $content['email']);
+        $this->assertEquals('Big boss', $content['name']);
+        $this->assertEquals('admin', $content['username']);
+
+        $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+    }
+
+    public function testCreateNewUser()
+    {
+        $this->client->request('PUT', '/api/user.json', [
+            'username' => 'google',
+            'password' => 'googlegoogle',
+            'email' => 'wallabag@google.com',
+        ]);
+
+        $this->assertEquals(200, $this->client->getResponse()->getStatusCode());
+
+        $content = json_decode($this->client->getResponse()->getContent(), true);
+
+        $this->assertArrayHasKey('id', $content);
+        $this->assertArrayHasKey('email', $content);
+        $this->assertArrayHasKey('username', $content);
+        $this->assertArrayHasKey('created_at', $content);
+        $this->assertArrayHasKey('updated_at', $content);
+
+        $this->assertEquals('wallabag@google.com', $content['email']);
+        $this->assertEquals('google', $content['username']);
+
+        $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+
+        // remove the created user to avoid side effect on other tests
+        // @todo remove these lines when test will be isolated
+        $em = $this->client->getContainer()->get('doctrine.orm.entity_manager');
+
+        $query = $em->createQuery('DELETE FROM Wallabag\CoreBundle\Entity\Config c WHERE c.user = :user_id');
+        $query->setParameter('user_id', $content['id']);
+        $query->execute();
+
+        $query = $em->createQuery('DELETE FROM Wallabag\UserBundle\Entity\User u WHERE u.id = :id');
+        $query->setParameter('id', $content['id']);
+        $query->execute();
+    }
+
+    public function testCreateNewUserWithExistingEmail()
+    {
+        $this->client->request('PUT', '/api/user.json', [
+            'username' => 'admin',
+            'password' => 'googlegoogle',
+            'email' => 'bigboss@wallabag.org',
+        ]);
+
+        $this->assertEquals(400, $this->client->getResponse()->getStatusCode());
+
+        $content = json_decode($this->client->getResponse()->getContent(), true);
+
+        $this->assertArrayHasKey('error', $content);
+        $this->assertArrayHasKey('username', $content['error']);
+        $this->assertArrayHasKey('email', $content['error']);
+
+        // $this->assertEquals('fos_user.username.already_used', $content['error']['username'][0]);
+        // $this->assertEquals('fos_user.email.already_used', $content['error']['email'][0]);
+        // This shouldn't be translated ...
+        $this->assertEquals('This value is already used.', $content['error']['username'][0]);
+        $this->assertEquals('This value is already used.', $content['error']['email'][0]);
+
+        $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+    }
+
+    public function testCreateNewUserWithTooShortPassword()
+    {
+        $this->client->request('PUT', '/api/user.json', [
+            'username' => 'facebook',
+            'password' => 'face',
+            'email' => 'facebook@wallabag.org',
+        ]);
+
+        $this->assertEquals(400, $this->client->getResponse()->getStatusCode());
+
+        $content = json_decode($this->client->getResponse()->getContent(), true);
+
+        $this->assertArrayHasKey('error', $content);
+        $this->assertArrayHasKey('password', $content['error']);
+
+        $this->assertEquals('validator.password_too_short', $content['error']['password'][0]);
+
+        $this->assertEquals('application/json', $this->client->getResponse()->headers->get('Content-Type'));
+    }
+}
index cf9b33471cb2d13fa36251378e4d9ce109ea7ca9..8709da70858e3778f8dbef191185da20e4d6491c 100644 (file)
@@ -8,7 +8,7 @@ use Symfony\Component\BrowserKit\Cookie;
 abstract class WallabagApiTestCase extends WebTestCase
 {
     /**
-     * @var Client
+     * @var \Symfony\Bundle\FrameworkBundle\Client
      */
     protected $client = null;
 
@@ -23,7 +23,7 @@ abstract class WallabagApiTestCase extends WebTestCase
     }
 
     /**
-     * @return Client
+     * @return \Symfony\Bundle\FrameworkBundle\Client
      */
     protected function createAuthorizedClient()
     {
@@ -37,7 +37,7 @@ abstract class WallabagApiTestCase extends WebTestCase
         $firewallName = $container->getParameter('fos_user.firewall_name');
 
         $this->user = $userManager->findUserBy(['username' => 'admin']);
-        $loginManager->loginUser($firewallName, $this->user);
+        $loginManager->logInUser($firewallName, $this->user);
 
         // save the login token into the session and put it in a cookie
         $container->get('session')->set('_security_'.$firewallName, serialize($container->get('security.token_storage')->getToken()));
index b21f3318554dc7210892185d6fb35cea611c4baf..2eebf39b408290f3647d0db63bca8a870ae0ed4d 100644 (file)
@@ -10,7 +10,7 @@ use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
 class ExportCommandTest extends WallabagCoreTestCase
 {
     /**
-     * @expectedException Symfony\Component\Console\Exception\RuntimeException
+     * @expectedException \Symfony\Component\Console\Exception\RuntimeException
      * @expectedExceptionMessage Not enough arguments (missing: "username")
      */
     public function testExportCommandWithoutUsername()
@@ -55,7 +55,7 @@ class ExportCommandTest extends WallabagCoreTestCase
             'username' => 'admin',
         ]);
 
-        $this->assertContains('Exporting 6 entrie(s) for user « admin »... Done', $tester->getDisplay());
+        $this->assertContains('Exporting 5 entrie(s) for user « admin »... Done', $tester->getDisplay());
         $this->assertFileExists('admin-export.json');
     }
 
index 122a87d400239c53f6c83ab9ec790ee02154824c..94fc0b9490679a87e039d78b41328587c5afa033 100644 (file)
@@ -2,8 +2,11 @@
 
 namespace Tests\Wallabag\CoreBundle\Command;
 
+use DAMA\DoctrineTestBundle\Doctrine\DBAL\StaticDriver;
 use Doctrine\Bundle\DoctrineBundle\Command\CreateDatabaseDoctrineCommand;
 use Doctrine\Bundle\DoctrineBundle\Command\DropDatabaseDoctrineCommand;
+use Doctrine\DBAL\Platforms\PostgreSqlPlatform;
+use Doctrine\DBAL\Platforms\SqlitePlatform;
 use Symfony\Bundle\FrameworkBundle\Console\Application;
 use Symfony\Component\Console\Input\ArrayInput;
 use Symfony\Component\Console\Output\NullOutput;
@@ -18,7 +21,9 @@ class InstallCommandTest extends WallabagCoreTestCase
     {
         parent::setUp();
 
-        if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOPgSql\Driver) {
+        /** @var \Doctrine\DBAL\Connection $connection */
+        $connection = $this->getClient()->getContainer()->get('doctrine')->getConnection();
+        if ($connection->getDatabasePlatform() instanceof PostgreSqlPlatform) {
             /*
              * LOG:  statement: CREATE DATABASE "wallabag"
              * ERROR:  source database "template1" is being accessed by other users
@@ -30,34 +35,44 @@ class InstallCommandTest extends WallabagCoreTestCase
              */
             $this->markTestSkipped('PostgreSQL spotted: can\'t find a good way to drop current database, skipping.');
         }
-    }
 
-    /**
-     * Ensure next tests will have a clean database.
-     */
-    public static function tearDownAfterClass()
-    {
-        $application = new Application(static::$kernel);
-        $application->setAutoExit(false);
+        if ($connection->getDatabasePlatform() instanceof SqlitePlatform) {
+            // Environnement variable useful only for sqlite to avoid the error "attempt to write a readonly database"
+            // We can't define always this environnement variable because pdo_mysql seems to use it
+            // and we have the error:
+            // SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax;
+            // check the manual that corresponds to your MariaDB server version for the right syntax to use
+            // near '/tmp/wallabag_testTYj1kp' at line 1
+            $databasePath = tempnam(sys_get_temp_dir(), 'wallabag_test');
+            putenv("TEST_DATABASE_PATH=$databasePath");
+
+            // The environnement has been changed, recreate the client in order to update connection
+            parent::setUp();
+        }
 
-        $application->run(new ArrayInput([
-            'command' => 'doctrine:schema:drop',
-            '--no-interaction' => true,
-            '--force' => true,
-            '--env' => 'test',
-        ]), new NullOutput());
+        // disable doctrine-test-bundle
+        StaticDriver::setKeepStaticConnections(false);
 
-        $application->run(new ArrayInput([
-            'command' => 'doctrine:schema:create',
-            '--no-interaction' => true,
-            '--env' => 'test',
-        ]), new NullOutput());
+        $this->resetDatabase($this->getClient());
+    }
 
-        $application->run(new ArrayInput([
-            'command' => 'doctrine:fixtures:load',
-            '--no-interaction' => true,
-            '--env' => 'test',
-        ]), new NullOutput());
+    public function tearDown()
+    {
+        $databasePath = getenv('TEST_DATABASE_PATH');
+        // Remove variable environnement
+        putenv('TEST_DATABASE_PATH');
+        if ($databasePath && file_exists($databasePath)) {
+            unlink($databasePath);
+        } else {
+            // Create a new client to avoid the error:
+            // Transaction commit failed because the transaction has been marked for rollback only.
+            $client = static::createClient();
+            $this->resetDatabase($client);
+        }
+
+        // enable doctrine-test-bundle
+        StaticDriver::setKeepStaticConnections(true);
+        parent::tearDown();
     }
 
     public function testRunInstallCommand()
@@ -67,18 +82,14 @@ class InstallCommandTest extends WallabagCoreTestCase
 
         $command = $application->find('wallabag:install');
 
-        // We mock the QuestionHelper
-        $question = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $question->expects($this->any())
-            ->method('ask')
-            ->will($this->returnValue('yes_'.uniqid('', true)));
-
-        // We override the standard helper with our mock
-        $command->getHelperSet()->set($question, 'question');
-
         $tester = new CommandTester($command);
+        $tester->setInputs([
+            'y', // dropping database
+            'y', // create super admin
+            'username_'.uniqid('', true), // username
+            'password_'.uniqid('', true), // password
+            'email_'.uniqid('', true).'@wallabag.it', // email
+        ]);
         $tester->execute([
             'command' => $command->getName(),
         ]);
@@ -97,18 +108,13 @@ class InstallCommandTest extends WallabagCoreTestCase
 
         $command = $application->find('wallabag:install');
 
-        // We mock the QuestionHelper
-        $question = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $question->expects($this->any())
-            ->method('ask')
-            ->will($this->returnValue('yes_'.uniqid('', true)));
-
-        // We override the standard helper with our mock
-        $command->getHelperSet()->set($question, 'question');
-
         $tester = new CommandTester($command);
+        $tester->setInputs([
+            'y', // create super admin
+            'username_'.uniqid('', true), // username
+            'password_'.uniqid('', true), // password
+            'email_'.uniqid('', true).'@wallabag.it', // email
+        ]);
         $tester->execute([
             'command' => $command->getName(),
             '--reset' => true,
@@ -129,7 +135,7 @@ class InstallCommandTest extends WallabagCoreTestCase
     {
         // skipped SQLite check when database is removed because while testing for the connection,
         // the driver will create the file (so the database) before testing if database exist
-        if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDriver() instanceof \Doctrine\DBAL\Driver\PDOSqlite\Driver) {
+        if ($this->getClient()->getContainer()->get('doctrine')->getConnection()->getDatabasePlatform() instanceof \Doctrine\DBAL\Platforms\SqlitePlatform) {
             $this->markTestSkipped('SQLite spotted: can\'t test with database removed.');
         }
 
@@ -150,18 +156,13 @@ class InstallCommandTest extends WallabagCoreTestCase
 
         $command = $application->find('wallabag:install');
 
-        // We mock the QuestionHelper
-        $question = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $question->expects($this->any())
-            ->method('ask')
-            ->will($this->returnValue('yes_'.uniqid('', true)));
-
-        // We override the standard helper with our mock
-        $command->getHelperSet()->set($question, 'question');
-
         $tester = new CommandTester($command);
+        $tester->setInputs([
+            'y', // create super admin
+            'username_'.uniqid('', true), // username
+            'password_'.uniqid('', true), // password
+            'email_'.uniqid('', true).'@wallabag.it', // email
+        ]);
         $tester->execute([
             'command' => $command->getName(),
         ]);
@@ -183,23 +184,12 @@ class InstallCommandTest extends WallabagCoreTestCase
 
         $command = $application->find('wallabag:install');
 
-        // We mock the QuestionHelper
-        $question = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $question->expects($this->exactly(3))
-            ->method('ask')
-            ->will($this->onConsecutiveCalls(
-                false, // don't want to reset the entire database
-                true, // do want to reset the schema
-                false // don't want to create a new user
-            ));
-
-        // We override the standard helper with our mock
-        $command->getHelperSet()->set($question, 'question');
-
         $tester = new CommandTester($command);
+        $tester->setInputs([
+            'n', // don't want to reset the entire database
+            'y', // do want to reset the schema
+            'n', // don't want to create a new user
+        ]);
         $tester->execute([
             'command' => $command->getName(),
         ]);
@@ -239,22 +229,11 @@ class InstallCommandTest extends WallabagCoreTestCase
 
         $command = $application->find('wallabag:install');
 
-        // We mock the QuestionHelper
-        $question = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper')
-            ->disableOriginalConstructor()
-            ->getMock();
-
-        $question->expects($this->exactly(2))
-            ->method('ask')
-            ->will($this->onConsecutiveCalls(
-                false, // don't want to reset the entire database
-                false // don't want to create a new user
-            ));
-
-        // We override the standard helper with our mock
-        $command->getHelperSet()->set($question, 'question');
-
         $tester = new CommandTester($command);
+        $tester->setInputs([
+            'n', // don't want to reset the entire database
+            'n', // don't want to create a new user
+        ]);
         $tester->execute([
             'command' => $command->getName(),
         ]);
@@ -275,21 +254,11 @@ class InstallCommandTest extends WallabagCoreTestCase
 
         $command = $application->find('wallabag:install');
 
-        // We mock the QuestionHelper
-        $question = $this->getMockBuilder('Symfony\Component\Console\Helper\QuestionHelper')
-            ->disableOriginalConstructor()
-            ->getMock();
-        $question->expects($this->any())
-            ->method('ask')
-            ->will($this->returnValue('yes_'.uniqid('', true)));
-
-        // We override the standard helper with our mock
-        $command->getHelperSet()->set($question, 'question');
-
         $tester = new CommandTester($command);
         $tester->execute([
             'command' => $command->getName(),
-            '--no-interaction' => true,
+        ], [
+            'interactive' => false,
         ]);
 
         $this->assertContains('Checking system requirements.', $tester->getDisplay());
index ec31708f93d1240ccd5332317b67abb4b2f5efd6..4cde3679202895bfb2c46aba11961a5682812626 100644 (file)
@@ -10,7 +10,7 @@ use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
 class TagAllCommandTest extends WallabagCoreTestCase
 {
     /**
-     * @expectedException Symfony\Component\Console\Exception\RuntimeException
+     * @expectedException \Symfony\Component\Console\Exception\RuntimeException
      * @expectedExceptionMessage Not enough arguments (missing: "username")
      */
     public function testRunTagAllCommandWithoutUsername()
index 35888f167f8078545105999e944d1f11ac8a5e4c..5bc815ee6f455197ae4acea97f723a5c1d097efc 100644 (file)
@@ -67,8 +67,17 @@ class ConfigControllerTest extends WallabagCoreTestCase
     public function testChangeReadingSpeed()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://0.0.0.0/test-entry1')
+            ->setReadingTime(22);
+        $this->getEntityManager()->persist($entry);
+
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
+
         $crawler = $client->request('GET', '/unread/list');
         $form = $crawler->filter('button[id=submit-filter]')->form();
         $dataFilters = [
@@ -409,6 +418,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
     public function testTaggingRuleCreation()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/config');
@@ -939,6 +949,7 @@ class ConfigControllerTest extends WallabagCoreTestCase
     public function testSwitchViewMode()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $client->request('GET', '/unread/list');
index 116e5f323bbfa330154fc8b42efb8e1abe59f23f..cc7b3672c73e6ddc98f6d7ce33a73c7cbdae52ee 100644 (file)
@@ -71,6 +71,7 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testGetNew()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/new');
@@ -84,6 +85,7 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testPostNewViaBookmarklet()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/');
@@ -195,6 +197,12 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testPostNewOkUrlExist()
     {
         $this->logInAs('admin');
+
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/new');
@@ -288,7 +296,7 @@ class EntryControllerTest extends WallabagCoreTestCase
         $tags = $entry->getTags();
 
         $this->assertCount(2, $tags);
-        $this->assertEquals('wallabag', $tags[0]->getLabel());
+        $this->assertContains('wallabag', $tags);
 
         $em->remove($entry);
         $em->flush();
@@ -317,7 +325,7 @@ class EntryControllerTest extends WallabagCoreTestCase
         $tags = $entry->getTags();
 
         $this->assertCount(2, $tags);
-        $this->assertEquals('wallabag', $tags[1]->getLabel());
+        $this->assertContains('wallabag', $tags);
 
         $em->remove($entry);
         $em->flush();
@@ -364,24 +372,23 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl());
     }
 
-    /**
-     * @depends testPostNewOk
-     */
     public function testView()
     {
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://example.com/foo');
+        $entry->setTitle('title foo');
+        $entry->setContent('foo bar baz');
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
 
-        $crawler = $client->request('GET', '/view/'.$content->getId());
+        $crawler = $client->request('GET', '/view/'.$entry->getId());
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
         $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
-        $this->assertContains($content->getTitle(), $body[0]);
+        $this->assertContains($entry->getTitle(), $body[0]);
     }
 
     /**
@@ -394,27 +401,23 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $em = $client->getContainer()
-            ->get('doctrine.orm.entity_manager');
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setTitle('title foo');
+        $entry->setContent('');
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
 
-        $content = $em
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
-
-        // empty content
-        $content->setContent('');
-        $em->persist($content);
-        $em->flush();
-
-        $client->request('GET', '/reload/'.$content->getId());
+        $client->request('GET', '/reload/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
-        $content = $em
+        $entry = $this->getEntityManager()
             ->getRepository('WallabagCoreBundle:Entry')
-            ->find($content->getId());
+            ->find($entry->getId());
 
-        $this->assertNotEmpty($content->getContent());
+        $this->assertNotEmpty($entry->getContent());
     }
 
     /**
@@ -425,32 +428,21 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $em = $client->getContainer()
-            ->get('doctrine.orm.entity_manager');
-
-        $content = $em
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
-
-        // put a known failed url
-        $content->setUrl('http://0.0.0.0/failed.html');
-        $em->persist($content);
-        $em->flush();
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://0.0.0.0/failed.html');
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
 
-        $client->request('GET', '/reload/'.$content->getId());
+        $client->request('GET', '/reload/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
         // force EntityManager to clear previous entity
         // otherwise, retrieve the same entity will retrieve change from the previous request :0
-        $em->clear();
-        $newContent = $em
+        $this->getEntityManager()->clear();
+        $newContent = $this->getEntityManager()
             ->getRepository('WallabagCoreBundle:Entry')
-            ->find($content->getId());
-
-        $newContent->setUrl($this->url);
-        $em->persist($newContent);
-        $em->flush();
+            ->find($entry->getId());
 
         $this->assertNotEquals($client->getContainer()->getParameter('wallabag_core.fetching_error_message'), $newContent->getContent());
     }
@@ -460,12 +452,12 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
 
-        $crawler = $client->request('GET', '/edit/'.$content->getId());
+        $crawler = $client->request('GET', '/edit/'.$entry->getId());
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
 
@@ -478,12 +470,12 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
 
-        $crawler = $client->request('GET', '/edit/'.$content->getId());
+        $crawler = $client->request('GET', '/edit/'.$entry->getId());
 
         $this->assertEquals(200, $client->getResponse()->getStatusCode());
 
@@ -508,19 +500,20 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
 
-        $client->request('GET', '/archive/'.$content->getId());
+        $client->request('GET', '/archive/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
         $res = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
-            ->find($content->getId());
+            ->find($entry->getId());
 
         $this->assertEquals($res->isArchived(), true);
     }
@@ -530,19 +523,20 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
 
-        $client->request('GET', '/star/'.$content->getId());
+        $client->request('GET', '/star/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
         $res = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
-            ->findOneById($content->getId());
+            ->findOneById($entry->getId());
 
         $this->assertEquals($res->isStarred(), true);
     }
@@ -552,16 +546,16 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
 
-        $client->request('GET', '/delete/'.$content->getId());
+        $client->request('GET', '/delete/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
-        $client->request('GET', '/delete/'.$content->getId());
+        $client->request('GET', '/delete/'.$entry->getId());
 
         $this->assertEquals(404, $client->getResponse()->getStatusCode());
     }
@@ -627,7 +621,13 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testFilterOnReadingTime()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setReadingTime(22);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
 
         $crawler = $client->request('GET', '/unread/list');
 
@@ -666,9 +666,20 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testFilterOnReadingTimeOnlyUpper()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
-        $crawler = $client->request('GET', '/unread/list');
+        $crawler = $client->request('GET', '/all/list');
+        $this->assertCount(5, $crawler->filter('div[class=entry]'));
+
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setReadingTime(23);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
+        $crawler = $client->request('GET', '/all/list');
+        $this->assertCount(6, $crawler->filter('div[class=entry]'));
 
         $form = $crawler->filter('button[id=submit-filter]')->form();
 
@@ -678,12 +689,13 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
-        $this->assertCount(3, $crawler->filter('div[class=entry]'));
+        $this->assertCount(5, $crawler->filter('div[class=entry]'));
     }
 
     public function testFilterOnReadingTimeOnlyLower()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/unread/list');
@@ -696,12 +708,22 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
-        $this->assertCount(4, $crawler->filter('div[class=entry]'));
+        $this->assertCount(0, $crawler->filter('div[class=entry]'));
+
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setReadingTime(23);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
+        $crawler = $client->submit($form, $data);
+        $this->assertCount(1, $crawler->filter('div[class=entry]'));
     }
 
     public function testFilterOnUnreadStatus()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/all/list');
@@ -714,12 +736,23 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
+        $this->assertCount(4, $crawler->filter('div[class=entry]'));
+
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setArchived(false);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
+        $crawler = $client->submit($form, $data);
+
         $this->assertCount(5, $crawler->filter('div[class=entry]'));
     }
 
     public function testFilterOnCreationDate()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/unread/list');
@@ -733,7 +766,7 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
-        $this->assertCount(6, $crawler->filter('div[class=entry]'));
+        $this->assertCount(5, $crawler->filter('div[class=entry]'));
 
         $data = [
             'entry_filter[createdAt][left_date]' => date('d/m/Y'),
@@ -742,7 +775,7 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
-        $this->assertCount(6, $crawler->filter('div[class=entry]'));
+        $this->assertCount(5, $crawler->filter('div[class=entry]'));
 
         $data = [
             'entry_filter[createdAt][left_date]' => '01/01/1970',
@@ -786,6 +819,7 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testFilterOnDomainName()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/unread/list');
@@ -818,6 +852,7 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testFilterOnStatus()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/unread/list');
@@ -839,6 +874,7 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testPreviewPictureFilter()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
         $crawler = $client->request('GET', '/unread/list');
@@ -846,14 +882,21 @@ class EntryControllerTest extends WallabagCoreTestCase
         $form['entry_filter[previewPicture]']->tick();
 
         $crawler = $client->submit($form);
-        $this->assertCount(2, $crawler->filter('div[class=entry]'));
+        $this->assertCount(1, $crawler->filter('div[class=entry]'));
     }
 
     public function testFilterOnLanguage()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setLanguage('fr');
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
         $crawler = $client->request('GET', '/unread/list');
         $form = $crawler->filter('button[id=submit-filter]')->form();
         $data = [
@@ -877,10 +920,14 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findOneByUser($this->getLoggedInUserId());
+        // sharing is enabled
+        $client->getContainer()->get('craue_config')->set('share_public', 1);
+
+        $content = new Entry($this->getLoggedInUser());
+        $content->setUrl($this->url);
+        $this->getEntityManager()->persist($content);
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
 
         // no uid
         $client->request('GET', '/share/'.$content->getUid());
@@ -970,6 +1017,20 @@ class EntryControllerTest extends WallabagCoreTestCase
         $url = 'http://www.20minutes.fr/montpellier/1952003-20161030-video-car-tombe-panne-rugbymen-perpignan-improvisent-melee-route';
         $client->getContainer()->get('craue_config')->set('download_images_enabled', 1);
 
+        $crawler = $client->request('GET', '/new');
+
+        $this->assertEquals(200, $client->getResponse()->getStatusCode());
+
+        $form = $crawler->filter('form[name=entry]')->form();
+
+        $data = [
+            'entry[url]' => $url,
+        ];
+
+        $client->submit($form, $data);
+
+        $this->assertEquals(302, $client->getResponse()->getStatusCode());
+
         $content = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
@@ -987,28 +1048,19 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('empty');
         $client = $this->getClient();
 
-        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
-        $user = $em
-            ->getRepository('WallabagUserBundle:User')
-            ->find($this->getLoggedInUserId());
-
-        if (!$user) {
-            $this->markTestSkipped('No user found in db.');
-        }
-
         // Redirect to homepage
-        $config = $user->getConfig();
+        $config = $this->getLoggedInUser()->getConfig();
         $config->setActionMarkAsRead(Config::REDIRECT_TO_HOMEPAGE);
-        $em->persist($config);
-        $em->flush();
+        $this->getEntityManager()->persist($config);
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
 
-        $client->request('GET', '/view/'.$content->getId());
-        $client->request('GET', '/archive/'.$content->getId());
+        $this->getEntityManager()->flush();
+
+        $client->request('GET', '/view/'.$entry->getId());
+        $client->request('GET', '/archive/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
         $this->assertEquals('/', $client->getResponse()->headers->get('location'));
@@ -1019,46 +1071,36 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->logInAs('empty');
         $client = $this->getClient();
 
-        $em = $client->getContainer()->get('doctrine.orm.entity_manager');
-        $user = $em
-            ->getRepository('WallabagUserBundle:User')
-            ->find($this->getLoggedInUserId());
-
-        if (!$user) {
-            $this->markTestSkipped('No user found in db.');
-        }
-
         // Redirect to current page
-        $config = $user->getConfig();
+        $config = $this->getLoggedInUser()->getConfig();
         $config->setActionMarkAsRead(Config::REDIRECT_TO_CURRENT_PAGE);
-        $em->persist($config);
-        $em->flush();
+        $this->getEntityManager()->persist($config);
 
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $this->getEntityManager()->persist($entry);
 
-        $client->request('GET', '/view/'.$content->getId());
-        $client->request('GET', '/archive/'.$content->getId());
+        $this->getEntityManager()->flush();
+
+        $client->request('GET', '/view/'.$entry->getId());
+        $client->request('GET', '/archive/'.$entry->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
-        $this->assertContains('/view/'.$content->getId(), $client->getResponse()->headers->get('location'));
+        $this->assertContains('/view/'.$entry->getId(), $client->getResponse()->headers->get('location'));
     }
 
     public function testFilterOnHttpStatus()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
-        $crawler = $client->request('GET', '/new');
-        $form = $crawler->filter('form[name=entry]')->form();
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://www.lemonde.fr/incorrect-url/');
+        $entry->setHttpStatus(404);
+        $this->getEntityManager()->persist($entry);
 
-        $data = [
-            'entry[url]' => 'http://www.lemonde.fr/incorrect-url/',
-        ];
-
-        $client->submit($form, $data);
+        $this->getEntityManager()->flush();
 
         $crawler = $client->request('GET', '/all/list');
         $form = $crawler->filter('button[id=submit-filter]')->form();
@@ -1071,14 +1113,17 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $this->assertCount(1, $crawler->filter('div[class=entry]'));
 
-        $crawler = $client->request('GET', '/new');
-        $form = $crawler->filter('form[name=entry]')->form();
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setHttpStatus(200);
+        $this->getEntityManager()->persist($entry);
 
-        $data = [
-            'entry[url]' => 'http://www.nextinpact.com/news/101235-wallabag-alternative-libre-a-pocket-creuse-petit-a-petit-son-nid.htm',
-        ];
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://www.nextinpact.com/news/101235-wallabag-alternative-libre-a-pocket-creuse-petit-a-petit-son-nid.htm');
+        $entry->setHttpStatus(200);
+        $this->getEntityManager()->persist($entry);
 
-        $client->submit($form, $data);
+        $this->getEntityManager()->flush();
 
         $crawler = $client->request('GET', '/all/list');
         $form = $crawler->filter('button[id=submit-filter]')->form();
@@ -1106,8 +1151,15 @@ class EntryControllerTest extends WallabagCoreTestCase
     public function testSearch()
     {
         $this->logInAs('admin');
+        $this->useTheme('baggy');
         $client = $this->getClient();
 
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl($this->url);
+        $entry->setTitle('test');
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
         // Search on unread list
         $crawler = $client->request('GET', '/unread/list');
 
@@ -1118,35 +1170,37 @@ class EntryControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->submit($form, $data);
 
-        $this->assertCount(5, $crawler->filter('div[class=entry]'));
+        $this->assertCount(4, $crawler->filter('div[class=entry]'));
 
         // Search on starred list
         $crawler = $client->request('GET', '/starred/list');
 
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://localhost/foo/bar');
+        $entry->setTitle('testeur');
+        $entry->setStarred(true);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
         $form = $crawler->filter('form[name=search]')->form();
         $data = [
-            'search_entry[term]' => 'title',
+            'search_entry[term]' => 'testeur',
         ];
 
         $crawler = $client->submit($form, $data);
 
         $this->assertCount(1, $crawler->filter('div[class=entry]'));
 
-        // Added new article to test on archive list
-        $crawler = $client->request('GET', '/new');
-        $form = $crawler->filter('form[name=entry]')->form();
-        $data = [
-            'entry[url]' => $this->url,
-        ];
-        $client->submit($form, $data);
-        $content = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId($this->url, $this->getLoggedInUserId());
-        $client->request('GET', '/archive/'.$content->getId());
-
         $crawler = $client->request('GET', '/archive/list');
 
+        // Added new article to test on archive list
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://0.0.0.0/foo/baz/qux');
+        $entry->setTitle('Le manège');
+        $entry->setArchived(true);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
         $form = $crawler->filter('form[name=search]')->form();
         $data = [
             'search_entry[term]' => 'manège',
@@ -1155,7 +1209,7 @@ class EntryControllerTest extends WallabagCoreTestCase
         $crawler = $client->submit($form, $data);
 
         $this->assertCount(1, $crawler->filter('div[class=entry]'));
-        $client->request('GET', '/delete/'.$content->getId());
+        $client->request('GET', '/delete/'.$entry->getId());
 
         // test on list of all articles
         $crawler = $client->request('GET', '/all/list');
@@ -1170,6 +1224,13 @@ class EntryControllerTest extends WallabagCoreTestCase
         $this->assertCount(0, $crawler->filter('div[class=entry]'));
 
         // test url search on list of all articles
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://domain/qux');
+        $entry->setTitle('Le manège');
+        $entry->setArchived(true);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+
         $crawler = $client->request('GET', '/all/list');
 
         $form = $crawler->filter('form[name=search]')->form();
index 63f2c829a8eef3bae39ca0b9d69fbf3080e289e9..b38961d391d4dd8abd58489e38f8cdc11a6a667b 100644 (file)
@@ -239,7 +239,7 @@ class ExportControllerTest extends WallabagCoreTestCase
         $this->assertEquals($contentInDB->getLanguage(), $content[0]['language']);
         $this->assertEquals($contentInDB->getReadingtime(), $content[0]['reading_time']);
         $this->assertEquals($contentInDB->getDomainname(), $content[0]['domain_name']);
-        $this->assertEquals(['foo bar', 'baz', 'foot'], $content[0]['tags']);
+        $this->assertEquals(['foo bar', 'baz'], $content[0]['tags']);
     }
 
     public function testXmlExport()
index c3b22dcd2c41fb2aa148ed09ca6e43ffe77bd804..af1ad7af19a39e19a227a4dd8dfe0b355e9e962a 100644 (file)
@@ -3,6 +3,7 @@
 namespace Tests\Wallabag\CoreBundle\Controller;
 
 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
+use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Entity\Tag;
 
 class TagControllerTest extends WallabagCoreTestCase
@@ -24,10 +25,11 @@ class TagControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $entry = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId());
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://0.0.0.0/foo');
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
 
         $crawler = $client->request('GET', '/view/'.$entry->getId());
 
@@ -41,23 +43,15 @@ class TagControllerTest extends WallabagCoreTestCase
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
         // be sure to reload the entry
-        $entry = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId());
-
-        $this->assertEquals(4, count($entry->getTags()));
+        $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
+        $this->assertCount(1, $entry->getTags());
 
         // tag already exists and already assigned
         $client->submit($form, $data);
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
-        $newEntry = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->find($entry->getId());
-
-        $this->assertEquals(4, count($newEntry->getTags()));
+        $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
+        $this->assertCount(1, $entry->getTags());
 
         // tag already exists but still not assigned to this entry
         $data = [
@@ -67,12 +61,8 @@ class TagControllerTest extends WallabagCoreTestCase
         $client->submit($form, $data);
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
 
-        $newEntry = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->find($entry->getId());
-
-        $this->assertEquals(4, count($newEntry->getTags()));
+        $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
+        $this->assertCount(2, $entry->getTags());
     }
 
     public function testAddMultipleTagToEntry()
@@ -116,20 +106,25 @@ class TagControllerTest extends WallabagCoreTestCase
         $this->logInAs('admin');
         $client = $this->getClient();
 
-        $entry = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Entry')
-            ->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId());
-
-        $tag = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Tag')
-            ->findOneByEntryAndTagLabel($entry, $this->tagName);
-
+        $tag = new Tag();
+        $tag->setLabel($this->tagName);
+        $entry = new Entry($this->getLoggedInUser());
+        $entry->setUrl('http://0.0.0.0/foo');
+        $entry->addTag($tag);
+        $this->getEntityManager()->persist($entry);
+        $this->getEntityManager()->flush();
+        $this->getEntityManager()->clear();
+
+        // We make a first request to set an history and test redirection after tag deletion
+        $client->request('GET', '/view/'.$entry->getId());
+        $entryUri = $client->getRequest()->getUri();
         $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
 
         $this->assertEquals(302, $client->getResponse()->getStatusCode());
+        $this->assertEquals($entryUri, $client->getResponse()->getTargetUrl());
 
+        // re-retrieve the entry to be sure to get fresh data from database (mostly for tags)
+        $entry = $this->getEntityManager()->getRepository(Entry::class)->find($entry->getId());
         $this->assertNotContains($this->tagName, $entry->getTags());
 
         $client->request('GET', '/remove-tag/'.$entry->getId().'/'.$tag->getId());
index 77dfd5bf91404544d5ddbd2232adb429da3fa94f..a3570125e11e39fefcd11a53aac334a9f7d9956b 100644 (file)
@@ -3,12 +3,14 @@
 namespace Tests\Wallabag\CoreBundle\Helper;
 
 use Psr\Log\NullLogger;
+use Monolog\Logger;
+use Monolog\Handler\TestHandler;
 use Wallabag\CoreBundle\Helper\ContentProxy;
 use Wallabag\CoreBundle\Entity\Entry;
 use Wallabag\CoreBundle\Entity\Tag;
 use Wallabag\UserBundle\Entity\User;
-use Wallabag\CoreBundle\Repository\TagRepository;
 use Wallabag\CoreBundle\Helper\RuleBasedTagger;
+use Graby\Graby;
 
 class ContentProxyTest extends \PHPUnit_Framework_TestCase
 {
@@ -36,7 +38,8 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
             ]);
 
         $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://user@:80');
+        $entry = new Entry(new User());
+        $proxy->updateEntry($entry, 'http://user@:80');
 
         $this->assertEquals('http://user@:80', $entry->getUrl());
         $this->assertEmpty($entry->getTitle());
@@ -70,7 +73,8 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
             ]);
 
         $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0');
+        $entry = new Entry(new User());
+        $proxy->updateEntry($entry, 'http://0.0.0.0');
 
         $this->assertEquals('http://0.0.0.0', $entry->getUrl());
         $this->assertEmpty($entry->getTitle());
@@ -109,7 +113,8 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
             ]);
 
         $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://domain.io');
+        $entry = new Entry(new User());
+        $proxy->updateEntry($entry, 'http://domain.io');
 
         $this->assertEquals('http://domain.io', $entry->getUrl());
         $this->assertEquals('my title', $entry->getTitle());
@@ -150,7 +155,8 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
             ]);
 
         $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0');
+        $entry = new Entry(new User());
+        $proxy->updateEntry($entry, 'http://0.0.0.0');
 
         $this->assertEquals('http://1.1.1.1', $entry->getUrl());
         $this->assertEquals('this is my title', $entry->getTitle());
@@ -191,7 +197,8 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
             ]);
 
         $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0');
+        $entry = new Entry(new User());
+        $proxy->updateEntry($entry, 'http://0.0.0.0');
 
         $this->assertEquals('http://1.1.1.1', $entry->getUrl());
         $this->assertEquals('this is my title', $entry->getTitle());
@@ -210,16 +217,62 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
         $tagger->expects($this->once())
             ->method('tag');
 
-        $graby = $this->getMockBuilder('Graby\Graby')->getMock();
+        $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
+        $entry = new Entry(new User());
+        $proxy->updateEntry(
+            $entry,
+            'http://0.0.0.0',
+            [
+                'html' => str_repeat('this is my content', 325),
+                'title' => 'this is my title',
+                'url' => 'http://1.1.1.1',
+                'content_type' => 'text/html',
+                'language' => 'fr',
+                'date' => '1395635872',
+                'authors' => ['Jeremy', 'Nico', 'Thomas'],
+                'all_headers' => [
+                    'Cache-Control' => 'no-cache',
+                ],
+            ]
+        );
 
-        $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0', [
-            'html' => str_repeat('this is my content', 325),
-            'title' => 'this is my title',
-            'url' => 'http://1.1.1.1',
-            'content_type' => 'text/html',
-            'language' => 'fr',
-        ]);
+        $this->assertEquals('http://1.1.1.1', $entry->getUrl());
+        $this->assertEquals('this is my title', $entry->getTitle());
+        $this->assertContains('this is my content', $entry->getContent());
+        $this->assertEquals('text/html', $entry->getMimetype());
+        $this->assertEquals('fr', $entry->getLanguage());
+        $this->assertEquals(4.0, $entry->getReadingTime());
+        $this->assertEquals('1.1.1.1', $entry->getDomainName());
+        $this->assertEquals('24/03/2014', $entry->getPublishedAt()->format('d/m/Y'));
+        $this->assertContains('Jeremy', $entry->getPublishedBy());
+        $this->assertContains('Nico', $entry->getPublishedBy());
+        $this->assertContains('Thomas', $entry->getPublishedBy());
+        $this->assertContains('no-cache', $entry->getHeaders());
+    }
+
+    public function testWithForcedContentAndDatetime()
+    {
+        $tagger = $this->getTaggerMock();
+        $tagger->expects($this->once())
+            ->method('tag');
+
+        $logHandler = new TestHandler();
+        $logger = new Logger('test', [$logHandler]);
+
+        $proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage);
+        $entry = new Entry(new User());
+        $proxy->updateEntry(
+            $entry,
+            'http://1.1.1.1',
+            [
+                'html' => str_repeat('this is my content', 325),
+                'title' => 'this is my title',
+                'url' => 'http://1.1.1.1',
+                'content_type' => 'text/html',
+                'language' => 'fr',
+                'date' => '2016-09-08T11:55:58+0200',
+            ]
+        );
 
         $this->assertEquals('http://1.1.1.1', $entry->getUrl());
         $this->assertEquals('this is my title', $entry->getTitle());
@@ -228,32 +281,126 @@ class ContentProxyTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals('fr', $entry->getLanguage());
         $this->assertEquals(4.0, $entry->getReadingTime());
         $this->assertEquals('1.1.1.1', $entry->getDomainName());
+        $this->assertEquals('08/09/2016', $entry->getPublishedAt()->format('d/m/Y'));
     }
 
-    public function testTaggerThrowException()
+    public function testWithForcedContentAndBadDate()
     {
-        $graby = $this->getMockBuilder('Graby\Graby')
-            ->disableOriginalConstructor()
-            ->getMock();
+        $tagger = $this->getTaggerMock();
+        $tagger->expects($this->once())
+            ->method('tag');
 
+        $logger = new Logger('foo');
+        $handler = new TestHandler();
+        $logger->pushHandler($handler);
+
+        $proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage);
+        $entry = new Entry(new User());
+        $proxy->updateEntry(
+            $entry,
+            'http://1.1.1.1',
+            [
+                'html' => str_repeat('this is my content', 325),
+                'title' => 'this is my title',
+                'url' => 'http://1.1.1.1',
+                'content_type' => 'text/html',
+                'language' => 'fr',
+                'date' => '01 02 2012',
+            ]
+        );
+
+        $this->assertEquals('http://1.1.1.1', $entry->getUrl());
+        $this->assertEquals('this is my title', $entry->getTitle());
+        $this->assertContains('this is my content', $entry->getContent());
+        $this->assertEquals('text/html', $entry->getMimetype());
+        $this->assertEquals('fr', $entry->getLanguage());
+        $this->assertEquals(4.0, $entry->getReadingTime());
+        $this->assertEquals('1.1.1.1', $entry->getDomainName());
+        $this->assertNull($entry->getPublishedAt());
+
+        $records = $handler->getRecords();
+
+        $this->assertCount(1, $records);
+        $this->assertContains('Error while defining date', $records[0]['message']);
+    }
+
+    public function testTaggerThrowException()
+    {
         $tagger = $this->getTaggerMock();
         $tagger->expects($this->once())
             ->method('tag')
             ->will($this->throwException(new \Exception()));
 
-        $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
-
-        $entry = $proxy->updateEntry(new Entry(new User()), 'http://0.0.0.0', [
-            'html' => str_repeat('this is my content', 325),
-            'title' => 'this is my title',
-            'url' => 'http://1.1.1.1',
-            'content_type' => 'text/html',
-            'language' => 'fr',
-        ]);
+        $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
+        $entry = new Entry(new User());
+        $proxy->updateEntry(
+            $entry,
+            'http://1.1.1.1',
+            [
+                'html' => str_repeat('this is my content', 325),
+                'title' => 'this is my title',
+                'url' => 'http://1.1.1.1',
+                'content_type' => 'text/html',
+                'language' => 'fr',
+            ]
+        );
 
         $this->assertCount(0, $entry->getTags());
     }
 
+    public function dataForCrazyHtml()
+    {
+        return [
+            'script and comment' => [
+                '<strong>Script inside:</strong> <!--[if gte IE 4]><script>alert(\'lol\');</script><![endif]--><br />',
+                'lol',
+            ],
+            'script' => [
+                '<strong>Script inside:</strong><script>alert(\'lol\');</script>',
+                'script',
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider dataForCrazyHtml
+     */
+    public function testWithCrazyHtmlContent($html, $escapedString)
+    {
+        $tagger = $this->getTaggerMock();
+        $tagger->expects($this->once())
+            ->method('tag');
+
+        $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
+        $entry = new Entry(new User());
+        $proxy->updateEntry(
+            $entry,
+            'http://1.1.1.1',
+            [
+                'html' => $html,
+                'title' => 'this is my title',
+                'url' => 'http://1.1.1.1',
+                'content_type' => 'text/html',
+                'language' => 'fr',
+                'status' => '200',
+                'open_graph' => [
+                    'og_title' => 'my OG title',
+                    'og_description' => 'OG desc',
+                    'og_image' => 'http://3.3.3.3/cover.jpg',
+                ],
+            ]
+        );
+
+        $this->assertEquals('http://1.1.1.1', $entry->getUrl());
+        $this->assertEquals('this is my title', $entry->getTitle());
+        $this->assertNotContains($escapedString, $entry->getContent());
+        $this->assertEquals('http://3.3.3.3/cover.jpg', $entry->getPreviewPicture());
+        $this->assertEquals('text/html', $entry->getMimetype());
+        $this->assertEquals('fr', $entry->getLanguage());
+        $this->assertEquals('200', $entry->getHttpStatus());
+        $this->assertEquals('1.1.1.1', $entry->getDomainName());
+    }
+
     private function getTaggerMock()
     {
         return $this->getMockBuilder(RuleBasedTagger::class)
index 85f12d87b27277f7f8a543fc0d947798d35c82ce..9125f8dcb2da20fbeb0ebd61a67efbdba11f00dc 100644 (file)
@@ -12,7 +12,24 @@ use GuzzleHttp\Stream\Stream;
 
 class DownloadImagesTest extends \PHPUnit_Framework_TestCase
 {
-    public function testProcessHtml()
+    public function dataForSuccessImage()
+    {
+        return [
+            'imgur' => [
+                '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>',
+                'http://imgur.com/gallery/WxtWY',
+            ],
+            'image with &' => [
+                '<div><img src="https://i2.wp.com/www.tvaddons.ag/wp-content/uploads/2017/01/Screen-Shot-2017-01-07-at-10.17.40-PM.jpg?w=640&amp;ssl=1" /></div>',
+                'https://www.tvaddons.ag/realdebrid-kodi-jarvis/',
+            ],
+        ];
+    }
+
+    /**
+     * @dataProvider dataForSuccessImage
+     */
+    public function testProcessHtml($html, $url)
     {
         $client = new Client();
 
@@ -27,9 +44,10 @@ class DownloadImagesTest extends \PHPUnit_Framework_TestCase
 
         $download = new DownloadImages($client, sys_get_temp_dir().'/wallabag_test', 'http://wallabag.io/', $logger);
 
-        $res = $download->processHtml(123, '<div><img src="http://i.imgur.com/T9qgcHc.jpg" /></div>', 'http://imgur.com/gallery/WxtWY');
+        $res = $download->processHtml(123, $html, $url);
 
-        $this->assertContains('http://wallabag.io/assets/images/9/b/9b0ead26/c638b4c2.png', $res);
+        // this the base path of all image (since it's calculated using the entry id: 123)
+        $this->assertContains('http://wallabag.io/assets/images/9/b/9b0ead26/', $res);
     }
 
     public function testProcessHtmlWithBadImage()
index 0539f20a90ddcffd5c24d12e1e25dd9df9eb54f6..f420d06aefd6293b73807d3952208c0b5c0dbc4e 100644 (file)
@@ -89,4 +89,22 @@ class RedirectTest extends \PHPUnit_Framework_TestCase
 
         $this->assertEquals($this->routerMock->generate('homepage'), $redirectUrl);
     }
+
+    public function testUserForRedirectWithIgnoreActionMarkAsRead()
+    {
+        $this->token->getUser()->getConfig()->setActionMarkAsRead(Config::REDIRECT_TO_HOMEPAGE);
+
+        $redirectUrl = $this->redirect->to('/unread/list', '', true);
+
+        $this->assertEquals('/unread/list', $redirectUrl);
+    }
+
+    public function testUserForRedirectNullWithFallbackWithIgnoreActionMarkAsRead()
+    {
+        $this->token->getUser()->getConfig()->setActionMarkAsRead(Config::REDIRECT_TO_HOMEPAGE);
+
+        $redirectUrl = $this->redirect->to(null, 'fallback', true);
+
+        $this->assertEquals('fallback', $redirectUrl);
+    }
 }
index 2e6fccfb152fe8830efddad032b8b15e9e95bb17..ca8e0d50b5bba11894202ee4c26e5e4a0faf1f65 100644 (file)
@@ -136,7 +136,7 @@ class UsernameRssTokenConverterTest extends \PHPUnit_Framework_TestCase
     }
 
     /**
-     * @expectedException Symfony\Component\HttpKernel\Exception\NotFoundHttpException
+     * @expectedException \Symfony\Component\HttpKernel\Exception\NotFoundHttpException
      * @expectedExceptionMessage User not found
      */
     public function testApplyUserNotFound()
index 7bf4b43ce8f32ee462aaec0187e44df448dcea76..eec6939d77756c33f72f67d90f9db7f55af23ef3 100644 (file)
@@ -2,11 +2,20 @@
 
 namespace Tests\Wallabag\CoreBundle;
 
+use Symfony\Bundle\FrameworkBundle\Client;
+use Symfony\Bundle\FrameworkBundle\Console\Application;
 use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
 use Symfony\Component\BrowserKit\Cookie;
+use Symfony\Component\Console\Input\ArrayInput;
+use Symfony\Component\Console\Output\NullOutput;
+use Wallabag\CoreBundle\Entity\Config;
+use Wallabag\UserBundle\Entity\User;
 
 abstract class WallabagCoreTestCase extends WebTestCase
 {
+    /**
+     * @var Client|null
+     */
     private $client = null;
 
     public function getClient()
@@ -21,6 +30,44 @@ abstract class WallabagCoreTestCase extends WebTestCase
         $this->client = static::createClient();
     }
 
+    public function resetDatabase(Client $client)
+    {
+        $application = new Application($client->getKernel());
+        $application->setAutoExit(false);
+
+        $application->run(new ArrayInput([
+            'command' => 'doctrine:schema:drop',
+            '--no-interaction' => true,
+            '--force' => true,
+            '--env' => 'test',
+        ]), new NullOutput());
+
+        $application->run(new ArrayInput([
+            'command' => 'doctrine:schema:create',
+            '--no-interaction' => true,
+            '--env' => 'test',
+        ]), new NullOutput());
+
+        $application->run(new ArrayInput([
+            'command' => 'doctrine:fixtures:load',
+            '--no-interaction' => true,
+            '--env' => 'test',
+        ]), new NullOutput());
+
+        /*
+         * Recreate client to avoid error:
+         *
+         * [Doctrine\DBAL\ConnectionException]
+         * Transaction commit failed because the transaction has been marked for rollback only.
+         */
+        $this->client = static::createClient();
+    }
+
+    public function getEntityManager()
+    {
+        return $this->client->getContainer()->get('doctrine.orm.entity_manager');
+    }
+
     /**
      * Login a user without making a HTTP request.
      * If we make a HTTP request we lose ability to mock service in the container.
@@ -37,7 +84,7 @@ abstract class WallabagCoreTestCase extends WebTestCase
         $firewallName = $container->getParameter('fos_user.firewall_name');
 
         $user = $userManager->findUserBy(array('username' => $username));
-        $loginManager->loginUser($firewallName, $user);
+        $loginManager->logInUser($firewallName, $user);
 
         $session->set('_security_'.$firewallName, serialize($container->get('security.token_storage')->getToken()));
         $session->save();
@@ -65,22 +112,41 @@ abstract class WallabagCoreTestCase extends WebTestCase
     }
 
     /**
-     * Return the user id of the logged in user.
+     * Return the user of the logged in user.
      * You should be sure that you called `logInAs` before.
      *
-     * @return int
+     * @return User
      */
-    public function getLoggedInUserId()
+    public function getLoggedInUser()
     {
         $token = static::$kernel->getContainer()->get('security.token_storage')->getToken();
 
         if (null !== $token) {
-            return $token->getUser()->getId();
+            return $token->getUser();
         }
 
         throw new \RuntimeException('No logged in User.');
     }
 
+    /**
+     * Return the user id of the logged in user.
+     * You should be sure that you called `logInAs` before.
+     *
+     * @return int
+     */
+    public function getLoggedInUserId()
+    {
+        return $this->getLoggedInUser()->getId();
+    }
+
+    public function useTheme($theme)
+    {
+        $config = $this->getEntityManager()->getRepository(Config::class)->findOneByUser($this->getLoggedInUser());
+        $config->setTheme($theme);
+        $this->getEntityManager()->persist($config);
+        $this->getEntityManager()->flush();
+    }
+
     /**
      * Check if Redis is installed.
      * If not, mark test as skip.
index 7043c3450b73c63d267057c20e13b160840767e4..f507563cc6039b13f54cf03c475343539721c9a8 100644 (file)
@@ -95,6 +95,7 @@ class ImportCommandTest extends WallabagCoreTestCase
             'username' => 1,
             'filepath' => $application->getKernel()->getContainer()->getParameter('kernel.root_dir').'/../tests/Wallabag/ImportBundle/fixtures/wallabag-v2-read.json',
             '--useUserId' => true,
+            '--importer' => 'v2',
         ]);
     }
 }
index 749528478d470c8e20209b5769fe128a1c1ab89a..e5e251a0f9d3bd86a768253f832e8a0827ec7f53 100644 (file)
@@ -11,7 +11,7 @@ use M6Web\Component\RedisMock\RedisMockFactory;
 class RedisWorkerCommandTest extends WallabagCoreTestCase
 {
     /**
-     * @expectedException Symfony\Component\Console\Exception\RuntimeException
+     * @expectedException \Symfony\Component\Console\Exception\RuntimeException
      * @expectedExceptionMessage Not enough arguments (missing: "serviceName")
      */
     public function testRunRedisWorkerCommandWithoutArguments()
@@ -28,7 +28,7 @@ class RedisWorkerCommandTest extends WallabagCoreTestCase
     }
 
     /**
-     * @expectedException Symfony\Component\Config\Definition\Exception\Exception
+     * @expectedException \Symfony\Component\Config\Definition\Exception\Exception
      * @expectedExceptionMessage No queue or consumer found for service name
      */
     public function testRunRedisWorkerCommandWithBadService()
index c2e5fdb752f8f8461150ca917e00f67b7ebceb86..84742e0a7903847ea1a82641de7e84041f80d28f 100644 (file)
@@ -107,6 +107,9 @@ class InstapaperControllerTest extends WallabagCoreTestCase
 
         $crawler = $client->followRedirect();
 
+        $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
+        $this->assertContains('flashes.import.notice.summary', $body[0]);
+
         $content = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
@@ -115,14 +118,25 @@ class InstapaperControllerTest extends WallabagCoreTestCase
                 $this->getLoggedInUserId()
             );
 
-        $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
-        $this->assertContains('flashes.import.notice.summary', $body[0]);
-
         $this->assertNotEmpty($content->getMimetype(), 'Mimetype for http://www.liberation.fr is ok');
         $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for http://www.liberation.fr is ok');
         $this->assertNotEmpty($content->getLanguage(), 'Language for http://www.liberation.fr is ok');
+        $this->assertContains('foot', $content->getTags(), 'It includes the "foot" tag');
         $this->assertEquals(1, count($content->getTags()));
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
+
+        $content = $client->getContainer()
+            ->get('doctrine.orm.entity_manager')
+            ->getRepository('WallabagCoreBundle:Entry')
+            ->findByUrlAndUserId(
+                'http://www.20minutes.fr/high-tech/2077615-20170531-dis-donc-donald-trump-quoi-exactement-covfefe',
+                $this->getLoggedInUserId()
+            );
+
+        $this->assertContains('foot', $content->getTags());
+        $this->assertContains('test_tag', $content->getTags());
+
+        $this->assertEquals(2, count($content->getTags()));
     }
 
     public function testImportInstapaperWithFileAndMarkAllAsRead()
index 96b32484299ebc0453f8b60b1f0a8c31c632bae9..e2b6e7b6eb1d1f6d14180a7fda4630a394896595 100644 (file)
@@ -121,7 +121,13 @@ class PinboardControllerTest extends WallabagCoreTestCase
         $this->assertNotEmpty($content->getMimetype(), 'Mimetype for https://ma.ttias.be is ok');
         $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for https://ma.ttias.be is ok');
         $this->assertNotEmpty($content->getLanguage(), 'Language for https://ma.ttias.be is ok');
-        $this->assertEquals(3, count($content->getTags()));
+
+        $tags = $content->getTags();
+        $this->assertContains('foot', $tags, 'It includes the "foot" tag');
+        $this->assertContains('varnish', $tags, 'It includes the "varnish" tag');
+        $this->assertContains('PHP', $tags, 'It includes the "PHP" tag');
+        $this->assertEquals(3, count($tags));
+
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
         $this->assertEquals('2016-10-26', $content->getCreatedAt()->format('Y-m-d'));
     }
index e6d33fe99933f4e6735e658edda17c9ff5bf885f..bde0a60011fd1b273f939bad79cc6c64feff453c 100644 (file)
@@ -121,7 +121,11 @@ class ReadabilityControllerTest extends WallabagCoreTestCase
         $this->assertNotEmpty($content->getMimetype(), 'Mimetype for http://www.zataz.com is ok');
         $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for http://www.zataz.com is ok');
         $this->assertNotEmpty($content->getLanguage(), 'Language for http://www.zataz.com is ok');
-        $this->assertEquals(1, count($content->getTags()));
+
+        $tags = $content->getTags();
+        $this->assertContains('foot', $tags, 'It includes the "foot" tag');
+        $this->assertEquals(1, count($tags));
+
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
         $this->assertEquals('2016-09-08', $content->getCreatedAt()->format('Y-m-d'));
     }
index 0c7f97ed6a87ec67dfa422ca54f8e6e456529202..2c492c207fc469acc7cf562ac4f3484764223c6d 100644 (file)
@@ -112,24 +112,22 @@ class WallabagV1ControllerTest extends WallabagCoreTestCase
             ->get('doctrine.orm.entity_manager')
             ->getRepository('WallabagCoreBundle:Entry')
             ->findByUrlAndUserId(
-                'https://framablog.org/2014/02/05/framabag-service-libre-gratuit-interview-developpeur/',
+                'http://www.framablog.org/index.php/post/2014/02/05/Framabag-service-libre-gratuit-interview-developpeur',
                 $this->getLoggedInUserId()
             );
 
-        $tag = $client->getContainer()
-            ->get('doctrine.orm.entity_manager')
-            ->getRepository('WallabagCoreBundle:Tag')
-            ->findOneByLabel('Framabag');
-
-        $this->assertTrue($content->getTags()->contains($tag));
-
         $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
         $this->assertContains('flashes.import.notice.summary', $body[0]);
 
-        $this->assertNotEmpty($content->getMimetype(), 'Mimetype for http://www.framablog.org is ok');
-        $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for http://www.framablog.org is ok');
-        $this->assertNotEmpty($content->getLanguage(), 'Language for http://www.framablog.org is ok');
-        $this->assertEquals(2, count($content->getTags()));
+        $this->assertEmpty($content->getMimetype(), 'Mimetype for http://www.framablog.org is empty');
+        $this->assertEmpty($content->getPreviewPicture(), 'Preview picture for http://www.framablog.org is empty');
+        $this->assertEmpty($content->getLanguage(), 'Language for http://www.framablog.org is empty');
+
+        $tags = $content->getTags();
+        $this->assertContains('foot', $tags, 'It includes the "foot" tag');
+        $this->assertContains('Framabag', $tags, 'It includes the "Framabag" tag');
+        $this->assertEquals(2, count($tags));
+
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
     }
 
index 556ab1bdcfa3490802f10b900ad65139e10cdfc6..248932591759aa585c8fd1f18211f16df15661e0 100644 (file)
@@ -119,10 +119,14 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase
                 $this->getLoggedInUserId()
             );
 
-        $this->assertNotEmpty($content->getMimetype(), 'Mimetype for http://www.liberation.fr is ok');
-        $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for http://www.liberation.fr is ok');
-        $this->assertNotEmpty($content->getLanguage(), 'Language for http://www.liberation.fr is ok');
-        $this->assertEquals(1, count($content->getTags()));
+        // empty because it wasn't re-imported
+        $this->assertEmpty($content->getMimetype(), 'Mimetype for http://www.liberation.fr is empty');
+        $this->assertEmpty($content->getPreviewPicture(), 'Preview picture for http://www.liberation.fr is empty');
+        $this->assertEmpty($content->getLanguage(), 'Language for http://www.liberation.fr is empty');
+
+        $tags = $content->getTags();
+        $this->assertContains('foot', $tags, 'It includes the "foot" tag');
+        $this->assertEquals(1, count($tags));
 
         $content = $client->getContainer()
             ->get('doctrine.orm.entity_manager')
@@ -135,9 +139,16 @@ class WallabagV2ControllerTest extends WallabagCoreTestCase
         $this->assertNotEmpty($content->getMimetype(), 'Mimetype for https://www.mediapart.fr is ok');
         $this->assertNotEmpty($content->getPreviewPicture(), 'Preview picture for https://www.mediapart.fr is ok');
         $this->assertNotEmpty($content->getLanguage(), 'Language for https://www.mediapart.fr is ok');
-        $this->assertEquals(3, count($content->getTags()));
+
+        $tags = $content->getTags();
+        $this->assertContains('foot', $tags, 'It includes the "foot" tag');
+        $this->assertContains('mediapart', $tags, 'It includes the "mediapart" tag');
+        $this->assertContains('blog', $tags, 'It includes the "blog" tag');
+        $this->assertEquals(3, count($tags));
+
         $this->assertInstanceOf(\DateTime::class, $content->getCreatedAt());
         $this->assertEquals('2016-09-08', $content->getCreatedAt()->format('Y-m-d'));
+        $this->assertTrue($content->isStarred(), 'Entry is starred');
     }
 
     public function testImportWallabagWithEmptyFile()
index 6777a02e880a7c3e0fb14f4356eedeb067ad0f3b..9158c8a23277f411f3a41f28176aca93ed3b01e7 100644 (file)
@@ -18,6 +18,7 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
     protected $logHandler;
     protected $contentProxy;
     protected $tagsAssigner;
+    protected $uow;
 
     private function getInstapaperImport($unsetUser = false, $dispatched = 0)
     {
@@ -27,6 +28,20 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
+        $this->uow = $this->getMockBuilder('Doctrine\ORM\UnitOfWork')
+            ->disableOriginalConstructor()
+            ->getMock();
+
+        $this->em
+            ->expects($this->any())
+            ->method('getUnitOfWork')
+            ->willReturn($this->uow);
+
+        $this->uow
+            ->expects($this->any())
+            ->method('getScheduledEntityInsertions')
+            ->willReturn([]);
+
         $this->contentProxy = $this->getMockBuilder('Wallabag\CoreBundle\Helper\ContentProxy')
             ->disableOriginalConstructor()
             ->getMock();
@@ -67,14 +82,14 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
 
     public function testImport()
     {
-        $instapaperImport = $this->getInstapaperImport(false, 3);
+        $instapaperImport = $this->getInstapaperImport(false, 4);
         $instapaperImport->setFilepath(__DIR__.'/../fixtures/instapaper-export.csv');
 
         $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
             ->disableOriginalConstructor()
             ->getMock();
 
-        $entryRepo->expects($this->exactly(3))
+        $entryRepo->expects($this->exactly(4))
             ->method('findByUrlAndUserId')
             ->willReturn(false);
 
@@ -88,14 +103,14 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $this->contentProxy
-            ->expects($this->exactly(3))
+            ->expects($this->exactly(4))
             ->method('updateEntry')
             ->willReturn($entry);
 
         $res = $instapaperImport->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 3, 'queued' => 0], $instapaperImport->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 4, 'queued' => 0], $instapaperImport->getSummary());
     }
 
     public function testImportAndMarkAllAsRead()
@@ -107,9 +122,9 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $entryRepo->expects($this->exactly(3))
+        $entryRepo->expects($this->exactly(4))
             ->method('findByUrlAndUserId')
-            ->will($this->onConsecutiveCalls(false, true, true));
+            ->will($this->onConsecutiveCalls(false, true, true, true));
 
         $this->em
             ->expects($this->any())
@@ -133,7 +148,7 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
 
         $this->assertTrue($res);
 
-        $this->assertEquals(['skipped' => 2, 'imported' => 1, 'queued' => 0], $instapaperImport->getSummary());
+        $this->assertEquals(['skipped' => 3, 'imported' => 1, 'queued' => 0], $instapaperImport->getSummary());
     }
 
     public function testImportWithRabbit()
@@ -165,7 +180,7 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $producer
-            ->expects($this->exactly(3))
+            ->expects($this->exactly(4))
             ->method('publish');
 
         $instapaperImport->setProducer($producer);
@@ -173,7 +188,7 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
         $res = $instapaperImport->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 3], $instapaperImport->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $instapaperImport->getSummary());
     }
 
     public function testImportWithRedis()
@@ -211,7 +226,7 @@ class InstapaperImportTest extends \PHPUnit_Framework_TestCase
         $res = $instapaperImport->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 3], $instapaperImport->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $instapaperImport->getSummary());
 
         $this->assertNotEmpty($redisMock->lpop('instapaper'));
     }
index 254f0a25c3df68ef14bdd3807ba5fc29a0dbe3fa..8f466d383a0406c69b9b9adf4f5ebc02a5f5404f 100644 (file)
@@ -67,14 +67,14 @@ class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
 
     public function testImport()
     {
-        $readabilityImport = $this->getReadabilityImport(false, 24);
+        $readabilityImport = $this->getReadabilityImport(false, 3);
         $readabilityImport->setFilepath(__DIR__.'/../fixtures/readability.json');
 
         $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
             ->disableOriginalConstructor()
             ->getMock();
 
-        $entryRepo->expects($this->exactly(24))
+        $entryRepo->expects($this->exactly(3))
             ->method('findByUrlAndUserId')
             ->willReturn(false);
 
@@ -88,14 +88,14 @@ class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $this->contentProxy
-            ->expects($this->exactly(24))
+            ->expects($this->exactly(3))
             ->method('updateEntry')
             ->willReturn($entry);
 
         $res = $readabilityImport->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 24, 'queued' => 0], $readabilityImport->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 3, 'queued' => 0], $readabilityImport->getSummary());
     }
 
     public function testImportAndMarkAllAsRead()
@@ -165,7 +165,7 @@ class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $producer
-            ->expects($this->exactly(24))
+            ->expects($this->exactly(3))
             ->method('publish');
 
         $readabilityImport->setProducer($producer);
@@ -173,7 +173,7 @@ class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
         $res = $readabilityImport->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $readabilityImport->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 3], $readabilityImport->getSummary());
     }
 
     public function testImportWithRedis()
@@ -211,7 +211,7 @@ class ReadabilityImportTest extends \PHPUnit_Framework_TestCase
         $res = $readabilityImport->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $readabilityImport->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 3], $readabilityImport->getSummary());
 
         $this->assertNotEmpty($redisMock->lpop('readability'));
     }
index 9f0c5bacdd5a25fbf5a40dad3d57127b27d2d6e6..834b7ef57bcbc1609ea9f97c3292a17c72e735c3 100644 (file)
@@ -19,6 +19,8 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
     protected $contentProxy;
     protected $tagsAssigner;
     protected $uow;
+    protected $fetchingErrorMessageTitle = 'No title found';
+    protected $fetchingErrorMessage = 'wallabag can\'t retrieve contents for this article. Please <a href="http://doc.wallabag.org/en/master/user/errors_during_fetching.html#how-can-i-help-to-fix-that">troubleshoot this issue</a>.';
 
     private function getWallabagV1Import($unsetUser = false, $dispatched = 0)
     {
@@ -58,7 +60,14 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
             ->expects($this->exactly($dispatched))
             ->method('dispatch');
 
-        $wallabag = new WallabagV1Import($this->em, $this->contentProxy, $this->tagsAssigner, $dispatcher);
+        $wallabag = new WallabagV1Import(
+            $this->em,
+            $this->contentProxy,
+            $this->tagsAssigner,
+            $dispatcher,
+            $this->fetchingErrorMessageTitle,
+            $this->fetchingErrorMessage
+        );
 
         $this->logHandler = new TestHandler();
         $logger = new Logger('test', [$this->logHandler]);
@@ -82,14 +91,14 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
 
     public function testImport()
     {
-        $wallabagV1Import = $this->getWallabagV1Import(false, 3);
+        $wallabagV1Import = $this->getWallabagV1Import(false, 1);
         $wallabagV1Import->setFilepath(__DIR__.'/../fixtures/wallabag-v1.json');
 
         $entryRepo = $this->getMockBuilder('Wallabag\CoreBundle\Repository\EntryRepository')
             ->disableOriginalConstructor()
             ->getMock();
 
-        $entryRepo->expects($this->exactly(4))
+        $entryRepo->expects($this->exactly(2))
             ->method('findByUrlAndUserId')
             ->will($this->onConsecutiveCalls(false, true, false, false));
 
@@ -103,14 +112,14 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $this->contentProxy
-            ->expects($this->exactly(3))
+            ->expects($this->exactly(1))
             ->method('updateEntry')
             ->willReturn($entry);
 
         $res = $wallabagV1Import->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 1, 'imported' => 3, 'queued' => 0], $wallabagV1Import->getSummary());
+        $this->assertEquals(['skipped' => 1, 'imported' => 1, 'queued' => 0], $wallabagV1Import->getSummary());
     }
 
     public function testImportAndMarkAllAsRead()
@@ -180,7 +189,7 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $producer
-            ->expects($this->exactly(4))
+            ->expects($this->exactly(2))
             ->method('publish');
 
         $wallabagV1Import->setProducer($producer);
@@ -188,7 +197,7 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
         $res = $wallabagV1Import->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $wallabagV1Import->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 2], $wallabagV1Import->getSummary());
     }
 
     public function testImportWithRedis()
@@ -226,7 +235,7 @@ class WallabagV1ImportTest extends \PHPUnit_Framework_TestCase
         $res = $wallabagV1Import->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 4], $wallabagV1Import->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 2], $wallabagV1Import->getSummary());
 
         $this->assertNotEmpty($redisMock->lpop('wallabag_v1'));
     }
index efcaeb9e903a3a7a55bfe29b570fbaeb148608b7..5cc04aa5929385506cc89758e5ea6275245b6ee8 100644 (file)
@@ -89,7 +89,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $entryRepo->expects($this->exactly(24))
+        $entryRepo->expects($this->exactly(6))
             ->method('findByUrlAndUserId')
             ->will($this->onConsecutiveCalls(false, true, false));
 
@@ -106,7 +106,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
         $res = $wallabagV2Import->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 22, 'imported' => 2, 'queued' => 0], $wallabagV2Import->getSummary());
+        $this->assertEquals(['skipped' => 4, 'imported' => 2, 'queued' => 0], $wallabagV2Import->getSummary());
     }
 
     public function testImportAndMarkAllAsRead()
@@ -172,7 +172,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
             ->getMock();
 
         $producer
-            ->expects($this->exactly(24))
+            ->expects($this->exactly(6))
             ->method('publish');
 
         $wallabagV2Import->setProducer($producer);
@@ -180,7 +180,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
         $res = $wallabagV2Import->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $wallabagV2Import->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 6], $wallabagV2Import->getSummary());
     }
 
     public function testImportWithRedis()
@@ -214,7 +214,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
         $res = $wallabagV2Import->setMarkAsRead(true)->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 24], $wallabagV2Import->getSummary());
+        $this->assertEquals(['skipped' => 0, 'imported' => 0, 'queued' => 6], $wallabagV2Import->getSummary());
 
         $this->assertNotEmpty($redisMock->lpop('wallabag_v2'));
     }
@@ -267,7 +267,7 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $entryRepo->expects($this->exactly(24))
+        $entryRepo->expects($this->exactly(6))
             ->method('findByUrlAndUserId')
             ->will($this->onConsecutiveCalls(false, true, false));
 
@@ -284,6 +284,6 @@ class WallabagV2ImportTest extends \PHPUnit_Framework_TestCase
         $res = $wallabagV2Import->import();
 
         $this->assertTrue($res);
-        $this->assertEquals(['skipped' => 22, 'imported' => 2, 'queued' => 0], $wallabagV2Import->getSummary());
+        $this->assertEquals(['skipped' => 4, 'imported' => 2, 'queued' => 0], $wallabagV2Import->getSummary());
     }
 }
index 28a4c8e67ea83a773a79d725bd1175e93494e43b..1a648f8aa933010633f78cf47c270878b6004a20 100644 (file)
@@ -2,3 +2,4 @@ URL,Title,Selection,Folder
 http://www.liberation.fr/societe/2012/12/06/baumettes-un-tour-en-cellule_865551,Baumettes : un tour en cellule,,Unread
 https://redditblog.com/2016/09/20/amp-and-reactredux/,AMP and React+Redux: Why Not?,,Archive
 https://medium.com/@the_minh/why-foursquare-swarm-is-still-my-favourite-social-network-e38228493e6c,Why Foursquare / Swarm is still my favourite social network,,Starred
+http://www.20minutes.fr/high-tech/2077615-20170531-dis-donc-donald-trump-quoi-exactement-covfefe,"Dis donc Donald Trump, c'est quoi exactement «covfefe»?",,test_tag
index 2dd744d31d305bf253ebaa62a5665dbd90be7a95..b5f653e7434546bbf0c0e35dee86e456f2e8b60b 100644 (file)
@@ -1,5 +1,3 @@
 [{"href":"https:\/\/developers.google.com\/web\/updates\/2016\/07\/infinite-scroller","description":"Complexities of an Infinite Scroller","extended":"TL;DR: Re-use your DOM elements and remove the ones that are far away from the viewport. Use placeholders to account for delayed data","meta":"21ff61c6f648901168f9e6119f53df7d","hash":"e69b65724cca1c585b446d4c47865d76","time":"2016-10-31T15:57:56Z","shared":"yes","toread":"no","tags":"infinite dom performance scroll"},
 {"href":"https:\/\/ma.ttias.be\/varnish-explained\/","description":"Varnish (explained) for PHP developers","extended":"A few months ago, I gave a presentation at LaraconEU in Amsterdam titled \"Varnish for PHP developers\". The generic title of that presentation is actually Varnish Explained and this is a write-up of that presentation, the video and the slides.","meta":"d32ad9fac2ed29da4aec12c562e9afb1","hash":"21dd6bdda8ad62666a2c9e79f6e80f98","time":"2016-10-26T06:43:03Z","shared":"yes","toread":"no","tags":"varnish PHP"},
-{"href":"https:\/\/ilia.ws\/files\/nginx_torontophpug.pdf","description":"Nginx Tricks for PHP Developers","extended":"","meta":"9adbb5c4ca6760e335b920800d88c70a","hash":"0189bb08f8bd0122c6544bed4624c546","time":"2016-10-05T07:11:27Z","shared":"yes","toread":"no","tags":"nginx PHP best_practice"},
-{"href":"https:\/\/jolicode.com\/blog\/starting-a-mobile-application-with-react-native","description":"Starting a mobile application with React Native","extended":"While preparing our next React Native training, I learnt a lot on the library and discovered an amazing community with a lot of packages.","meta":"bd140bd3e53e3a0b4cb08cdaf64bcbfc","hash":"015fa10cd97f56186420555e52cfab62","time":"2016-09-23T10:58:20Z","shared":"yes","toread":"no","tags":"react-native"},
-{"href":"http:\/\/open.blogs.nytimes.com\/2016\/08\/29\/testing-varnish-using-varnishtest\/","description":"Testing Varnish Using Varnishtest","extended":"Varnish ships with the ability to test using the testing tool varnishtest. Varnishtest gives you the ability to write VCL tests you can run on the command line or as part of your build process.","meta":"ca2752a07adea4bab52cd19e8fdbf356","hash":"d3e642cc1274d10e4c12ee31f5dde736","time":"2016-08-30T09:33:24Z","shared":"yes","toread":"no","tags":"varnish test vcl"}]
+{"href":"https:\/\/ilia.ws\/files\/nginx_torontophpug.pdf","description":"Nginx Tricks for PHP Developers","extended":"","meta":"9adbb5c4ca6760e335b920800d88c70a","hash":"0189bb08f8bd0122c6544bed4624c546","time":"2016-10-05T07:11:27Z","shared":"yes","toread":"no","tags":"nginx PHP best_practice"}]
index 32f6fa530c904ff5bf33a7970db501152af787d8..b9fd570df9887f9bc23729e2806a9765e467c09a 100644 (file)
             "article__title": "We Looked At 167,943 Tweets & Found Out Hashtags Are Worthless",
             "archive": false
         },
-        {
-            "article__title": "Réfugiés: l'UE va créer 100 000 places d'accueil dans les Balkans",
-            "article__url": "http://www.liberation.fr/planete/2015/10/26/refugies-l-ue-va-creer-100-000-places-d-accueil-dans-les-balkans_1408867",
-            "archive": false,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": false
-        },
         {
             "article__title": "No title found",
             "article__url": "http://news.nationalgeographic.com/2016/02/160211-albatrosses-mothers-babies-animals-science/&sf20739758=1",
             "date_added": "2016-09-08T11:55:58+0200",
             "favorite": true
         },
-        {
-            "archive": 0,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Échecs",
-            "article__url": "https://fr.wikipedia.org/wiki/Échecs"
-        },
         {
             "archive": 0,
             "date_added": "2016-09-08T11:55:58+0200",
             "favorite": 0,
             "article__title": "90% des dossiers médicaux des Coréens du sud vendus à des entreprises privées - ZATAZ",
             "article__url": "http://www.zataz.com/90-des-dossiers-medicaux-des-coreens-du-sud-vendus-a-des-entreprises-privees/"
-        },
-        {
-            "archive": 0,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Mass Surveillance As Art",
-            "article__url": "https://www.nationaljournal.com/s/73311/mass-surveillance-art"
-        },
-        {
-            "archive": 0,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "What David Cameron did to the pig, his party is now doing to the country",
-            "article__url": "http://www.newstatesman.com/2015/09/what-david-cameron-did-pig-his-party-now-doing-country"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "CLICK HERE to support 2016 CES Winner, Revolutionary Auto-Tracking Robot",
-            "article__url": "https://www.indiegogo.com/projects/2016-ces-winner-revolutionary-auto-tracking-robot"
-        },
-        {
-            "archive": 0,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 1,
-            "article__title": "No title found",
-            "article__url": "http://carnetdevol.shost.ca/wordpress/aide-memoire-sur-les-commandes-associees-a-systemd/"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Présentation d'Arduino - Tuto Arduino - Le blog d'Eskimon",
-            "article__url": "http://eskimon.fr/73-arduino-101-presentation"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Lenovo ThinkPad X1 Carbon Ultrabook Review",
-            "article__url": "http://www.notebookcheck.net/Lenovo-ThinkPad-X1-Carbon-Ultrabook-Review.138033.0.html"
-        },
-        {
-            "archive": 0,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Visitons le Château de Landsberg !",
-            "article__url": "http://autour-du-mont-sainte-odile.overblog.com/2016/01/visitons-le-chateau-de-landsberg.html"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Contrer les stéréotypes par les livres : “C'est dès l'enfance qu'ils se construisent”",
-            "article__url": "https://www.actualitte.com/article/monde-edition/contrer-les-stereotypes-par-les-livres-c-est-des-l-enfance-qu-ils-se-construisent/64058"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "[ROM][6.0.1][Layers][N5] TipsyOS official builds {UBER TCs}",
-            "article__url": "http://forum.xda-developers.com/google-nexus-5/development/rom-tipsyos-official-builds-uber-tcs-t3325989"
-        },
-        {
-            "archive": 0,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Top 15 Podcasts All Web Developers Should Follow - Envato Tuts+ Code Article",
-            "article__url": "http://code.tutsplus.com/articles/top-15-podcasts-all-web-developers-should-follow--net-14461"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "University of Mississippi",
-            "article__url": "http://olemiss.edu"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "FinnChristiansen.de Jetzt Dank Let’s Encrypt Per HTTPS Erreichbar",
-            "article__url": "https://www.finnchristiansen.de/2015/12/06/finnchristiansen-de-jetzt-dank-lets-encrypt-per-https-erreichbar/"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Le développeur et l'ingénierie logicielle",
-            "article__url": "http://wemucs.com/le-developpeur-et-lingenierie-logicielle/"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "The Role of Methylation in Gene Expression",
-            "article__url": "http://www.nature.com/scitable/topicpage/the-role-of-methylation-in-gene-expression-1070"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "E-Mail-Adresse kostenlos, FreeMail, De-Mail & Nachrichten",
-            "article__url": "http://web.de"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "OpenSSH Server on Arch Linux | DominicM test",
-            "article__url": "http://dominicm.com/openssh-server-arch-linux/"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Site Moved | Site Help",
-            "article__url": "http://g1.com/help/sitemoved.asp"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "#Maroc : le stylo anti-pédophiles EAGLE d’AMESYS est moins bien configuré que les faux-lowers Twitter du roi Mohammed VI",
-            "article__url": "https://reflets.info/maroc-le-stylo-anti-pedophiles-eagle-damesys-est-moins-bien-configure-que-les-faux-lowers-twitter-du-roi-mohammed-vi/"
-        },
-        {
-            "archive": 1,
-            "date_added": "2016-09-08T11:55:58+0200",
-            "favorite": 0,
-            "article__title": "Simple Cloud Infrastructure for Developers",
-            "article__url": "https://www.digitalocean.com/"
         }
    ],
     "recommendations": []
index f298469f488491a73d58bbfd9d230225c6966966..28270ec4e3ec6eff6adbef9a1c05ac6a83f566e1 100644 (file)
         "content": "<span class=\"name\">README.md</span><p>wallabag is a self hostable application allowing you to not miss any content anymore. Click, save, read it when you can. It extracts content so that you can read it when you have time.</p>\n<p>More informations on our website: <a href=\"http://wallabag.org\">wallabag.org</a></p>\n<h2><a class=\"anchor\" href=\"https://github.com/wallabag/wallabag#license\"></a>License</h2>\n<p>Copyright © 2010-2014 Nicolas Lœuillet <a href=\"mailto:nicolas@loeuillet.org\">nicolas@loeuillet.org</a> This work is free. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See the COPYING file for more details.</p>\n",
         "user_id": "1",
         "tags":""
-    },
-    {
-        "0": "3",
-        "1": "a self hostable application for saving web pages | wallabag",
-        "2": "https://www.wallabag.org/",
-        "3": "1",
-        "4": "0",
-        "5": "\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>wallabag (formerly poche) is a <strong>self hostable application for saving web pages</strong>. Unlike other services, wallabag is free (as in freedom) and open source.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>With this application you will not miss content anymore. <strong>Click, save, read it when you want</strong>. It saves the content you select so that you can read it when you have time.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-6 col-md-12 col-xs-12 col-sm-12\">\n<h2>How it works</h2>\n<p>Thanks to the bookmarklet or <a title=\"Downloads\" href=\"http://www.wallabag.org/downloads/\">third-party applications</a>, you save an article in your wallabag to read it later. Then, when you open your wallabag, <strong>you can comfortably read your articles</strong>.</p>\n<h2>How to use wallabag</h2>\n<p>There are two ways to use wallabag: you can <a href=\"http://www.wallabag.org/frequently-asked-questions/#How_can_I_install_wallabag_and_what_are_the_requirements\">install it</a> on your web server or you can <a href=\"http://app.inthepoche.com\">create an account</a> at Framabag (we install and upgrade wallabag for you).</p>\n</div>\n\n</div>\n",
-        "6": "1",
-        "id": "3",
-        "title": "a self hostable application for saving web pages | wallabag",
-        "url": "https://www.wallabag.org/",
-        "is_read": "1",
-        "is_fav": "0",
-        "content": "\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>wallabag (formerly poche) is a <strong>self hostable application for saving web pages</strong>. Unlike other services, wallabag is free (as in freedom) and open source.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-8 col-md-12 col-xs-12 col-sm-12\">\n<p>With this application you will not miss content anymore. <strong>Click, save, read it when you want</strong>. It saves the content you select so that you can read it when you have time.</p>\n</div>\n\n</div>\n<div class=\"row\">\n<div class=\"col-lg-6 col-md-12 col-xs-12 col-sm-12\">\n<h2>How it works</h2>\n<p>Thanks to the bookmarklet or <a title=\"Downloads\" href=\"http://www.wallabag.org/downloads/\">third-party applications</a>, you save an article in your wallabag to read it later. Then, when you open your wallabag, <strong>you can comfortably read your articles</strong>.</p>\n<h2>How to use wallabag</h2>\n<p>There are two ways to use wallabag: you can <a href=\"http://www.wallabag.org/frequently-asked-questions/#How_can_I_install_wallabag_and_what_are_the_requirements\">install it</a> on your web server or you can <a href=\"http://app.inthepoche.com\">create an account</a> at Framabag (we install and upgrade wallabag for you).</p>\n</div>\n\n</div>\n",
-        "user_id": "1"
-    },
-    {
-        "0": "4",
-        "1": "Sans titre",
-        "2": "http:\/\/www.konradlischka.info\/2016\/01\/blog\/wie-ein-deutsches-start-up-mit-wagniskapital-die-marktluecke-fuer-lokalen-digitaljournalismus-schliessen-will\/",
-        "3": "0",
-        "4": "0",
-        "5": "[unable to retrieve full-text content]",
-        "6": "1",
-        "id": "4",
-        "title": "Sans titre",
-        "url": "http:\/\/www.konradlischka.info\/2016\/01\/blog\/wie-ein-deutsches-start-up-mit-wagniskapital-die-marktluecke-fuer-lokalen-digitaljournalismus-schliessen-will\/",
-        "is_read": "0",
-        "is_fav": "0",
-        "content": "[unable to retrieve full-text content]",
-        "user_id": "1",
-        "tags": ""
     }
 ]
index efa8faf26cb4ffbb9b06ee09a771a7f903e2037d..0e30d95b826c7c3299d0e9110f5bb000442f8031 100644 (file)
@@ -6,7 +6,7 @@
         "is_archived": false,
         "created_at": "2016-09-08T11:55:58+0200",
         "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": false,
+        "is_starred": true,
         "content": "<div alt=\"li\">Édition <a href=\"https://blogs.mediapart.fr/edition/camedia-0\">CAMédia</a>\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/edition/camedia/article/180116/deux-nouvelles-editions-pour-debattre-dans-le-club-sur-la-laicite-et-sur-la-democratie\">Deux nouvelles éditions pour débattre dans le club sur la laïcité et sur la démocratie</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>CAMédia après un échange sur « l'éthique du débat » a lancé deux discussions , l'une sur le thème de la laïcité, l'autre ( encore en cours) sur celui de la démocratie. Nous sommes heureux de pouvoir signaler la création de deux nouvelles éditions participatives sur ces thèmes. Nous vous invitons à les lire et à participer à leurs débats.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/lucile-longre/blog/170116/de-limportance-de-rever-eloge-du-merveilleux\">De l'importance de rêver, éloge du merveilleux</a></h3>\n<p>17 janv. 2016 | Par </p>\n<p>Je parlerai ici des rêves comme moteur de vie, de ces rêves qui vous rattachent et vous font espérer à ce qu’il y a de plus humain dans l’homme, même au milieu de la plus noire des détresses.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/barbara-romagnan/blog/180116/fins-dune-toute-puissance\">Fin(s) d'une toute-puissance</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>En ce début d’année, je recommande la lecture du dernier ouvrage de Guillaume Duval, La France ne sera jamais plus une grande puissance ? Tant mieux !</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jean-pierre-thibaudat/blog/170116/l-allier-departement-de-destruction-massive-du-tissu-culturel\">L’Allier, département de destruction massive du tissu culturel</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Les temps sont durs pour les petites structures, les associations culturelles qui, de bourgades en villages, travaillent au cœur des régions. Leurs subventions sont souvent revues à la baisse. Le département de l’Allier les a carrément supprimées. Pour favoriser « l’événementiel ».</p>\n</div><div alt=\"li\">Édition <a href=\"https://blogs.mediapart.fr/edition/les-invites-de-mediapart\">Les invités de Mediapart</a>\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/edition/les-invites-de-mediapart/article/180116/la-democratie-deja-attaquee-par-la-cooperation-reglementaire-transatlantiqu\">La démocratie déjà attaquée par la coopération réglementaire transatlantique</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Lora Verheecke et David Lundy travaillent pour Corporate Europe Observatory, une ONG basée à Bruxelles qui enquête sur le pouvoir des lobbies des grandes entreprises sur la politique de l’Union européenne. Ils révèlent que depuis 25 ans le projet de « coopération réglementaire » mené par l’Union européenne et les États-Unis a été dominé par les grandes entreprises. ET que le TTIP cherche à entériner ce projet.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jacqueline-derens/blog/180116/2016-une-annee-test-pour-jacob-zuma-et-son-gouvernement\">2016, une année test pour Jacob Zuma et son gouvernement</a></h3>\n<p>18 janv. 2016 | Par </p>\n<p>Les turbulences de l’an passé ont toutes les chances de continuer à troubler le climat politique et social de l’Afrique du Sud en 2016. La situation exige des changements profonds dans la conduite des affaires du pays. Jacob Zuma tout en admettant la nécessité de ces changements, est-il l’homme de la situation ? Son gouvernement répondra-t-il aux attentes des citoyens sud-africains ?</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/marie-cosnay/blog/140116/un-mal-fou-janvier-2016\">Un mal fou (janvier 2016)</a></h3>\n<p>14 janv. 2016 | Par </p>\n<p>J’ai une fringale d’aventure, d’aventures à venir. J’ai la fringale de la fringale des aventures et soudain, rupture. Je n’y arrive plus, tout est bloqué, tout empêché. Faut dire que depuis un an environ, tout est devenu plus compliqué. Ecrire va de moins en moins de soi.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/jean-pierre-veran/blog/170116/redoublement-le-changement-bas-bruit\">Redoublement : le changement à bas bruit ?</a></h3>\n<p>17 janv. 2016 | Par </p>\n<p>S’il est une caractéristique de la forme scolaire française bien établie dans la culture des personnels, des élèves et des parents, c’est bien le redoublement, censé sanctionner des résultats insuffisants pour envisager le passage dans la classe supérieure. Or, en ce domaine, l’évolution est nette.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/michel-de-pracontal/blog/160116/samedi-sciences-196-des-chasseurs-de-mammouths-en-arctique-il-y-45-000-ans\">Samedi-sciences (196): des chasseurs de mammouths en Arctique il y a 45 000 ans</a></h3>\n<p>16 janv. 2016 | Par <a href=\"https://blogs.mediapart.fr/michel-de-pracontal\" class=\"journalist\">Michel de Pracontal</a></p>\n<p>Les restes d’un mammouth retrouvés en Arctique sibérien, datés de 45 000 ans, portent les traces de blessures infligées par des chasseurs humains. Les scientifiques pensaient jusqu’ici que notre espèce ne s’était pas aventurée dans cette région glaciale il y a plus de 30 000 ou 35 0000 ans. En réalité, des hommes ont réussi à survivre en Arctique au moins 10 000 ans plus tôt que l’on croyait.</p>\n</div><div alt=\"li\">\n<h3 class=\"title\"><a href=\"https://blogs.mediapart.fr/alain-zolty/blog/140116/de-la-democratie-du-citoyen-et-de-lethique\">De la démocratie, du citoyen et de l'éthique</a></h3>\n<p>14 janv. 2016 | Par </p>\n<p>Trois ouvrages sont parus au Seuil, qui font état de la nécessité d’intégrer le citoyen dans la gouvernance de la nation. Non pas à titre consultatif mais doté d’un pouvoir délibératif pour constituer une contre-force face aux clans politico-financiers qui dominent la vie publique.</p>\n</div>",
         "mimetype": "text/html",
         "language": "fr",
         "domain_name": "www.nationaljournal.com",
         "preview_picture": "https://www.nationaljournal.com/media/media/2015/09/17/06Julian-Assange.jpg",
         "tags": []
-    },
-    {
-        "is_archived": 0,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 605,
-        "title": "What David Cameron did to the pig, his party is now doing to the country",
-        "url": "http://www.newstatesman.com/2015/09/what-david-cameron-did-pig-his-party-now-doing-country",
-        "content": "<p>Whatever you do, don’t think about David Cameron and a dead pig. I know, I know it’s like trying not to think of an elephant, but the fact is that the allegations that the Prime Minister may have put a 'private part of his anatomy\" into a dead pig's mouth as part of an initiation ritual for an elite drinking society at Oxford University are actually a very serious matter, and it’s all about corruption and the nature of elected power, and it would help if we could all just calm down for a second and stop giggling. Don’t think I don’t see you at the back there.</p>\n<p>You know, I feel for David Cameron today, I really do. Politicians’ private sex lives should never be used against them - unless their particular proclivities implicate them in gross hypocrisy or they have harmed another human being. If the rumours are true, it’s unlikely that the pig in question was hurt by the Prime Minister’s ministrations, given that it was already missing its limbs and torso.</p>\n<p>Sniggering aside, this is unlikely to hurt David Cameron in the long run. He’s not looking for re-election, and besides, everyone knows posh people get up to weird sex stuff. Weird sex stuff is as British as weak tea and racism. When I was at Oxford, it was an open secret that the posh kids had naughty parties, and, of course, so did the rest of us - the difference was the much lower budget, and the fact that the posh kids didn’t seem to enjoy it as much as we did. It all seemed to be more about getting on than getting off. You didn’t shag or not shag the pig’s face because that was what you were into, you did it because you had your eye on a safe seat in Dorset in 20 years’ time and you needed to make the right friends.</p>\n<p>There is a reason that David Cameron is allowed to hold office when everyone assumes he spent the 1980s taking drugs and getting up to weird things with his Eton mates, but Jeremy Corbyn is considered unelectable because he didn’t sing the national anthem last week. Cameron is part of a select group of people to whom different rules apply, and he knows it, and his friends know it, and the tabloids know it, and the whole cosy British political machine knows it. This is why Corbyn will spend the next five years being savaged for having a slightly rumpled tie by the same newspapers that reported on the dead pig allegations under the title \"the making of an extraordinary Prime Minister\".</p>\n<p>The thing that's really horrifying about what has already been dubbed the 'Hameron' scandal is that it demonstrates what entitlement of this kind actually means, and how embarrassing it all is. There are people out there who can spend their early twenties in close proximity to cocaine and popping their peckers in offal and not even consider for a second that there might be anyone better placed to run the country. These are people who know the rules don’t apply to them, who know they can do whatever they want and still end up in charge. </p>\n<p>I don't honestly care whether or not David Cameron shagged a dead pig. I've been to enough house parties in Bethnal Green that this sort of thing doesn't shock me. Come back to me when there’s video evidence of Cameron dressed in a leather gimp-suit tanned from the flayed skins of the former shadow cabinet, leaping into an entire Shropshire field full of pigs and screaming that his name is Legion. Then we’ll talk. There are a lot of things that David Cameron has definitely done that I do find disgusting, though. Taking away benefits from sick and disabled people, pricing poor kids out of higher education, and forcing millions of families to rely on food banks. That, to me, is shocking and grotesque. I don't give a damn about what he did or didn’t do to that pig, and whether there was mood-lighting involved. </p>\n<p>But the fact is that a lot of people do, and they're precisely the sort of people whose votes Cameron has relied on to shore up the power he clearly feels is his by right, might and various dodgy initiation rituals involving sex workers, smashing up pubs and knobbing bits of meat. Cameron clearly believes those people are there to be manipulated, and that’s the reason this story actually matters, beyond the immediate risk that a handful of pearl-clutchers in the Home Counties might splutter themselves to death. </p>\n<p>I was explaining all this to an American friend who asked, not unreasonably, why I'd spent all morning scrolling through Twitter and cackling like a toddler with a nerf gun. I did my best to describe seriously what had happened, and my friend, who does not follow British politics, asked me, 'so this guy, was he elected or appointed?'</p>\n<p>The answer, of course, is both. David Cameron is not just prime minister because a quarter of the country voted for him. That's not how power works in Britain, or anywhere, and it's moments like this that show it plainly, which is why we're all vaguely embarrassed today. Cameron's route to the office he clearly believes himself born to began much earlier, possibly even on a balmy Oxford night, just Dave, a dead pig and a select group of wide-eyed, gurning future business leaders, all whooping and cheering.</p>\n<p>It would surely have been a moment more important to Cameron's career than any number of photoshoots with builders in Totnes. Power and money are accessed through the back door, or, as it may be, the pig's mouth, and as with any kink, the eroticism isn't about the act, but about what the act symbolises. It's about humiliation, about control, about power play. What might the young swain have been thinking as he unzipped? What went through his head? If you ask me, I'll bet he was thinking: <em>Soon. Someday soon, I will do this to the whole bloody country.</em></p>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 5,
-        "domain_name": "www.newstatesman.com",
-        "preview_picture": "http://www.newstatesman.com/sites/default/files/styles/thumb_730/public/blogs_2015/09/gettyimages-464604046.jpg?itok=EaABrZda",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 604,
-        "title": "CLICK HERE to support 2016 CES Winner, Revolutionary Auto-Tracking Robot",
-        "url": "https://www.indiegogo.com/projects/2016-ces-winner-revolutionary-auto-tracking-robot",
-        "content": "<div class=\"visible-xs visible-sm\" readability=\"8\">\n<div class=\"row\" readability=\"12\">\n<section class=\"col-sm-8\" readability=\"8\"><p>Sign Up for Inspiration</p>\n<p>Private, secure, spam-free</p>\n</section><section class=\"col-sm-4 i-top-lined-mobile-only\"><p>Follow us</p>\n    </section></div>\n<div class=\"row\" readability=\"9\">\n<section class=\"col-sm-8 i-top-lined\" readability=\"5\"><p>About Indiegogo</p>\n</section><section class=\"col-sm-4 i-top-lined\"><div class=\"row\">\n<p>Language</p>\n</div>\n</section></div>\n</div>\n<div class=\"visible-md visible-lg\" readability=\"13\">\n<section class=\"row\" readability=\"4\"><div class=\"col-md-3\">\n<p>Campaigning</p>\n      </div>\n<div class=\"col-md-3\">\n<p>Contributing</p>\n </div>\n<div class=\"col-md-6\" readability=\"13\">\n<p>Sign Up for Inspiration</p>\n<p>Private, secure, spam-free</p>\n</div>\n</section><section class=\"row\"><div class=\"col-md-3\">\n<p>About Indiegogo</p>\n     </div>\n<div class=\"col-md-4\">\n<p>Follow us</p>\n</div>\n<div class=\"col-md-2\">\n<p>Language</p>\n</div>\n</section></div>\n<section class=\"i-top-lined\" readability=\"1\">\n</section>",
-        "annotations": [],
-        "mimetype": "text/html",
-        "reading_time": 0,
-        "domain_name": "www.indiegogo.com",
-        "preview_picture": "https://c1.iggcdn.com/indiegogo-media-prod-cld/image/upload/c_fill,f_auto,h_630,w_1200/v1447395263/d6ckex9ynild6ica1xdk.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 0,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 1,
-        "id": 603,
-        "title": "No title found",
-        "url": "http://carnetdevol.shost.ca/wordpress/aide-memoire-sur-les-commandes-associees-a-systemd/",
-        "content": "wallabag can't retrieve contents for this article. Please report this issue to us.",
-        "annotations": [],
-        "mimetype": "text/html",
-        "reading_time": 0,
-        "domain_name": "carnetdevol.shost.ca",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 602,
-        "title": "Présentation d'Arduino - Tuto Arduino - Le blog d'Eskimon",
-        "url": "http://eskimon.fr/73-arduino-101-presentation",
-        "content": "<div class=\"chapitre\" id=\"457282\">\n<p class=\"introduction\">Comment faire de l’électronique en utilisant un langage de programmation ? La réponse, c’est le projet Arduino qui l’apporte. Vous allez le voir, celui-ci a été conçu pour être accessible à tous par sa simplicité. Mais il peut également être d’usage professionnel, tant les possibilités d’applications sont nombreuses.</p>\n<div class=\"sommaire\"><strong class=\"tgros\">Sommaire</strong>\n<ul><li><a href=\"http://eskimon.fr/73-arduino-101-presentation#457704\">Qu’est-ce que c’est ?</a></li>\n<li><a href=\"http://eskimon.fr/73-arduino-101-presentation#769345\">Pourquoi choisir Arduino ?</a></li>\n<li><a href=\"http://eskimon.fr/73-arduino-101-presentation#458252\">Les cartes Arduino</a></li>\n<li><a href=\"http://eskimon.fr/73-arduino-101-presentation#629075\">Liste d’achat</a></li>\n</ul></div>\n<div class=\"sideSommaire blocwrapper\"><ins class=\"adsbygoogle c1\" data-ad-client=\"ca-pub-2080155902357792\" data-ad-slot=\"1103196807\"/></div>\n<div class=\"sousparties\">\n<div class=\"souspartie\" id=\"457704\">\n<h2>Qu’est-ce que c’est ?</h2>\n<div class=\"texte\">Une équipe de développeurs composée de <em>Massimo Banzi, David Cuartielles, Tom Igoe, Gianluca Martino, David Mellis et Nicholas Zambetti</em> a imaginé un projet répondant au doux nom de <strong>Arduino</strong> et mettant en œuvre une petite carte électronique programmable et un logiciel multiplateforme, qui puisse être accessible à tout un chacun dans le but de créer facilement des systèmes électroniques. Étant donné qu’il y a des débutants parmi nous, commençons par voir un peu le vocabulaire commun propre au domaine de l’électronique et de l’informatique.\n<h3>Une carte électronique</h3>\n<p>Une <strong>carte électronique</strong> est un support plan, flexible ou rigide, généralement composé d’<a href=\"http://fr.wikipedia.org/wiki/Poly%C3%A9poxyde\">epoxy</a> ou de fibre de verre. Elle possède des pistes électriques disposées sur une, deux ou plusieurs couches (en surface et/ou en interne) qui permettent la mise en relation électrique des composants électroniques. Chaque piste relie tel composant à tel autre, de façon à créer un système électronique qui fonctionne et qui réalise les opérations demandées.</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422585.png\"/><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422584.png\"/><br/><em>Exemples de cartes électroniques</em></div>\n<p>Évidemment, tous les composants d’une carte électronique ne sont pas forcément reliés entre eux. Le câblage des composants suit un plan spécifique à chaque carte électronique, qui se nomme le <strong>schéma électronique</strong>.</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422580.png\"/><br/><em>Exemple de schéma électronique – carte Arduino Uno</em></div>\n<p>Enfin, avant de passer à la réalisation d’un carte électronique, il est nécessaire de transformer le schéma électronique en un <strong>schéma de câblage</strong>, appelé <strong>typon</strong>.</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422582.png\"/><br/><em>Exemple de typon – carte Arduino</em></div>\n<p class=\"question\">Une fois que l’on a une carte électronique, on fait quoi avec ?</p>\n<p>Eh bien une fois que la carte électronique est faite, nous n’avons plus qu’à la tester et l’utiliser ! Dans notre cas, avec Arduino, nous n’aurons pas à fabriquer la carte et encore moins à la concevoir. Elle existe, elle est déjà prête à l’emploi et nous n’avons plus qu’à l’utiliser. Et pour cela, vous allez devoir apprendre comment l’utiliser, ce que je vais vous montrer dans ce tutoriel.</p>\n<h3>Programmable ?</h3>\n<p>J’ai parlé de <strong>carte électronique programmable</strong> au début de ce chapitre. Mais savez-vous ce que c’est exactement ? Non pas vraiment. Alors voyons ensemble de quoi il s’agit. La carte Arduino est une carte électronique qui ne sait rien faire sans qu’on lui dise quoi faire. Pourquoi ? Eh bien c’est du au fait qu’elle est <strong>programmable</strong>. Cela signifie qu’elle a besoin d’un <strong>programme</strong> pour fonctionner.</p>\n<h4>Un programme</h4>\n<p>Un programme est une liste d’instructions qui est exécuté par un système. Par exemple votre navigateur internet, avec lequel vous lisez probablement ce cours, est un programme. On peut analogiquement faire référence à une liste de course :</p>\n<div class=\"gauche\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422587.png\"/></div>\n<p>Chaque élément de cette liste est une <strong>instruction</strong> qui vous dis : « Va chercher le lait » ou « Va chercher le pain », etc. Dans un programme le fonctionnement est similaire :</p>\n<ul><li>Attendre que l’utilisateur rentre un site internet à consulter</li>\n<li>Rechercher sur internet la page demandée</li>\n<li>Afficher le résultat</li>\n</ul><p>Tel pourrait être le fonctionnement de votre navigateur internet. Il va attendre que vous lui demandiez quelque chose pour aller le chercher et ensuite vous le montrer. Eh bien, tout aussi simplement que ces deux cas, une carte électronique programmable suit une liste d’instructions pour effectuer les opérations demandées par le programme.</p>\n<p class=\"question\">Et on les trouves où ces programmes ? Comment on fait pour le mettre dans la carte ? o_O</p>\n<p>Des programmes, on peut en trouver de partout. Mais restons concentré sur Arduino. Le programme que nous allons mettre dans la carte Arduino, c’est nous qui allons le réaliser. Oui, vous avez bien lu. Nous allons programmer cette carte Arduino. Bien sûr, ce ne sera pas aussi simple qu’une liste de course, mais rassurez-vous cependant car nous allons réussir quand même ! Je vous montrerais comment y parvenir, puisque avant tout c’est un des objectifs de ce tutoriel. Voici un exemple de programme : <img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422588.png\"/> Vous le voyez comme moi, il s’agit de plusieurs lignes de texte, chacune étant une instruction. Ce langage ressemble à un véritable baragouin et ne semble vouloir <em>à priori</em> rien dire du tout… Et pourtant, c’est ce que nous saurons faire dans quelques temps ! Car nous apprendrons le <strong>langage informatique</strong> utilisé pour programmer la carte Arduino. Je ne m’attarde pas sur les détails, nous aurons amplement le temps de revenir sur le sujet plus tard. Pour répondre à la deuxième question, nous allons avoir besoin d’un logiciel…</p>\n<h3>Et un logiciel ?</h3>\n<p>Bon, je ne vais pas vous faire le détail de ce qu’est un logiciel, vous savez sans aucun doute de quoi il s’agit. Ce n’est autre qu’un programme informatique exécuté sur un ordinateur. Oui, pour programmer la carte Arduino, nous allons utiliser un programme ! En fait, il va s’agir d’un <strong>compilateur</strong>. Alors qu’est-ce que c’est exactement ?</p>\n<h4>Un compilateur</h4>\n<p>En informatique, ce terme désigne un logiciel qui est capable de traduire un langage informatique, ou plutôt un programme utilisant un langage informatique, vers un langage plus approprié afin que la machine qui va le lire puisse le comprendre. C’est un peu comme si le patron anglais d’une firme Chinoise donnait des instructions en anglais à un de ses ouvriers chinois. L’ouvrier ne pourrait comprendre ce qu’il doit faire. Pour cela, il a besoin que l’on traduise ce que lui dit son patron. C’est le rôle du <strong>traducteur</strong>. Le compilateur va donc traduire les instructions du programme précédent, écrites en langage texte, vers un langage dit « machine ». Ce langage utilise uniquement des 0 et des 1. Nous verrons plus tard pourquoi. Cela pourrait être imagé de la façon suivante :</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422590.png\"/></div>\n<p>Donc, pour traduire le langage texte vers le langage machine (avec des 0 et des 1), nous aurons besoin de ce fameux compilateur. Et pas n’importe lequel, il faut celui qui soit capable de traduire le langage texte Arduino vers le langage machine Arduino. Et oui, sinon rien ne va fonctionner. Si vous mettez un traducteur Français vers Allemand entre notre patron anglais et son ouvrier chinois, ça ne fonctionnera pas mieux que s’ils discutaient directement. Vous comprenez ?</p>\n<p class=\"question\">Et pourquoi on doit utiliser un traducteur, on peut pas simplement apprendre le langage machine directement ?</p>\n<p>Comment dire… non ! Non parce que le langage machine est quasiment impossible à utiliser tel quel. Par exemple, comme il est composé de 0 et de 1, si je vous montre ça : « 0001011100111010101000111 », vous serez incapable, tout comme moi, de dire ce que cela signifie ! Et même si je vous dis que la suite « 01000001 » correspond à la lettre « A », je vous donne bien du courage pour coder rien qu’une phrase ! 😛 Bref, oubliez cette idée. C’est quand même plus facile d’utiliser des mots anglais (car oui nous allons être obligé de faire un peu d’anglais pour programmer, mais rien de bien compliqué rassure-vous) que des suites de 0 et de 1. Vous ne croyez pas ?</p>\n<h4>Envoyer le programme dans la carte</h4>\n<p>Là, je ne vais pas vous dire grand chose car c’est l’environnement de développement qui va gérer tout ça. Nous n’aurons qu’à apprendre comment utiliser ce dernier et il se débrouillera tout seul pour envoyer le programme dans la carte. Nah ! Nous n’aurons donc qu’à créer le programme sans nous soucier du reste.</p>\n</div>\n</div>\n<div class=\"souspartie\" id=\"769345\">\n<h2>Pourquoi choisir Arduino ?</h2>\n<div class=\"texte\">\n<h3>Que va-t-on faire avec ?</h3>\n<p>Avec Arduino, nous allons commencer par apprendre à programmer puis à utiliser des composants électroniques. Au final, nous saurons créer des systèmes électroniques plus ou moins complexes. Mais ce n’est pas tout…</p>\n<h4>D’abord, Arduino c’est…</h4>\n<p>… une carte électronique programmable et un logiciel gratuit :</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/307927.png\"/></div>\n<h4>Mais aussi</h4>\n<p>– Un prix dérisoire étant donné l’étendue des applications possibles. On comptera 20 euros pour la carte que l’on va utiliser dans le cours. Le logiciel est fournit gratuitement ! – Une compatibilité sous toutes les plateformes, à savoir : Windows, Linux et Mac OS. – Une communauté ultra développée ! Des milliers de forums d’entre-aide, de présentations de projets, de propositions de programmes et de bibliothèques, … – Un site en anglais <a href=\"http://www.arduino.cc/\">arduino.cc</a> et un autre en français <a href=\"http://www.arduino.cc/\">arduino.cc</a> où vous trouverez tout de la référence Arduino, le matériel, des exemples d’utilisations, de l’aide pour débuter, des explications sur le logiciel et le matériel, etc. – Une liberté quasi absolue. Elle constitue en elle même deux choses :</p>\n<ul><li>Le logiciel : gratuit et open source, développé en Java, dont la simplicité d’utilisation relève du savoir cliquer sur la souris</li>\n<li>Le matériel : cartes électroniques dont les schémas sont en libre circulation sur internet</li>\n</ul><p class=\"attention\">Cette liberté a une condition : le nom « Arduino » ne doit être employé que pour les cartes « officielles ». En somme, vous ne pouvez pas fabriquer votre propre carte sur le modèle Arduino et lui assigner le nom « Arduino ».</p>\n<h4>Et enfin, les applications possibles</h4>\n<p>Voici une liste non exhaustive des applications possible réalisées grâce à Arduino :</p>\n<ul><li>contrôler des appareils domestiques</li>\n<li>donner une « intelligence » à un robot</li>\n<li>réaliser des jeux de lumières</li>\n<li>permettre à un ordinateur de communiquer avec une carte électronique et différents capteurs</li>\n<li>télécommander un appareil mobile (modélisme)</li>\n<li>etc.</li>\n</ul><p>Il y a tellement d’autres infinités d’utilisations, vous pouvez simplement chercher sur votre moteur de recherche préféré ou sur Youtube le mot « Arduino » pour découvrir les milliers de projets réalisés avec !</p>\n<h4>Arduino dans ce tutoriel</h4>\n<p>Je vais quand même rappeler les principaux objectifs de ce cours. Nous allons avant tout découvrir Arduino dans son ensemble et apprendre à l’utiliser. Dans un premier temps, il s’agira de vous présenter ce qu’est Arduino, comment cela fonctionne globalement, pour ensuite entrer un peu plus dans le détail. Nous allons alors apprendre à utiliser le langage Arduino pour pouvoir créer des programmes très simple pour débuter. Nous enchainerons ensuite avec les différentes fonctionnalités de la carte et ferons de petits TP qui vous permettront d’assimiler chaque notion abordée. Dès lors que vous serez plutôt à l’aise avec toutes les bases, nous nous rapprocherons de l’utilisation de composants électroniques plus ou moins complexes et finirons par un plus « gros » TP alliant la programmation et l’électronique. De quoi vous mettre de l’eau à la bouche ! 😛</p>\n<h3>Arduino à l’école ?</h3>\n<p>Pédagogiquement, Arduino a aussi pas mal d’atout. En effet, ses créateurs ont d’abord pensé ce projet pour qu’il soit facile d’accès. Il permet ainsi une très bonne approche de nombreux domaines et ainsi d’apprendre plein de choses assez simplement.</p>\n<h4>Des exemples</h4>\n<p>Voici quelques exemples d’utilisation possible :</p>\n<ul><li>Simuler le fonctionnement des portes logiques</li>\n<li>Permettre l’utilisation de différents capteurs</li>\n<li>Mettre en œuvre et faciliter la compréhension d’un réseau informatique</li>\n<li>Se servir d’Arduino pour créer des maquettes animées montrant le fonctionnement des collisions entres les plaques de la croute terrestre, par exemple <img src=\"http://eskimon.fr/wp-includes/images/smilies/mrgreen.png\" alt=\":mrgreen:\" class=\"wp-smiley c2\"/></li>\n<li>Donner un exemple concret d’utilisation des matrices avec un clavier alphanumérique 16 touches ou plus</li>\n<li>Être la base pour des élèves ayant un TPE à faire pour le BAC</li>\n<li>…</li>\n</ul><p>De plus, énormément de ressources et tutoriels (mais souvent en anglais) se trouvent sur internet, ce qui offre un autonomie particulière à l’apprenant.</p>\n<h4>Des outils existant !</h4>\n<p>Enfin, pour terminer de vous convaincre d’utiliser Arduino pour découvrir le monde merveilleux de l’embarqué, il existe différents outils qui puissent être utilisé avec Arduino. Je vais en citer deux qui me semble être les principaux : <a href=\"http://blog.ardublock.com/\">Ardublock</a> est un outil qui se greffe au logiciel Arduino et qui permet de programmer avec des blocs. Chaque bloc est une instruction. On peut aisément faire des programmes avec cet outil et mêmes des plutôt complexes. Cela permet par exemple de se concentrer sur ce que l’on doit faire avec Arduino et non se concentrer sur Arduino pour ensuite ce que l’on doit comprendre avec. Citons entre autre la simulation de porte logique : plutôt créer des programmes rapidement sans connaitre le langage pour comprendre plus facilement comment fonctionne une porte logique. Et ce n’est qu’un exemple. Car cela permet aussi de permettre à de jeunes enfants de commencer à programmer sans de trop grandes complications.</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422596.png\"/><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422595.png\"/><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422597.png\"/><br/><em>Exemple de programmes réalisés avec Ardublock</em></div>\n<p><a href=\"http://processing.org/\">Processing</a> est une autre plateforme en lien avec Arduino. Là il n’y a pas de matériel, uniquement un logiciel. Il permet entre autre de créer des interfaces graphiques avec un langage de programmation très similaire à celui d’Arduino. Par contre, cela demande un niveau un peu plus élevé pour pouvoir l’utiliser, même si cela reste simple dans l’ensemble.</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422599.png\"/><br/><em>Voilà un exemple de ce que j’avais réalisé avec Processing pour faire communiquer mon ordinateur avec ma carte Arduino</em></div>\n<p>J’espère avoir été assez convaincant afin que vous franchissiez le pas et ayez du plaisir à apprendre ! <img src=\"http://eskimon.fr/wp-includes/images/smilies/simple-smile.png\" alt=\":)\" class=\"wp-smiley c2\"/></p>\n</div>\n</div>\n<div class=\"souspartie\" id=\"458252\">\n<h2>Les cartes Arduino</h2>\n<div class=\"texte\">Le matériel que j’ai choisi d’utiliser tout au long de ce cours n’a pas un prix excessif et, je l’ai dit, tourne aux alentours de 25 € TTC. Il existe plusieurs magasins en lignes et en boutiques qui vendent des cartes Arduino. Je vais vous en donner quelques-uns, mais avant, il va falloir différencier certaines choses.\n<h4>Les fabricants</h4>\n<p>Le projet Arduino est libre et les schémas des cartes circulent librement sur internet. D’où la mise en garde que je vais faire : il se peut qu’un illustre inconnu fabrique lui même ses cartes Arduino. Cela n’a rien de mal en soi, s’il veut les commercialiser, il peut. Mais s’il est malhonnête, il peut vous vendre un produit défectueux. Bien sûr, tout le monde ne cherchera pas à vous arnaquer. Mais la prudence est de rigueur. Faites donc attention où vous achetez vos cartes.</p>\n<h4>Les types de cartes</h4>\n<div class=\"floatDroite\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422602.gif\"/></div>\n<p>Il y a trois types de cartes :</p>\n<ul><li>Lesdites « officielles » qui sont fabriquées en Italie par le fabricant officiel : <em>Smart Projects</em></li>\n<li>Lesdits « compatibles » qui ne sont pas fabriqués par <em>Smart Projects</em>, mais qui sont totalement compatibles avec les Arduino officielles.</li>\n<li>Les « autres » fabriquées par diverse entreprise et commercialisées sous un nom différent (Freeduino, Seeduino, Femtoduino, …).</li>\n</ul><h4>Les différentes cartes</h4>\n<p>Des cartes Arduino il en existe beaucoup ! Voyons celles qui nous intéressent… <strong>La carte <em>Uno</em> et <em>Duemilanove</em></strong> Nous choisirons d’utiliser la carte portant le nom de « Uno » ou « Duemilanove ». Ces deux versions sont presque identiques.</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422601.png\"/><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422600.gif\"/><br/><em>Carte Arduino « Duemilavove » et « Uno » avec laquelle nous allons travailler</em></div>\n<p><strong>La carte <em>Mega</em></strong> La carte Arduino Mega est une autre carte qui offre toutes les fonctionnalités de la carte précédente, mais avec des fonctionnalités supplémentaires. On retrouve notamment un nombre d’entrées et de sorties plus important ainsi que plusieurs liaisons séries. Bien sûr, le prix est plus élevé : &gt; 40 € !</p>\n<div class=\"centre\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422586.png\"/><br/><em>Carte Arduino « Mega »</em></div>\n<p><strong>Les autres cartes</strong> Il existe encore beaucoup d’autres cartes, je vous laisse vous débrouiller pour trouver celle qui conviendra à vos projets. Cela dit, je vous conseil dans un premier temps d’utiliser la carte Arduino Uno ou Duemilanove d’une part car elle vous sera largement suffisante pour débuter et d’autre part car c’est avec celle-ci que nous présentons le cours.</p>\n<h4>Où acheter ?</h4>\n<p>Il existe sur le net une multitude de magasins qui proposent des cartes Arduino. Pour consulter la liste de ces magasins, rien de plus simple, il suffit de vous rendre sur le forum dédié :</p>\n<div class=\"centre\"><a href=\"http://fr.openclassrooms.com/forum/sujet/les-meilleures-boutiques-d-electronique-90967\"><strong>Les meilleurs boutiques d’électronique</strong></a> Cliquez-ici</div>\n<p class=\"question\">J’ai vu des cartes officielles « édition SMD/CMS ». Ca à l’air bien aussi, c’est quoi la différence ? Je peux m’en servir ?</p>\n<p>Il n’y a pas de différence ! enfin presque… « SMD » signifie <strong>Surface Mount Device</strong>, en français on appelle ça des « CMS » pour <strong>Composants Montés en Surface</strong>. Ces composants sont soudés directement sur le cuivre de la carte, il ne la traverse pas comme les autres. Pour les cartes Arduino, on retrouve le composant principal en édition SMD dans ces cartes. La carte est donc la même, aucune différence pour le tuto. Les composants sont les mêmes, seule l’allure « physique » est différente. Par exemple, ci-dessus la « Mega » est en SMD et la Uno est « classique ».</p>\n</div>\n</div>\n<div class=\"souspartie\" id=\"629075\">\n<h2>Liste d’achat</h2>\n<div class=\"texte\">Tout au long du cours, nous allons utiliser du matériel en supplément de la carte. Rassurez-vous le prix est bien moindre. Je vous donne cette liste, cela vous évitera d’acheter en plusieurs fois. Vous allez devoir me croire sur parole sur leur intérêt. Nous découvrirons comment chaque composant fonctionne et comment les utiliser tout au long du tutoriel. <img src=\"http://eskimon.fr/wp-includes/images/smilies/simple-smile.png\" alt=\":)\" class=\"wp-smiley c2\"/><p class=\"attention\">Attention, cette liste ne contient que les composants en quantités minimales strictes. Libre à vous de prendre plus de LED et de résistances par exemple (au cas où vous en perdriez ou détruisiez…). Pour ce qui est des prix, j’ai regardé sur différents sites grands publics (donc pas Farnell par exemple), ils peuvent donc paraître plus élevé que la normale dans la mesure où ces sites amortissent moins sur des ventes à des clients fidèles qui prennent tout en grande quantité…</p>\n<p>Avant que j’oublie, quatres éléments n’apparaitront pas dans la liste et sont indispensables :</p>\n<table><tbody><tr><th>Une Arduino Uno ou Duemilanove</th>\n<th>Un câble USB A mâle/B mâle</th>\n</tr><tr><td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369652.gif\"/></td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/422603.png\"/></td>\n</tr></tbody></table><table><tbody><tr><th>Une BreadBoard (plaque d’essai)</th>\n<th>Un lot de fils pour brancher le tout !</th>\n</tr><tr><td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369653.jpg\"/></td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369661.png\"/></td>\n</tr></tbody></table><h3>Liste Globale</h3>\n<p>Voici donc la liste du matériel nécessaire pour suivre le cours. Libre à vous de tout acheter ou non.</p>\n<div class=\"erreur\">Liste incomplète, le tutoriel n’est pas terminé ! Mais elle suffit pour suivre les chapitres en ligne.</div>\n<table><tbody><tr><th>Désignation</th>\n<th>Quantité</th>\n<th>Photo</th>\n<th>Description</th>\n</tr><tr><td>LED rouge</td>\n<td>7</td>\n<td rowspan=\"3\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369662.png\"/></td>\n<td rowspan=\"3\">Ce composant est une sorte de lampe un peu spécial. Nous nous en servirons principalement pour faire de la signalisation.</td>\n</tr><tr><td>LED verte</td>\n<td>3</td>\n</tr><tr><td>LED jaune (ou orange)</td>\n<td>2</td>\n</tr><tr><td>Résistance (entre 220 et 470 Ohm)</td>\n<td>10</td>\n<td rowspan=\"3\"><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369663.png\"/></td>\n<td rowspan=\"3\">La résistance est un composant de base qui s’oppose au passage du courant. On s’en sert pour limiter des courants maximums mais aussi pour d’autres choses.</td>\n</tr><tr><td>Résistance (entre 2.2 et 4.7 kOhm)</td>\n<td>2</td>\n</tr><tr><td>Résistance (10 kOhm)</td>\n<td>2</td>\n</tr><tr><td>Bouton Poussoir</td>\n<td>2</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369665.jpg\"/></td>\n<td>Un bouton poussoir sert à faire passer le courant lorsqu’on appuie dessus ou au contraire garder le circuit « éteint » lorsqu’il est relâché.</td>\n</tr><tr><td>Transistor (2N2222 ou BC547)</td>\n<td>2</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369664.png\"/></td>\n<td>Le transistor sert à plein de chose. Il peut être utilisé pour faire de l’amplification (de courant ou de tension) mais aussi comme un interrupteur commandé électriquement.</td>\n</tr><tr><td>Afficheur 7 segments (anode commune)</td>\n<td>2</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/345467.png\"/></td>\n<td>Un afficheur 7 segments est un ensemble de LEDs (cf. ci-dessus) disposées géométriquement pour afficher des chiffres.</td>\n</tr><tr><td>Décodeur BCD (CD4543BE)</td>\n<td>1</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369667.png\"/></td>\n<td>Le décodeur BCD (Binaire Codé Décimal) permet piloter des afficheurs 7 segments en limitant le nombre de fils de données (4 au lieu de 7).</td>\n</tr><tr><td>Condensateur (10nF/5V ou plus)</td>\n<td>2</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369673.jpg\"/></td>\n<td>Le condensateur est un composant de base. Il sert à plein de chose. On peut se le représenter comme un petit réservoir à électricité.</td>\n</tr><tr><td>Condensateur (1000µF 15V ou plus</td>\n<td>1</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/370226.png\"/></td>\n<td>Celui-ci est un plus gros réservoir que le précédent</td>\n</tr><tr><td>Potentiomètre linéaire (10 kOhm)</td>\n<td>1</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369668.png\"/></td>\n<td>Le potentiomètre est une résistance que l’on peut faire varier manuellement.</td>\n</tr><tr><td>LED RVB</td>\n<td>1</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/369672.jpg\"/></td>\n<td>Une LED RVB (Rouge Vert Bleu) est une LED permettant de mélanger les couleurs de bases pour en créer d’autres.</td>\n</tr><tr><td>Écran LCD alphanumérique</td>\n<td>1</td>\n<td><img alt=\"\" src=\"http://eskimon.fr/wp-content/uploads/tuto/385800.jpg\"/></td>\n<td>L’écran LCD alphanumérique permet d’afficher des caractères tels que les chiffres et les lettres. Il va apporter de l’interactivité à vos projets les plus fous !</td>\n</tr></tbody></table><h3>Les revendeurs</h3>\n<p>Je vous ai déjà donné le lien, vous pourrez trouver ces composants chez les revendeurs listés dans ce sujet du forum :</p>\n<div class=\"centre\"><a href=\"http://fr.openclassrooms.com/forum/sujet/les-meilleures-boutiques-d-electronique-90967\"><strong>Les meilleurs boutiques d’électronique</strong></a> Cliquez-ici</div>\n<h3>Les kits</h3>\n<p>Enfin, il existe des kits tout prêts chez certains revendeurs. Nous n’en conseillerons aucun pour plusieurs raisons. Tout d’abord, pour ne pas faire trop de publicité et rester conforme avec la charte du site. Ensuite, car il est difficile de trouver un kit « complet ». Ils ont tous des avantages et des inconvénients mais aucun (au moment de la publication de ces lignes) ne propose absolument tous les composants que nous allons utiliser. Nous ne voulons donc pas que vous reveniez vous plaindre sur les forums car nous vous aurions fait dépenser votre argent inutilement !</p>\n<div class=\"erreur\">Cela étant dit, merci de <strong>ne pas nous spammer de MP</strong> pour que l’on donne notre avis sur tel ou tel kit ! Usez des forums pour cela, il y a toujours quelqu’un qui sera là pour vous aider. Et puis nous n’avons pas les moyens de tous les acheter et tester leur qualité !</div>\n</div>\n</div>\n</div>\n<div class=\"conclusion\"/>\n</div>\n\n\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "fr-FR",
-        "reading_time": 17,
-        "domain_name": "eskimon.fr",
-        "preview_picture": "http://eskimon.fr/wp-content/uploads/tuto/385800.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 543,
-        "title": "Lenovo ThinkPad X1 Carbon Ultrabook Review",
-        "url": "http://www.notebookcheck.net/Lenovo-ThinkPad-X1-Carbon-Ultrabook-Review.138033.0.html",
-        "content": "<p class=\"align-justify\">The Lenovo X1 Carbon 3rd Gen is <strong>a beautiful machine</strong>. Much like the <a href=\"http://www.notebookcheck.net/Dell-XPS-13-9343-Touchscreen-Ultrabook-Review.135817.0.html\" target=\"_self\" class=\"internal-link\">Dell XPS 13</a> took the initiative to cram a 13-inch screen into an 11-inch form factor, the X1 Carbon sports dimensions that are more comparable to a typical 13-inch machine—and that includes its <strong>weight and thinness</strong>, both of which are <strong>indisputably manageable</strong>. It’s also <strong>practically designed</strong>; the <strong>matte black surfaces</strong> that comprise the majority of the case are minimalist and attractive, but they’re simultaneously haptically comfortable, with an <strong>unmistakably cool metal feel</strong> and a comfortable fit for use on both lap and desk. The case also feels fairly solid, though the incidence of flex and relative lack of torsion resistance in some regards gave us pause.</p>\n<p class=\"align-justify\">Perhaps more exciting, however, is <strong>what has improved over the <a href=\"http://www.notebookcheck.net/Review-Update-Lenovo-ThinkPad-X1-Carbon-Touch-20A7-002DGE-Ultrabook.113926.0.html\" target=\"_self\" class=\"internal-link\">X1 Carbon 2nd Gen</a></strong>. Criticism of the <a href=\"http://www.notebookcheck.net/Review-Update-Lenovo-ThinkPad-X1-Carbon-Touch-20A7-002DGE-Ultrabook.113926.0.html\" target=\"_self\" class=\"internal-link\">2nd Gen</a>’s radical (and arguably illogical) keyboard design and polarizing full-depression clickpad scared away many prospective buyers—as such fearlessly progressive and experimental design decisions generally don’t fit well with the business market, where practicality rules supreme. The Gen 3 wholeheartedly acknowledges these complaints and implements a complete reversal of those decisions. As a result, <strong>the keyboard</strong>—immediately familiar and accessible—<strong>is one of the absolute best we have ever used on an Ultrabook</strong>. Meanwhile, the <strong>three classic top-mounted physical buttons for use with the Trackpoint have returned</strong>, and the <strong>touchpad</strong> itself <strong>ditches the controversial full-click design</strong> in favor of a far more comfortable (and, in our judgment, reliable) clickpad approach. The end result is that the X1 Carbon Gen 3 <strong>features some of the best input devices we’ve tested on an Ultrabook</strong>.</p>\n<p class=\"align-justify\">What about performance? <strong>CPU performance differences between the <a href=\"http://www.notebookcheck.net/Review-Update-Lenovo-ThinkPad-X1-Carbon-Touch-20A7-002DGE-Ultrabook.113926.0.html\" target=\"_self\" class=\"internal-link\">2nd Gen</a> and 3rd Gen</strong> X1 Carbon models <strong>were essentially nil</strong> in our testing—for all intents and purposes, the machines are identical in this regard. However in GPU testing, we witnessed a notable speed boost—in some cases up to 19% better. As compared with other modern notebooks of its class, apart from some multi-core synthetic performance hiccups, <strong>the X1 Carbon 3rd Gen holds its own, both in terms of CPU/GPU and general system performance</strong>. The only final niggle here is the Samsung PM851 SSD, whose write speeds are conspicuously capped at around 250 MB/s.</p>\n<p class=\"align-justify\">While the leap to a Broadwell chipset and slightly larger battery seemed sure to promise improved <strong>battery runtimes</strong>, we were surprised to find throughout our testing that <strong>there wasn’t much of a difference at all</strong>. Our classic Wi-Fi Surfing Test produced a result <strong>only slightly better than that of the <a href=\"http://www.notebookcheck.net/Review-Update-Lenovo-ThinkPad-X1-Carbon-Touch-20A7-002DGE-Ultrabook.113926.0.html\" target=\"_self\" class=\"internal-link\">2nd Gen</a></strong>, and the revised Wi-Fi test we just recently implemented—which is more broad and aggressive and arguably closer to actual real-world usage patterns—recorded under five hours before the machine shut down. That’s hardly an impressive number on one hand given the 50 Wh battery and supposed enhanced efficiency, though it’s still likely to get most users through a typical trip unplugged, especially if more restrictive power savings options are employed. If longer battery life is a priority, we’d suggest taking a look instead at the <a href=\"http://www.notebookcheck.net/Dell-XPS-13-9343-Touchscreen-Ultrabook-Review.135817.0.html\" target=\"_self\" class=\"internal-link\">Dell XPS 13-9343</a> or the <a href=\"http://www.notebookcheck.net/Apple-MacBook-Air-13-MD761D-B-2014-06-Notebook-Review-Update.119805.0.html\" target=\"_self\" class=\"internal-link\">MacBook Air 13</a>.</p>\n<p class=\"align-justify\">Rounding out the list of considerations is an <strong>underwhelming screen</strong>, at least in terms of brightness, contrast, and color saturation—though we do most certainly appreciate the <strong>anti-glare display filter</strong> for both its diffusion of reflections and relative ease of cleaning. The X1 Carbon Gen 3 is also <strong>invariably cool and quiet</strong>, clearly favoring comfort over top-end performance (as we discovered during our stress testing of the device).</p>\n<p class=\"align-justify\">Summing up, the X1 Carbon Gen 3 is <strong>indisputably superior to its predecessor</strong>. Although some of these improvements come in the form of better GPU performance, cooler temperatures, and lower average system noise levels, the vast majority of them center on the thankful retreat from the experimental (and finicky) input devices of the Gen 2 design and back to sanity. This isn’t just a return to form, either; to reiterate, by our judgment, they are some of the best input devices on any Ultrabook we’ve tested to date.  But in spite of this self-improvement, <strong>how does the X1 Carbon compare with its modern competitors</strong>? In truth, though it’s a compelling option, <strong>it’s lost some ground since our last encounter</strong>. While notebooks such as the <a href=\"http://www.notebookcheck.net/Apple-MacBook-Air-13-MD761D-B-2014-06-Notebook-Review-Update.119805.0.html\" target=\"_self\" class=\"internal-link\">MacBook Air 13</a> and (especially) the <a href=\"http://www.notebookcheck.net/Dell-XPS-13-9343-Touchscreen-Ultrabook-Review.135817.0.html\" target=\"_self\" class=\"internal-link\">Dell XPS 13-9343</a> have sprinted forward with such massive improvements in portability, battery life, and LCD quality, the X1 Carbon 3rd Gen has only marginally improved, mostly regaining footing it’s lost elsewhere. It’s <strong>still a strong contender</strong>, and it’s <strong>certainly the best Carbon to date</strong>, but especially at a <strong>pricey $1,574</strong>, we fear that its inability to innovate further may relegate it to the shadows of these more aggressive contenders.</p>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 3,
-        "domain_name": "www.notebookcheck.net",
-        "preview_picture": "http://www.notebookcheck.net/fileadmin/Notebooks/Lenovo/ThinkPad_X1_Carbon_2015/x12015.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 0,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 541,
-        "title": "Visitons le Château de Landsberg !",
-        "url": "http://autour-du-mont-sainte-odile.overblog.com/2016/01/visitons-le-chateau-de-landsberg.html",
-        "content": "<p class=\"c1\">Situé au dessus de Heiligenstein et de Barr, à mi-hauteur de la montée vers plateau de la Bloss, le château de Landsberg est un but de promenade apprécié des randonneurs et des amateurs de vieilles pierres. Posé sur un éperon de granite, visible de loin, la forteresse médiévale domine fièrement la plaine d’Alsace.</p>\n<p class=\"c1\"><img alt=\"Visitons le Château de Landsberg !\" class=\"ob-cell ob-img ob-media c2\" src=\"http://img.over-blog-kiwi.com/0/28/39/78/20160128/ob_e68986_2.jpg\"/></p>\n<h3>Le château primitif</h3>\n<p class=\"c1\">Fin du onzième siècle, <strong><a href=\"http://autour-du-mont-sainte-odile.overblog.com/2014/01/l%E2%80%99assassinat-de-philippe-de-souabe.html\">Philippe de Souabe et Otton de Brunswick</a></strong> se disputent le trône impérial. Philippe, tenant des Hohenstaufen, veut conforter la puissance des couvents du <strong>Mont Sainte Odile.</strong> Il s’appuie sur un de ses représentants pour construire une nouvelle forteresse sur le Mont. <strong>Conrad de Vinhege</strong> érige le château de Landsberg dont sa famille prendra bientôt le nom. Nous sommes en 1197-1198. Le burg est construit sur les terres de l’<strong>abbaye de Niedermunster</strong>, le Couvent du Bas du Mont Sainte Odile. Un acte est signé de l’Abbesse <strong>Edelinde</strong>, il est daté du 23 juin 1200, il confirme la cession du terrain au chevalier Conrad.<br/>Nous avons publié le <a href=\"http://autour-du-mont-sainte-odile.overblog.com/2015/01/edelinde-et-le-chateau-de-landsberg.html\"><strong>texte de l’abbesse Edelinde</strong></a>, l’an passé. (cliquez sur le lien)<br/>Ce premier château n’avait pas l’importance des ruines que nous pouvons admirer aujourd’hui. Il ne comportait qu’un donjon et un corps de logis, complété par une basse-cour. Commençons la visite des ruines par cette partie. Le <strong>donjon</strong> est construit sur un carré de dix mètres de côté. Puissant, placé en diagonale par rapport au corps de logis, il formait bouclier pour défendre celui-ci du côté de la plaine, au nord-est. En levant la tête, le visiteur découvre l’accès : une porte haute, qui était accessible par un pont volant à partir de l’étage du logis seigneurial. Tout en haut du donjon, on distingue encore les corbeaux qui portaient les hourds. Les hourds, constructions de bois, ancêtres des mâchicoulis, permettaient aux défenseurs de surplomber les assaillants du château.<br/><img alt=\"Visitons le Château de Landsberg !\" class=\"ob-cell ob-img ob-media c3\" src=\"http://img.over-blog-kiwi.com/0/28/39/78/20160128/ob_d6d5c7_litho.jpg\"/>Le <strong>logis seigneurial</strong> comportait un rez-de-chaussée dédié à l’usage domestique : cuisines, citerne, salle des gardes. Ces pièces basses n’étaient éclairées que par quelques meurtrières. Le premier étage était l’habitation de Conrad et de ses successeurs : la façade nord-est est largement éclairée par quatre <strong>baies géminées</strong> en plein-cintre. Les fenêtres doubles sont séparées par de fines colonnes et surmontées d’élégants occuli. Au sud-est, deux doubles baies et un <strong>magnifique oriel</strong> agrémentent la façade. Situé sur le coté de la porte du château, cet élément de décor est le plus frappant du site du Landsberg, un genre d’échauguette semi-cylindrique, portée par un cul de lampe conique. Nous serions là dans la chapelle castrale du Landsberg. Coté extérieur, deux petites sculptures ornent la base de l’oriel : une fleur de lys et un petit personnage accroupi. A l’intérieur, une frise d’arceaux délimite les petites fenêtres du chœur de la chapelle. L’une d’elles a la forme d’une croix. Admirez la finesse des dessins du chapiteau de la colonne toujours en place au droite de l’oriel !<br/>Le château de Landsberg est situé à la limite géologique des grès, prédominants au nord, et des granites d’Andlau, côté sud. Les bases et les assises de la forteresse sont en granite, roche dure extraite du fossé creusé au nord, par les carriers du moyen âge. Les parties hautes sont en grès rose du Maennelstein, plus facile à travailler.</p>\n<h3 class=\"c4\">Le château neuf</h3>\n<p class=\"c1\">Ce premier château était, somme toute, de dimensions modestes. Quelques dizaines d’ années plus tard, preuve de l’importance des couvents du Mont Sainte Odile et signe de la puissance croissante de la famille de Landsberg, le site fut agrandi de façon conséquente. Nous sommes alors en 1240-1250.<br/>L’extension se fait au nord-ouest. Les deux tours rondes et l’imposante courtine délimitent l’emprise du Château Neuf. A l’origine, cette nouvelle enceinte était détachée du vieux burg, les deux sites ne furent rattachés que postérieurement. Les <strong>tours circulaires</strong> mesurent environ sept mètres de diamètre. Leur sommet portaient des créneaux. Un <strong>chemin de ronde</strong> surmontait la courtine : il était garni de hourds et traversait les deux tours. Archères et bretèches sont toutes orientées au nord, côté montagne, là où le risque d’attaque était le plus grand.<br/>Deux corps de logis se partageaient le site. Au sud, le bâtiment ne comportait qu’un seul étage, éclairé au sud-ouest par des fenêtres à banquettes, aujourd’hui murées. Le deuxième bâtiment, côté nord, fut construit plus tard. Composé de deux étages, il communiquait directement avec la tour nord.<br/>L’ensemble a connu plusieurs remaniements au cours des siècles.</p>\n<p class=\"c1\"><img alt=\"Visitons le Château de Landsberg !\" class=\"ob-cell ob-img ob-media c5\" src=\"http://img.over-blog-kiwi.com/0/28/39/78/20160128/ob_0861df_11.jpg\"/></p>\n<h3 class=\"c4\">Les extensions du XVème et du XVIème siècles</h3>\n<p class=\"c1\">L’apparition des <strong>armes à feu</strong> modifie l’art de la guerre. La géométrie des châteaux doit s’adapter aux armes nouvelles : résister aux boulets et accueillir couleuvrines et canons. Tous les châteaux des Vosges n’ont pas connu cette évolution, certains, trop solitaires, trop isolés, ont été abandonnés dés cette époque. Au Landsberg, les seigneurs ont respecté le vieux burg dans sa forme initiale, mais ils l’ont adapté tout d’abord en renforçant ses murs, puis en l’entourant de nouvelles murailles. Au nord, le château neuf se voit délaissé, ses nombreuses ouvertures extérieures sont murées, à part les archères, bien entendu. Ses courtines sont prolongées pour assurer la continuité avec celles du vieux burg. Un <strong>puissant bastion</strong> est construit au sud-est. Les armes nouvelles sont mises en place : couleuvrines, poivrière portant une canonnière protégée par des vastes vantaux. Ainsi, un vaste glacis s’étend devant la forteresse. C’est en faisant le tour du château dans les fossés que le promeneur se rendra le mieux compte de la force de la place et de son adaptation aux débuts de l’artillerie.<br/><img alt=\"Visitons le Château de Landsberg !\" class=\"ob-cell ob-img ob-media c6\" src=\"http://img.over-blog-kiwi.com/0/28/39/78/20160128/ob_57b020_plan-schematique.png\"/>Quelques temps, le château est passé des Landsberg au Comte Palatin, avant de revenir à la famille qui resta maître des lieux jusqu’à la Révolution.<br/>On ne trouve guère de textes relatant l’histoire du château de Landsberg dans les temps troublés que connut l’Alsace. Lors de la <strong>Guerre du Bundschuh</strong>, les paysans révoltés s’étaient installés dans la prévôté de Truttenhausen, toute proche. Cependant, rien ne dit que les Rustauds aient attaqué le château. Lors de la <strong>Guerre de Trente Ans</strong>, il semble que les troupes de Mansfeld, puis les Suédois se soient plutôt attaqués aux riches villes de la plaine, comme Obernai, oubliant les forteresses de montagne, déjà devenues inutiles. Cependant, le château est décrit comme ruiné au milieu du XVIIème siècle.<br/>Depuis longtemps, les Landsberg avaient délaissé le burg de leurs ancêtres pour lui préférer leur <strong>résidence de Niedernai</strong>, située en plaine. Le château fut confié à des gardes, puis servit de ferme. Aujourd’hui, les ruines du Landsberg sont une propriété privée. Merci à vous de respecter le site.</p>\n<p class=\"c1\">Dans la basse cour du château fleurit au printemps, l’<strong>éranthe d’hiver</strong>. Sa floraison ne dure que quelques jours. Cette petite fleur jaune est rare sous nos climats. De son nom latin ‘Eranthis hyemalis’, l’éranthe est originaire d’Italie ou de Turquie. La légende nous dit qu’elle aurait été rapportée des croisades par un sire de Landsberg. Elle serait un remède à la mélancolie.</p>\n<h3 class=\"c4\">Promenade et accès au château de Landsberg<img alt=\"Visitons le Château de Landsberg !\" class=\"ob-cell ob-img ob-media c7\" src=\"http://img.over-blog-kiwi.com/0/28/39/78/20160128/ob_902c3e_org.jpg\"/></h3>\n<p class=\"c1\">Les automobilistes pourront garer leur véhicule sur le petit parking situé à l’ouest d’Heiligenstein. Ils gagneront Truttenhausen sur la petite route à travers prés. Un sentier du Club Vosgien ( disque bleu ) monte vers les ruines.<br/>Les marcheurs préfèreront effectuer une boucle à partir de Saint-Jacques, par exemple. Saint-Jacques, Kapellenhausfelsen, Ameisenberg, Landsberg ( balisage : triangle bleu ) avec un retour sur Saint-Jacques par le sentier sans dénivelé ( rectangle : bicolore rouge et blanc).<br/>A moins qu’ils ne préfèrent rechercher les pierres sculptées du <a href=\"http://autour-du-mont-sainte-odile.overblog.com/des-chameaux-en-alsace\"><strong>Chemin des Chameaux</strong></a>. (cliquez sur le lien ), ou découvrir la <a href=\"http://autour-du-mont-sainte-odile.overblog.com/2015/07/la-chapelle-de-frere-leon-pres-de-barr.html\"><strong>Chapelle du Frère Léon</strong></a> dans la vallée de la Kirneck.</p>\n<h3 class=\"c4\">Illustrations</h3>\n<ul><li class=\"c8\">Photographies du château de Landsberg ( BrR, FrP et PiP)</li>\n<li class=\"c8\">Schéma des ruines ( PiP)</li>\n<li class=\"c8\">L’Orgueil, Herrade de landsberg, Hortus Deliciarum</li>\n<li class=\"c8\">Les Ruines du Landsberg, aquarelle de Osterwald, 1873</li>\n</ul>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "fr",
-        "reading_time": 7,
-        "domain_name": "autour-du-mont-sainte-odile.overblog.com",
-        "preview_picture": "http://img.over-blog-kiwi.com/0/28/39/78/20160128/ob_68f59d_12.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 454,
-        "title": "Contrer les stéréotypes par les livres : “C'est dès l'enfance qu'ils se construisent”",
-        "url": "https://www.actualitte.com/article/monde-edition/contrer-les-stereotypes-par-les-livres-c-est-des-l-enfance-qu-ils-se-construisent/64058",
-        "content": "<br/><h2><strong>Même dans l'espace jeunesse d'un immense salon littéraire, difficile de passer à côté du livre de coloriage féministe — et fier de l'être — de la maison d'édition Goater. Cette structure atypique, adossée à un bar de Rennes, Le Papier-Timbré, propose des titres tout aussi uniques, de ces livres que l'on devine importants avant même de les ouvrir. </strong></h2>\n\n<p class=\"c3\"><img alt=\"Livre Paris 2016\" src=\"https://farm2.staticflickr.com/1650/25284788384_ea234db7b9_z.jpg\" class=\"c2\"/></p>\n<p class=\"c3\">Judikael et Jean-Marie Goater (ActuaLitté, CC BY SA 2.0)</p>\n\n\n<p class=\"p1\">Le Papier-Timbré et les éditions Goater avancent main dans la main, dans une même structure, depuis 2009. En plus de la licence IV, permis de publier : « <em>On est très occupé par les soirées étudiantes et festives, mais on développe en plus des projets autour des livres qui, parfois, émergent d'ailleurs avec la clientèle. C'est surtout un motif supplémentaire pour se retrouver et partager des moments de convivialité, partager des goûts, des envies, de la littérature, des essais et de la jeunesse</em> », explique Jean-Marie Goater.</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">En plus de la production maison, le café-librairie propose celle de maisons soeurs : les éditions de juillet, L'Oeuf, les Éditions Pontcerq, essentiellement des petits éditeurs de Rennes et de la Bretagne. La maison est diffusée et distribuée en Bretagne par Coop Breizh, diffusé par Hobo Diffusion, distribué par Makassar pour la France (comme <a href=\"https://www.actualitte.com/article/monde-edition/avec-les-editions-prairial-le-surrealisme-nrv-est-de-retour/64055\">les éditions surréalistes Prairial</a>). Les tirages vont de 500 exemplaires à 3000 sauf exceptions et coéditions comme <em>Détachez vos ceintures</em>, projet collectif des éditions du Kyste contre l'aéroport de Notre-Dame-des-Landes, ou <em>Galette-saucisse, je t’aime !</em> de Benjamin Keltz, avec les Éditions du coin de la rue.</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\"><em>Mon premier cahier de coloriage féministe !</em> sera en librairie d'ici quelques jours, et la maison Goater y croit dur comme fer : « <em>Nous avons commencé par traduire et adapter</em> C'est quoi ton genre ?<em>, un livre écrit par Jacinta Bunnell et publié par l'éditeur anarchiste américain PM Press</em> », explique Jean-Marie Goater. Dans les pages du livre, on croise des monstres qui aiment les petits sacs à main et les chaussures, des princesses qui ne suivent pas vraiment le dress code, ou des enfants en fauteuil roulant, encore rares dans les livres jeunesse.</p>\n<p class=\"p1\"> </p>\n<p class=\"p1 c3\"><img alt=\"Livre Paris 2016\" src=\"https://farm2.staticflickr.com/1628/25822534701_142d157b15_z.jpg\" class=\"c2\"/></p>\n<p class=\"p1 c3\">(ActuaLitté, CC BY SA 2.0)</p>\n<p class=\"p1 c3\"> </p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Après cette publication, la maison a souhaité développer un projet en France, en réunissant 16 dessinatrices dont 4 dessinateurs pour leur proposer d'expliquer le féminisme aux enfants, à travers un dessin. « <em>Le livre aborde la vie à l'école, les habillements, les métiers, le sport, mais aussi les quelques femmes féministes importantes de l'histoire... Ça reste ludique et sans prétention encyclopédique sur le féminisme, mais il est plus simple d'aborder le sujet avec un support comme celui-ci à la maison, à l'école ou au centre de loisirs.</em> » Comme le précédent, l'ouvrage présente d'une nouvelle manière les situations traditionnelles des livres de coloriage ou jeunesse.</p>\n<p class=\"p1\"> </p>\n<h3 class=\"p1\"><strong>Des ressources rares, des besoins importants</strong></h3>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Pas la peine d'insister pour que Jean-Marie Goater partage son avis : « <em>La production majoritaire est quand même très caricaturale et stéréotypée, cependant on remarque depuis quelques années des éditeurs intéressants qui essaient de bousculer un peu ces stéréotypes comme La Ville Brûle, ou encore l'édition LGBT qui commence à arriver avec Des ailes sur un tracteur qui a publié un cahier de coloriage avec Sophie Labelle, plutôt sur les questions trans.</em> »</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Contrairement à ce que les détracteurs des livres jeunesse atypiques prétendent (<a href=\"https://www.actualitte.com/recherche?q=tous+a+poil+cope\">coucou, Jean-François Copé</a>), lutter contre les stéréotypes n'a rien d'une guerre de civilisation ou autre affabulation du genre. Il s'agit simplement de montrer que chacun doit être fier de ce qu'il est, respecter ce que l'autre est, et ne pas chercher l'assentiment des uns ou des autres. « <em>Fuck the world</em> », comme dirait 2Pac... « <em>Se poser ces questions est indispensable, il faut qu'il y ait ce débat : les enfants ne sont pas si naïfs que ça, ils ont besoin de se poser ce genre de questions.</em> »</p>\n<p class=\"p1\"> </p>\n<p class=\"p1 c3\"><img alt=\"Livre Paris 2016\" src=\"https://farm2.staticflickr.com/1554/25284764604_1d8b3e9a0a_z.jpg\" class=\"c2\"/></p>\n<p class=\"p1 c3\">(ActuaLitté, CC BY SA 2.0)</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Judikael, venu aider son père, acquiesce : il a répondu à l'appel à dessins et proposé une activité dans le cahier de coloriage féministe. « <em>Ce genre de ressources pour enfant est important, parce que c'est dès l'enfance que se construisent certains préjugés, certains stéréotypes qui restent ensuite. Quand on voit que 90 % des personnes présentes dans les manuels scolaires sont des hommes par exemple, ce genre d'ouvrages permet à certaines personnes de se reconnaître davantage dans certains rôles, qu'on ne leur attribue pas forcément de base.</em> »</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Là est la lutte, résumée par Judikael : « <em>On parle souvent de</em> “déconstruire” <em>dans le féminisme, les préjugés ou autre, ces livres peuvent permettre d'éviter de les construire.</em> » En Terminale L, Judikael confirme que les préjugés sont toujours présents, forcément surtout en sport ou vis-à-vis de « <em>la filière homme</em> » (comprendre, la filière scientifique) et de « <em>la filière femme </em>» (comprendre, la filière littéraire). Si l'histoire du féminisme est désormais abordée en classe, certains sujets restent touchy : le journal du lycée s'est vu censurer un article sur la culture du viol, et la ségrégation hommes-femmes, « <em>au prétexte que c'était trop hard, que les lycéens n'allaient pas comprendre </em>»...</p>\n<p class=\"p1\"> </p>\n<h3 class=\"p1\"><strong>« <em>L'édition, c'est un milieu qui est quand même très hypocrite</em> »</strong></h3>\n<p class=\"p1\"> </p>\n<p class=\"p1\">À votre avis, comment réagit l'éditeur de <em>Mon premier cahier de coloriage féministe</em> lorsqu'on lui parle des différences entre les salaires <a href=\"https://www.actualitte.com/article/monde-edition/l-inegalite-entre-hommes-et-femmes-persiste-dans-le-monde-du-livre/63891\">des hommes et des femmes dans l'édition</a>, ou dans les aides attribuées par le CNL ? Sans langue de bois : « <em>C'est pas trop surprenant malheureusement, parce que c'est à l'image des autres professions. En tant que bar-maison d'édition, de toute façon, je ne rentre pas dans la case du CNL, je me tourne plutôt vers la région</em> », explique Jean-Marie Goater.</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Haut les coeurs : « <em>C'est pas grave, je m'en passe très bien. L'édition, c'est un milieu qui a quand même une grande dimension d'hypocrisie sur pas mal d'aspects, on le voit sur certaines pratiques... Il y a des cons dans ce métier-là comme dans d'autres métiers, mais je pense que ce serait bien de faire le ménage, comme à Angoulême, c'est quand même criant. Dans certains secteurs du livre, la majorité des lecteurs sont des lectrices, très clairement, ce serait quand même la moindre des choses qu'il n'y ait pas des inégalités de ce type qui existent dans le monde de l'édition.</em> »</p>\n<p class=\"p1\"> </p>\n<p class=\"p1 c3\"><img alt=\"Livre Paris 2016\" src=\"https://farm2.staticflickr.com/1672/25796714772_315ae8c648_z.jpg\" class=\"c2\"/></p>\n<p class=\"p1 c3\">Un album jeunesse bilingue français-langue des signes (ActuaLitté, CC BY SA 2.0)</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Même sans aide du CNL, les éditions Goater produisent de quoi lire : <em>Les Joyeux Punks</em>, un album à compter, mais aussi une collection d'albums bilingues français-langue des signes, des livres en breton, dont une traduction du <em>Persepolis</em> de Marjane Satrapi. Pour les amateurs de polar, Goater noir, une collection de 14 titres qui a notamment fait revivre <em>Le Soviet</em>, la série culte des années 89-90 d'abord publiée chez Fleuve Noir et Série Noire. Pour les amateurs des écrits du Colonel Durruti, un inédit est prévu pour le mois d'octobre prochain.</p>\n<p class=\"p1\"> </p>\n<p class=\"p1\">Perdez-vous sans hésiter dans le catalogue de la maison, qui propose aussi de la littérature blanche \"classique\", des essais sur l'écologie et le convivialisme ou la convivialité, l'écologie sociale, et l'Histoire, surtout XXe.</p>\n\n<br/>",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 6,
-        "domain_name": "www.actualitte.com",
-        "preview_picture": "//cdn.actualitte.com/images/facebook/25284788384-ea234db7b9-z-56eeff88c23a0.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 99,
-        "title": "[ROM][6.0.1][Layers][N5] TipsyOS official builds {UBER TCs}",
-        "url": "http://forum.xda-developers.com/google-nexus-5/development/rom-tipsyos-official-builds-uber-tcs-t3325989",
-        "content": "<div class=\"post-text post-first-post\" id=\"post_message_65589573\" readability=\"82\">\n<div class=\"c16\" readability=\"51\"><img src=\"http://imagizer.imageshack.us/v2/640x480q90/673/zEwXs9.png\" border=\"0\" alt=\"\" title=\"\"/><p><span>*Welcome to Tipsy OS*</span></p>\n<div class=\"c16\"><img src=\"http://imagizer.imageshack.us/v2/1024x768q90/922/uy7Jf6.png\" border=\"0\" alt=\"\" title=\"\"/></div>\n<br/><span>This is something Martin Coulon (@martinusbe) started in his 'free' time when waiting for GZR Validus or Tesla builds and having some drinks.<br/>He just started with a slim base; on lp and early mm, and now using <a href=\"https://github.com/AOSPB\" target=\"_blank\" rel=\"nofollow\"><strong class=\"c17\"><span>AOSPB</span></strong></a> as a base (wich Martin is also a part of)....then added what we thought useful.<br/>It grew up to be a fully functional Rom<br/>The main goal is to keep it AOSPB/Slim based and will not add any cm features unless AOSPB/Slim does.<br/></span>\n<p>TipsyOS is Black and Yellow default themed, we don't like white UI, so it may look a bit weird on light switch,<br/>but heh! use layers to suit it your needs =)</p>\n<p>We are a team wich is constantly learning and ...drinking because both gets along so well hahaha <img src=\"http://forum.xda-cdn.com/images/smilies/laugh.gif\" border=\"0\" alt=\"\" title=\"Laugh\" class=\"inlineimg\"/></p>\n<p>Just report the bugs and request features, we'll see what we can do!.......</p>\n<p><strong>And don't get it twisted</strong>, its not because we're Tipsy that this project is not a serious one, try it and feel speed and stability <img src=\"http://forum.xda-cdn.com/images/smilies/tongue.gif\" border=\"0\" alt=\"\" title=\"Stick Out Tongue\" class=\"inlineimg\"/></p>\n<p>My builds are compiled with UBER toolchains 4.9 on both rom and kernel code.<br/>We can go over with 5.2/3, 6 ...but to be really honest, 4.9 is the most battery friendly in my opinion, and is still super smooth and snappy!</p>\n<p>Im using a cm device tree base a bit modified...<br/>This rom includes a custom kernel, cm was my base, and i have decided to go a bit wild and cherry-picked up <em>some</em> stuff from:<br/>Francisco Franco, Chet Kener, Faux123, Flar2, Hellsgod and some others<br/>So a <strong class=\"c17\">huge thanks</strong> for them and their AWESOME open sources work!<br/>I will continue to work on this kernel because its fun <img src=\"http://forum.xda-cdn.com/images/smilies/laugh.gif\" border=\"0\" alt=\"\" title=\"Laugh\" class=\"inlineimg\"/></p>\n<div class=\"c16\" readability=\"8\"><img src=\"http://imagizer.imageshack.us/v2/1024x768q90/923/nPeHiF.png\" border=\"0\" alt=\"\" title=\"\"/><p><strong><em><span>For cool wallpapers, test builds, requests; join us on our community!</span></em></strong></p>\n</div>\n<strong class=\"c17\"><span><a href=\"https://plus.google.com/u/0/communities/114022867167626892613\" target=\"_blank\" rel=\"nofollow\"><span>Google+ Community</span></a></span></strong>\n<div class=\"c16\"><strong class=\"c17\"><span>Features:</span></strong>\n<div class=\"c20\">\n<p>Code:</p>\n<pre class=\"alt2 c19\" dir=\"ltr\">\nWe slowly adding only what we need, we don't want a 1236544547 features rom...\n\"The Tavern\":\nPower menu customisations\nToasts/ListView/System animations\nBattery bar\nLCD Density\nGesture Anywhere\nExpanded Desktop\nStatus bar customisations\nAosp Recents and OmniSwitch \nBuilt in:\nDashboard (settings) columns selector\nDashboard lines remover\nSlim Navbar customisation\nVolume steps\nNotification led changer\nHeadsUp switch\nKernel Adiutor app\nLayers manager app\nLayers backup/restore app\nAdaway\nNova launcher\nViper4Android\nES Manager\nSnapCam\nChangelog generator in about phone menu....\nand prolly some other stuff that i can't remember but heh,\n just flash dat sh#t to figure out by yourself =)\n</pre></div>\n</div>\n<p><span><br/><span class=\"c12\">Installation Instructions</span><br/></span></p>\n<p><span>1. Make sure you have a working recovery and a nandroid backup</span></p>\n<p><span>2. Download the ROM.</span></p>\n<p><span>3. Reboot to recovery.</span></p>\n<p><span>4.Wipe everything! system/data/cache partitions (except internal storage indeed!)</span></p>\n<p><span>7. Flash the ROM.</span></p>\n<p><span><em>Optional- Flash 6.x GApps.</em></span></p>\n<p><span>8. Reboot and feel Tipsy!</span></p>\n<p><strong class=\"c17\"><span>Download:</span></strong></p>\n<p><span><a href=\"https://www.androidfilehost.com/?w=files&amp;flid=48392\" target=\"_blank\" rel=\"nofollow\"><strong class=\"c17\"><span>Tipsy HammerHead downloads folder</span></strong></a></span></p>\n<p><span>STAY TIPSY <img src=\"http://forum.xda-cdn.com/images/smilies/wink.gif\" border=\"0\" alt=\"\" title=\"Wink\" class=\"inlineimg\"/><img src=\"http://forum.xda-cdn.com/images/smilies/laugh.gif\" border=\"0\" alt=\"\" title=\"Laugh\" class=\"inlineimg\"/></span><br/><img src=\"http://imageshack.com/a/img924/6871/q1zjrl.gif\" border=\"0\" alt=\"\" title=\"\"/></p>\n<p><span><strong>TipsyOs, a ROM for Nexus 5 aka Hammerhead</strong></span></p>\n</div>\n<br/><strong class=\"c17\"><span>Kernel features:</span></strong><br/>Kexec patch for multirom support, intelliplug, hellsactive governor, extra io schedulers, intellithermal v2, etc etc and growing, just check commits on history on the link below\n<p><strong class=\"c17\"><span>Known bugs:</span></strong><br/>quick tiles may be a bit messy while re arranging them....<br/>u tell me then.</p>\n<p><span>don't even think to report a bug with:</span><br/>a dirty flashed rom,<br/>xposed frameworks installed,<br/>all of your apps installed, if u have a bug, clean flash the build, (flash the gapps if needed) and reproduce your bug without any data restore.<br/>BRING BACK LOGCAT or u will be simply ignored....</p>\n<p><strong class=\"c17\">Contributors</strong><br/><a href=\"http://forum.xda-developers.com/member.php?u=4139665\" target=\"_blank\">martinusbe</a><br/>@<a href=\"http://forum.xda-developers.com/member.php?u=5265704\" target=\"_blank\">Alx31</a><br/><strong>ROM OS Version:</strong> 6.0.1 Marshmallow<br/><strong>ROM Kernel:</strong> Linux 3.4.x<br/><strong>Based On:</strong> AOSPB</p>\n<p><strong class=\"c17\">Version Information</strong><br/><strong>Status:</strong> Stable<br/><strong>Created</strong> 2016_29_02</p>\n<p><strong class=\"c17\">Credits:</strong><br/>AOSPB/Slim team for an amazing base, Google, CyanogenMod for device trees and some other repos, Dirty Unicorns/CrDroid/AICP and other roms with their open sources i may have forgotten...</p>\n<p><strong class=\"c17\">Rom code:</strong> <a class=\"c21\" href=\"https://github.com/TipsyOs\" target=\"_blank\" rel=\"nofollow\">https://github.com/TipsyOs</a><br/><strong class=\"c17\">Device:</strong> <a class=\"c21\" href=\"https://github.com/TipsyOs-Devices/device_lge_hammerhead/commits/6.0\" target=\"_blank\" rel=\"nofollow\">Hammerhead commits history</a><br/><strong class=\"c17\">Kernel code:</strong> <a class=\"c21\" href=\"https://github.com/TipsyOs-Devices/kernel_lge_hammerhead/commits/6.0\" target=\"_blank\" rel=\"nofollow\">Kernel commits history</a><br/><strong class=\"c17\">My github:</strong> <a class=\"c21\" href=\"https://github.com/Alx31\" target=\"_blank\" rel=\"nofollow\">https://github.com/Alx31</a></p>\n<p><img src=\"http://imagizer.imageshack.us/v2/640x480q90/901/JGwVTy.png\" border=\"0\" alt=\"\" title=\"\"/></p>\n</div><p>Last edited by Alx31; 29th February 2016 at 10:48 PM.</p>",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 3,
-        "domain_name": "forum.xda-developers.com",
-        "preview_picture": "http://cdn3.xda-developers.com/images/xda-facebook-default.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 0,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 98,
-        "title": "Top 15 Podcasts All Web Developers Should Follow - Envato Tuts+ Code Article",
-        "url": "http://code.tutsplus.com/articles/top-15-podcasts-all-web-developers-should-follow--net-14461",
-        "content": "<p>As web developers, we’re always trying to get better at what we do. One of the best ways to do that is to listen to what other developers have to share. And even if you’re not learning, it’s still fun to hear what other devs are talking about. Today, I’ll share 15 podcasts that you should definitely check out.</p>\n<hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/yahootheater.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/yahootheater.png\"/></div>\n<p>It seems that as often as a few times a month, Yahoo! brings in developers on the cutting edge of web technology to keep their employees up to date. For the benefit of the rest of us, these talks are recorded and published. You’ll find well-known devs like Douglas Crockford and NNicolas Zakas, and talks on everything from performance and accessibility to JavaScript and the DOM.</p>\n<ul><li><a href=\"http://itunes.apple.com/us/podcast/yui-theater/id263846173\">iTunes Feed</a></li>\n<li><a href=\"http://feeds.yuiblog.com/yuiblog/yui-theater\">RSS Feed</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/devshow.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/devshow.png\"/></div>\n<p>This may be my favourite show from this list. The Dev Show, hosted weekly by Dan Benjamin and Jason Seifer, will give you a carefully curated set of development-related links (usually with a web dev slant) to enjoy. As an added bonus, you can <a href=\"http://live.5by5.tv\">watch the show live</a> on Tuesdays at 1pm EST.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=352611845\">iTunes Feed (Audio)</a></li>\n<li><a href=\"http://feeds.feedburner.com/thedevshow\">RSS Feed (Audio)</a></li>\n<li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=374004076\">iTunes Feed (Video)</a></li>\n<li><a href=\"http://feeds.feedburner.com/devshowvideo\">RSS Feed (Video)</a></li>\n<li><a href=\"http://twitter.com/devshow\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/changelog.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/changelog.png\"/></div>\n<p>The tagline for the Changelog says it all: “Open Source moves fast. Keep up.” This podcast, and the accompanying blog, is all about keeping you updated with the latest in Open Source Technology. It’s hosted by Adam Stacoviak and Wynn Netherland, and seems to be the official Github podcast.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=341623264&amp;subMediaType=Audio\">iTunes Feed</a></li>\n<li><a href=\"http://feeds.feedburner.com/thechangelog\">RSS Feed</a></li>\n<li><a href=\"http://twitter.com/changelogshow\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/jquerypodcast.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/jquerypodcast.png\"/></div>\n<p>If you’re familiar with jQuery (and you probably are), you know there’s a podcast to go with it. Each week, hosts Ralph Whitbeck and Rey Bango bring you the latest in jQuery news, as well as great interviews with important people in the jQuery community. You can listen in to the jQuery wisdom of people like Remy Sharp, Yehuda Katz, Cody Lindley, and our own Jeffrey Way, among so many others.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=339835419\">iTunes Feed</a></li>\n<li><a href=\"http://feeds.feedburner.com/jQueryPodcastShowNotes\">RSS Feed</a></li>\n<li><a href=\"http://www.twitter.com/jquerypodcast\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/sitepoint.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/sitepoint.png\"/></div>\n<p>Sitepoint is a great resource for anyone interesting in technology, design, and even business. Books, courses, forums, blogs, articles, they’ve got it all. Of course, there’s a podcast too: check it out to find out what’s going on in the web industry.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=296180681&amp;s=143441\">iTunes Feed</a></li>\n<li><a href=\"http://www.sitepoint.com/blogs/?feed=podcast\">RSS Feed</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/webpulp.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/webpulp.png\"/></div>\n<p>According to the site, WebPulp is “a podcast about technology that powers the web.” In each podcast, host Josh Owens interviews someone from behind the scenes of a well-known webapp; you’ll find out what hardware and software it takes to run apps like the 37signals apps, or GitHub.</p>\n<ul><li><a href=\"http://itunes.apple.com/us/podcast/webpulp-tv/id371328694\">iTunes Feed</a></li>\n<li><a href=\"http://webpulp.tv/rss\">RSS Feed</a></li>\n<li><a href=\"http://twitter.com/webpulptv\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/wordpresspodcast.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/wordpresspodcast.png\"/></div>\n<p>It’s pretty apparent that both Nettuts+ readers and writers are big fans of WordPress. If you can’t get enough WordPress goodness, you’ll probably want to sign up for the WordPress Podcast, “a weekly podcast with news, interviews and plugin tips.” There’s a bonus here: one of the most recent interviewees was none other than Collis Ta’eed, CEO of Envato.</p>\n<ul><li><a href=\"http://itunes.apple.com/us/podcast/wordpress-community-podcast/id164651619\">iTunes Feed</a></li>\n<li><a href=\"http://wp-community.org/feed/\">RSS Feed</a></li>\n<li><a href=\"http://twitter.com/wppodcast\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/eepodcast.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/eepodcast.png\"/></div>\n<p>If you’re a user of Ellis Lab’s Expression Engine, you’ll enjoy the EE Podcast (Ellis Lab is the company behind CodeIgniter; in fact, EE is build completely on CI). Each week, Ryan Irelan and Lea Alcantara will fill in you on a certain aspect of of EE deveopment.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=334063423\">iTunes Feed</a></li>\n<li><a href=\"http://feeds.feedburner.com/eepodcast\">RSS Feed</a></li>\n<li><a href=\"http://twitter.com/eepodcast\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/csstricks.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/csstricks.png\"/></div>\n<p>If you’re a web developer, you’re probably pretty familiar with Chris Coyier’s website <a href=\"http://www.css-tricks.com\">CSS Tricks</a>. Besides his excellent articles, Chris occasionally puts out a screencast every few weeks. With his relaxed style, you’ll learn about a random—but always practical—part of web development in each episode.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=273881728\">iTunes Feed</a></li>\n<li><a href=\"http://feeds.feedburner.com/CSS-Tricks-Screencasts\">RSS Feed</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/bigwebshow.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/bigwebshow.png\"/></div>\n<p>Hosted by Jeffrey Zeldman and Dan Benjamin, the Big Web Show “features special guests and topics like web publishing, art direction, content strategy, typography, web technology, and more. It’s everything web that matters.” You’ll listen to interviews in which famous web personalities like Eric Meyer, Jason Fried, Nicole Sullivan, Ethan Marcotte, and other professionals you should know open their minds and let you learn from the best. You can <a href=\"http://5by5.tv/bigwebshow\">catch this show live</a> on Thursdays a 1PM EST. Just like the Dev Show and the EE Podcast, the Big Web Show is part of Dan Benjamin’s incredible <a href=\"http://5by5.tv\">5by5 podcast network</a>.</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=370445683\">iTunes Feed (Audio)</a></li>\n<li><a href=\"http://feeds.feedburner.com/bigwebshow\">RSS Feed (Audio)</a></li>\n<li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=374004085\">iTunes Feed (Video)</a></li>\n<li><a href=\"http://feeds.feedburner.com/bigwebshowvideo\">RSS Feed (Video)</a></li>\n<li><a href=\"http://twitter.com/bigwebshow\">Twitter</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/thinkvitamin.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/thinkvitamin.png\"/></div>\n<p>You may be familiar with Carsonified, the company behind many web dev / design training initiatives (including the Future of Web Design and Future of Web Apps confernces). On Think Vitamin, Carsonified’s “blog about the web”, you can catch Think Vitamin Radio, “a bi-weekly chat about web design, development, and entrepreneurship.”</p>\n<ul><li><a href=\"http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=351340191\">iTunes Feed</a></li>\n<li><a href=\"http://feeds.feedburner.com/thinkvitaminradio\">RSS Feed</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/userability.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/userability.png\"/></div>\n<p>User Interface Engineering “is a leading research, training, and consulting firm specializing in web site and product usability.” You can take advantage of some of the free usability training they offer in their podcast, the Userability Podcast.</p>\n<ul><li><a href=\"http://itunes.apple.com/podcast/uie-brain-sparks/id119728465\">iTunes Feed</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/jqueryfordesigners.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/jqueryfordesigners.png\"/></div>\n<p>This is a great resource for any beginner (and even intermediate) jQuery developers. In each episode, Remy Sharp will explain how to create an popular web effect using jQuery. You’ll learn how to build pop-up bubbles, sliding headers, and simple tabs.</p>\n<ul><li><a href=\"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=281057468\">iTunes Feed</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/nettuts.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/nettuts.png\"/></div>\n<p>Of course, Nettuts+ publishes screencasts, too! For your convenience, you can get these in an iTunes feed, or subscribe to them on YouTube.</p>\n<ul><li><a href=\"http://itunes.apple.com/podcast/nettuts/id291173544?i=60856588\">iTunes Feed</a></li>\n<li><a href=\"http://www.youtube.com/user/nettutsplus\">Youtube Profile</a></li>\n</ul><hr/>\n<div class=\"tutorial_image\"><img src=\"https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/huffduffer.png\" data-original-url=\"http://nettuts.s3.amazonaws.com/793_podcasts/huffduffer.png\"/></div>\n<p>HuffDuffer is a site created by Jeremy Keith; it allows you to easily create your own podcasts. From the tag cloud above, you can see that a lot of the content being collected is related to web development. Check it out!</p>\n<hr/>\n<p>I’m sure most developers listen to the occasional podcast. Have I missed your favourite podcast? Let us all know in the comments!</p>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "reading_time": 4,
-        "domain_name": "code.tutsplus.com",
-        "preview_picture": "https://cdn.tutsplus.com/net/uploads/legacy/793_podcasts/preview.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 97,
-        "title": "University of Mississippi",
-        "url": "http://olemiss.edu",
-        "content": "<header readability=\"1\">\n<section class=\"hero\">\n</section></header><div class=\"pushdown\">\n<div id=\"academics-push\" class=\"push main c2\" readability=\"21\">\n<hr/><h4>UNIVERSITY OF MISSISSIPPI SCHOOLS AND COLLEGES</h4>\n<hr/><p>The Schools of Nursing and Pharmacy operate on both the Oxford and Jackson campuses. The Schools of Dentistry, Health Related Professionals and Medicine, and the Health Sciences Graduate School, are based in Jackson only. (Additional healthcare programs are available through the School of Applied Sciences on the Oxford campus.) Other than these exceptions, the schools above are on the Oxford campus.</p>\n</div>\n</div>\n<section id=\"herophoto\" readability=\"3\"><p><a href=\"http://www.olemiss.edu/emergency/\"><strong>Public Service Announcement</strong>: UM Health Center Seeing Increase in Flu Cases MORE INFO</a></p>\n<div class=\"flexslider page\">\n<ul class=\"slides\"><li class=\"quad3\">\n<figure><img alt=\"\" src=\"http://olemiss.edu/www.olemiss.edu/_images/hero2/2016-03-02_20_23_23CTG_0268-AC.jpg\"/><figcaption readability=\"2\"><h5>Hotty Toddy</h5>\n<p>Martavious Newby celebrates with fans after Ole Miss' 86-78 win over Mississippi State.</p>\n</figcaption></figure></li>\n<li class=\"quad3\">\n<figure><img alt=\"\" src=\"http://olemiss.edu/www.olemiss.edu/_images/hero2/2016-03-02_20_23_23CTG_0268-AB.jpg\"/><figcaption readability=\"6\"><h5>Moody's Amazing Night</h5>\n<p>Stefan Moody celebrates at the end of Ole Miss' 86-78 win over Mississippi State. Moody finished his final game at The Pavilion on Senior Night with a career-high 43 points.</p>\n</figcaption></figure></li>\n<li class=\"quad2\">\n<figure><img alt=\"\" src=\"http://olemiss.edu/www.olemiss.edu/_images/hero2/2016-03-01_16_29_53CTG_0266-D.jpg\"/><figcaption readability=\"4\"><h5>Career Expo</h5>\n<p>Students talk to prospective employers during an all-majors career fair held at The Inn at Ole Miss.</p>\n</figcaption></figure></li>\n<li class=\"quad2\">\n<figure><img alt=\"\" src=\"http://olemiss.edu/www.olemiss.edu/_images/hero2/2016-03-01_15_50_57SKB_2725-AAweb.jpg\"/><figcaption readability=\"8\"><h5>Choir Rehearsal</h5>\n<p>Members of the University of Mississippi Concert Singers prepare for a performance at the American Choral Directors Association convention March 10 in Chattanooga, Tenn.</p>\n</figcaption></figure></li>\n<li class=\"quad3\">\n<figure><img alt=\"\" src=\"http://olemiss.edu/www.olemiss.edu/_images/hero2/2016-02-29_15_05_23Dental-White-Coat-2016_13web.jpg\"/><figcaption readability=\"6\"><h5>Dentist's Pledge</h5>\n<p>Kendra Clark (right) and other students in the UMMC School of Dentistry Class of 2018 recite the Dentist's Pledge at the American College of Dentists White Coat Ceremony held Feb. 26 in Jackson.</p>\n</figcaption></figure></li>\n</ul><div class=\"weather\">\n<p>45°</p>\n<p>Oxford, MS</p>\n</div>\n</div>\n</section>\n<div id=\"newsannouncements\" readability=\"31\">\n<section id=\"news\"><a href=\"http://news.olemiss.edu\" class=\"link2all\">ALL NEWS</a>\n<h2>Latest News</h2>\n<article>\n<h3>UM Honors 150 Students with Who's Who Distinction</h3>\n</article><article>\n<h3>UM Lazarus Project Attracts International Collaborations</h3>\n</article><article>\n<h3>Schedule Set for BancorpSouth Rebel Road Trip</h3>\n</article></section><section id=\"announcements\"><a href=\"http://olemiss.edu/newsevents/announcements.html\" class=\"link2all\">ALL ANNOUNCEMENTS</a>\n<h2>Announcements</h2>\n<ul><li readability=\"1\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rebeccac-300-2R6EhILE.html\">Conferences — Oxford Conference for the Book</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rebeccac-300-2R6EhILE.html\">Celebrating the written word.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rmwhitti-300-6zip0xir.html\">Lectures — William Winter Institute Keynote Address</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rmwhitti-300-6zip0xir.html\">Dr. Susan Neiman will provide the keynote address, 'Learning from the Germans: What Can They Teach Us about Racial Reconciliation'</a></p>\n</li>\n<li readability=\"4\">\n<h3><a href=\"http://olemiss.edu/#\">Campus News — Conversation with Dr. Susan Neiman</a></h3>\n<p><a href=\"http://olemiss.edu/#\">Dr. Neiman will speak with campus activists on memory and iconography on Thursday, March 3 at the William Winter Institute in Lamar Hall</a></p>\n</li>\n<li readability=\"6\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=nicwea-300-pxgOJp5E.pdf\">Class News — Watercolor In London Meeting THIS Thursday!</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=nicwea-300-pxgOJp5E.pdf\">Summer Study Abroad Watercolor in London meeting THIS THURSDAY, March 3rd, Noon, Meek 110. Don't miss out and BRING A FRIEND!</a></p>\n</li>\n<li readability=\"5\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=mlong-300-nGVc0sVA.html\">Lectures — Porter L. Fortune, Jr. History Symposium</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=mlong-300-nGVc0sVA.html\">Dr. Robert Karl, of Princeton University, will present the Keynote Address at the 2016 Porter L. Fortune, Jr. History Symposium.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"http://goo.gl/forms/MCxDZ1E3tZ\">Green Initiative — ASB Seeks Input on Bicycle Issues</a></h3>\n<p><a href=\"http://goo.gl/forms/MCxDZ1E3tZ\">ASB is working on resolutions to improve the bike community on campus! Let us know what you think by taking this quick survey-new link.</a></p>\n</li>\n<li readability=\"2\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jamunson-300-PkJPHikV.pdf\">Academics — Breakfast For Dinner? It Is At Lenoir Dining!</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jamunson-300-PkJPHikV.pdf\">It's breakfast for dinner this week at Lenoir Dining. Make your reservations online at lenoirdining.com or by calling 662-915-1863.</a></p>\n</li>\n<li readability=\"2\">\n<h3><a href=\"http://olemiss.edu/#\">Invitation — Tallahatchie Toastmasters Meeting</a></h3>\n<p><a href=\"http://olemiss.edu/#\">Anyone interested in improving their communication and leadership skills are welcome to attend the meeting. Guests are always welcome!</a></p>\n</li>\n<li readability=\"4\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=cekalu-300-pukIwGmb.html\">Invitation — Oxford Writers Featured at Overby Center</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=cekalu-300-pukIwGmb.html\">The extraordinary literary community in Oxford will be the subject of a panel discussion at the Overby Center, followed by a reception.</a></p>\n</li>\n<li readability=\"1\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rebeccac-300-hWem8ZK1.html\">Conferences — Oxford Conference for the Book</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rebeccac-300-hWem8ZK1.html\">Celebrating the written word.</a></p>\n</li>\n<li readability=\"6\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=mlong-300-XkqfHOm8.html\">Brown Bag — Croft Professor Lecture Series: Dr. Joshua First</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=mlong-300-XkqfHOm8.html\">Dr. Joshua First, Croft Asst. Prof. of History, will speak on 'Ukraine's Revolution and Documentary Nationalism'; Fri., March 4; Croft 107.</a></p>\n</li>\n<li readability=\"5\">\n<h3><a href=\"http://olemiss.edu/#\">Campus News — Lunch and Learn with Dr. Susan Neiman</a></h3>\n<p><a href=\"http://olemiss.edu/#\">Dr. Susan Neiman and UM students will discuss her book, Moral Clarity, during a lunch and learn at the William Winter Institute.</a></p>\n</li>\n<li readability=\"2\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jrbreela-300-sk5TCBl9.pdf\">Arts and Culture — Colloquium: Thalberg in the American South</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jrbreela-300-sk5TCBl9.pdf\">This colloquium will be taught by Dr. Ian Hominick in room 136 (Small Ensemble Room) on Friday at 4 o'clock.</a></p>\n</li>\n<li>\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=kcozart-300-aSL2Edda.pdf\">Conferences — 2016 Isom Student Gender Conference</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=kcozart-300-aSL2Edda.pdf\">'Undoing the Norms'</a></p>\n</li>\n<li readability=\"1\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=ikaufman-300-dsdTiMuB.html\">Invitation — 'El Cafe' de los Lunes' Meets this Monday</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=ikaufman-300-dsdTiMuB.html\">Come practice your Spanish with us in a relaxed setting. Join us every Monday.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jharris-300-uAfBgf3h.html\">UM Memo — UM Faculty/Staff Appeals Committee</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jharris-300-uAfBgf3h.html\">Location: Mississippi Small Business Development Center Boardroom, 122 Jeanette Phillips Drive. See details for map.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=blair-300-5fkNFdmA.pdf\">Study Abroad — Scholarships for Study Abroad in China!</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=blair-300-5fkNFdmA.pdf\">UM has received two generous Chinese Government Scholarships for study in China during AY 2016/17. See Study Abroad for more info!</a></p>\n</li>\n<li readability=\"1\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jharris-300-M98IbaPW.html\">Invitation — How to Develop a Business Plan (Oxford)</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=jharris-300-M98IbaPW.html\">This seminar is designed to assist in preparing a business plan.</a></p>\n</li>\n<li readability=\"2\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=mdennis-300-soCfN09J.pdf\">Library — Citation Management Workshop</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=mdennis-300-soCfN09J.pdf\">Join Buffy Choinski in Room 106E to learn more about using RefWorks and other tools to make your bibliographies easier!</a></p>\n</li>\n<li readability=\"1\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rebeccac-300-efSwrORQ.html\">Brown Bag — 'Collaboration'</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=rebeccac-300-efSwrORQ.html\">Brown Bag Lecture with Ann Fisher-Wirth and Maude Schuyler Clay.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=tbbaker-300-DeTNJicl.html\">Campus News — Register for Ole Miss Big Event 2016</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=tbbaker-300-DeTNJicl.html\">Sign up to be a part of the largest day of community service in the state of Mississippi! Registration is open on myOleMiss until 3/21.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"http://technews.olemiss.edu/online-timesheets-now-required-eligible-um-employees/\">TECHNews — Online Timesheets Required - Eligible UM Employees</a></h3>\n<p><a href=\"http://technews.olemiss.edu/online-timesheets-now-required-eligible-um-employees/\">Beginning in early March,all eligible employees will be REQUIRED to record their time using the ESS Timesheet application within myOleMiss.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"http://green.olemiss.edu/propose-a-project/\">Green Initiative — Green Fund Proposals Due March 23</a></h3>\n<p><a href=\"http://green.olemiss.edu/propose-a-project/\">Students, faculty &amp; staff - Receive funding for your sustainability project! Green Fund proposals are due March 23.</a></p>\n</li>\n<li readability=\"4\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=dawiley-300-xvEUewt4.html\">IT Alert — Some IT Services Unavailable March 14</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=dawiley-300-xvEUewt4.html\">System upgrades are scheduled to begin 12 a.m. on Monday, March 14. Some IT services will be unavailable until this work is completed.</a></p>\n</li>\n<li readability=\"3\">\n<h3><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=whamilton-300-vNtM6yzN.html\">Parking and Transportation — New Road Construction Near Rebel Drive Water Tower</a></h3>\n<p><a href=\"https://secure1.olemiss.edu/tools/ViewUserFile.jsp?filename=whamilton-300-vNtM6yzN.html\">Starting in March, a new road will be constructed as Phase I of the North Residential Parking Garage project.</a></p>\n</li>\n</ul></section></div>\n<hr/><hr/><section id=\"sports\" class=\"c7\"><a href=\"http://www.olemisssports.com\" class=\"link2all\">olemisssports.com</a>\n<h2>UM Athletics</h2>\n<div class=\"games\">\n<div class=\"game\">\n<h3>Men's Basketball</h3>\n<div class=\"team win\"><img src=\"http://web6.olemiss.edu/mercury/sports/10431523.olemiss.png\" alt=\"team logo\"/> Ole Miss 86</div>\n<div class=\"team\"><img src=\"http://web6.olemiss.edu/mercury/sports/10164724.msst.png\" alt=\"team logo\"/> Miss. St. 78</div>\n<p>Wednesday, Mar. 2</p>\n</div>\n<div class=\"game\">\n<h3>Men's Baseball</h3>\n<div class=\"team win\"><img src=\"http://web6.olemiss.edu/mercury/sports/10431523.olemiss.png\" alt=\"team logo\"/> Ole Miss 9</div>\n<div class=\"team\"><img src=\"http://web6.olemiss.edu/mercury/sports/10166676.memphis.png\" alt=\"team logo\"/> Memphis 7</div>\n<p>Wednesday, Mar. 2</p>\n</div>\n<div class=\"game\">\n<h3>Women's Basketball</h3>\n<div class=\"team\"><img src=\"http://web6.olemiss.edu/mercury/sports/10431523.olemiss.png\" alt=\"team logo\"/> Ole Miss 59</div>\n<div class=\"team win\"><img src=\"http://web6.olemiss.edu/mercury/sports/10166693.vanderbilt.png\" alt=\"team logo\"/> Vanderbilt 74</div>\n<p>Wednesday, Mar. 2</p>\n</div>\n</div>\n</section><footer/>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 4,
-        "domain_name": "olemiss.edu",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 96,
-        "title": "FinnChristiansen.de Jetzt Dank Let’s Encrypt Per HTTPS Erreichbar",
-        "url": "https://www.finnchristiansen.de/2015/12/06/finnchristiansen-de-jetzt-dank-lets-encrypt-per-https-erreichbar/",
-        "content": "<div class=\"entry-content-thumbnail\"><img width=\"750\" height=\"179\" src=\"https://www.finnchristiansen.de/wp-content/uploads/2015/12/letsencrypt-1024x245.png\" class=\"attachment-large size-large wp-post-image\" alt=\"letsencrypt\" srcset=\"https://www.finnchristiansen.de/wp-content/uploads/2015/12/letsencrypt-300x72.png 300w, https://www.finnchristiansen.de/wp-content/uploads/2015/12/letsencrypt-1024x245.png 1024w, https://www.finnchristiansen.de/wp-content/uploads/2015/12/letsencrypt.png 1025w\" sizes=\"(max-width: 750px) 100vw, 750px\"/></div><div class=\"entry-content\">\n<p>Wenn ich in meinen FeedReader blicke, tauchen dort viele Beiträge zu <a href=\"https://letsencrypt.org/\" target=\"_blank\">Let’s Encrypt</a> auf. <a href=\"https://letsencrypt.org/2015/12/03/entering-public-beta.html\" target=\"_blank\">Seit Donnerstag befindet sich Let’s Encrypt in der offenen Beta Phase</a> und nun kann jeder ohne vorherige Freischaltung die kostenlosen SSL Zertifikate beantragen. Das habe ich natürlich auch getan.<br/></p>\n<p>Viele meiner Seiten oder Dienste waren zwar auch schon vorher SSL-verschlüsselt erreichbar, aber meistens habe ich dafür selbstsignierte Zertifkate bzw. eine selbstsignierte Certificate Authority verwendet. Für meine ownCloud Installation hatte ich mir sogar mal ein Zertifikat gekauft, da auch andere die Cloud nutzen und ich so ohne große Erklärungen ownCloud Links versenden konnte.</p>\n<p>Zur Verwendung von Let’s Encrypt brauche ich nicht mehr viel sagen, das haben schon <a href=\"https://thomas-leister.de/internet/lets-encrypt-zertifikate-im-manual-mode-abholen/\" target=\"_blank\">Thomas Leister</a>, <a href=\"http://linuxundich.de/gnu-linux/ssl-zertifikat-lets-encrypt-synology-nas/\" target=\"_blank\">Christoph Langner</a> oder andere getan. <a href=\"https://tuxproject.de/blog/2015/12/virtualisierungswahn/\" target=\"_blank\">Auch Kritik wird geäußert</a>, da der Let’s Encrypt Client verhältnismäßig aufgebläht ist und das Erstellen eines CSRs (Zertifikatsantrag) schon ewig mit openssl auf der Konsole bestens funktioniert. Let’s Encrypt möchte diesen Prozess aber vereinfachen und sogar die Installation des Zertifikates vereinfachen und sogar automatisieren.</p>\n<p>Ich habe meine Zertifikate mit Let’s Encrypt mit meinem Arch Linux Desktop im „Manual Mode“ erstellt und per Hand auf die Server verteilt. Das ist mir lieber, als dass ich die Software auf jeden Server installiere. Handarbeit ist eh notwendig, da ich <a href=\"https://www.finnchristiansen.de/2015/08/27/tlsa-records-fuer-dane-erstellen/\" target=\"_blank\">DANE</a> einsetze und die Records eh anpassen musste.</p>\n<p>Leider können nur Zertifikate für 10 Subdomains / Host-Records einer Domain beantragt werden. Das habe ich für die 10 wichtigsten getan, die übrigen 15 kann ich hoffentlich bald nachholen. Bisher gibt es eine entsprechende Fehlermeldung, falls man versucht, mehr Zertifikate zu beantragen:</p>\n<div id=\"crayon-56d87312178e8166484796\" class=\"crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate c6\" data-settings=\" minimize scroll-mouseover\">\n<div class=\"crayon-toolbar crayon-tools c1\" data-settings=\" mouseover overlay hide delay\">\n<div class=\"crayon-button crayon-nums-button crayon-button-icon\" title=\"Zeilennummern\"/>\n<div class=\"crayon-button crayon-plain-button crayon-button-icon\" title=\"Unformatierte Code-Ansicht\"/>\n<div class=\"crayon-button crayon-wrap-button crayon-button-icon\" title=\"Zeilenumbruch umschalten\"/>\n<div class=\"crayon-button crayon-expand-button crayon-button-icon\" title=\"Code aufklappen\"/>\n<div class=\"crayon-button crayon-copy-button crayon-button-icon\" title=\"Copy\"/>\n<div class=\"crayon-button crayon-popup-button crayon-button-icon\" title=\"Code in einem neuen Fenster anzeigen\"/>\n</div>\n<div class=\"crayon-info c2\"/>\n<div class=\"crayon-plain-wrap\">\n<textarea wrap=\"soft\" class=\"crayon-plain print-no c3\" data-settings=\"dblclick\" readonly=\"readonly\">\nError: urn:acme:error:rateLimited :: There were too many requests of a given type :: Error creating new cert :: Too many certificates already issued for: finnchristiansen.de\n</textarea></div>\n<div class=\"crayon-main\">\n<table class=\"crayon-table\"><tr class=\"crayon-row\"><td class=\"crayon-nums\" data-settings=\"show\">\n<div class=\"crayon-nums-content crayon-num c4\">1</div>\n</td>\n<td class=\"crayon-code\">\n<div class=\"crayon-pre crayon-line c5\">Error: urn:acme:error:rateLimited :: There were too many requests of a given type :: Error creating new cert :: Too many certificates already issued for: finnchristiansen.de</div>\n</td>\n</tr></table></div>\n</div>\n<p>Die Zertifikate sind 90 Tage gültig, so dass ich mir eine Erinnerung im Kalender hinterlegt habe, damit ich die Zertifikate erneuern kann. Bis dahin: Viel Spaß beim Erstellen und Einbauen der Zertifikate.</p>\n<p><em>Beitragsbild-Quelle: <a href=\"https://letsencrypt.org/\" target=\"_blank\">LetsEncrypt.org</a> – <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0 License</a>.</em></p>\n</div>",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "de-DE",
-        "reading_time": 1,
-        "domain_name": "www.finnchristiansen.de",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 82,
-        "title": "Le développeur et l'ingénierie logicielle",
-        "url": "http://wemucs.com/le-developpeur-et-lingenierie-logicielle/",
-        "content": "<p><strong>Etre un développeur, ce n'est pas juste pisser du code. Non. L'architecture de l'applicatif est bien plus importante et la conception fera la différence entre un bon et mauvais développeur.</strong></p><p>Julien Dollon a tout résumé en un seul tweet :<br/></p>\n<p>Alors, voyons un peu ce qui paraît essentiel pour progresser dans le développement et l'ingénierie logicielle plus généralement.</p>\n<h2 id=\"lesbases\">Les bases</h2>\n<p>Peu importe votre âge, que vous ayez fait de longues études dans une école prestigieuse ou non : vous devez maîtriser vos bases. J'entends par là :</p>\n<ul><li>Savoir développer sans framework ni librairie</li>\n<li>Connaitre la programmation orientée objet</li>\n<li>Etre à l'aise avec une base de données</li>\n<li>Avoir des notions de réseau</li>\n<li>S'intéresser au hardware</li>\n</ul><p>Oui, parce que si vous maîtrisez vos bases, vous comprendrez que tous les langages manipulent des données qui passent leur temps à transiter entre unités de calcul et de stockage.</p>\n<p><strong>Un bon développeur doit pouvoir changer de plateforme ou de langage très rapidement</strong>, s’imprégner d’une nouvelle base de données ou même d’un nouveau protocole en très peu de temps. A chaque fois, ce n'est que question de logique et d'implémentation.</p>\n<h2 id=\"lacuriosit\">La curiosité</h2>\n<p>L'intégrisme mène au côté obscur. Et puis, vous risquez de finir votre carrière à bosser sur des projets fait en ASP 2.0 ou en PHP 4. Chacun son truc mais ce qui fait la beauté du monde, c'est <strong>la diversité</strong>.</p>\n<p>Il est vraiment important d'être à l'aise avec un environnement et un langage. Vous coderez plus vite et vous contournerez les pièges. De l'autre côté, être ouvert sera votre plus grande force. Le PHP ou le Java ne sont pas les seuls : vous pourriez être surpris par la simplicité et la rapidité de Python et du Go, ou même des outils Unix/Linux codés en C.</p>\n<p>Si vous avez un peu de temps, n'hésitez pas à vous amusez à développer de tous petits applicatifs pour découvrir un nouveau langage. Après tout, les histoires d'amour sont souvent inattendues !</p>\n<h2 id=\"ladettetechnique\">La dette technique</h2>\n<p>On entre un peu plus dans le vif du sujet. Maîtriser ses bases, c'est bien. Connaître plusieurs langages et être à l'aise avec des frameworks, c'est mieux. Imaginer un logiciel pour qu'il soit encore en prod dans 10 ans, c'est la réussite !</p>\n<h4 id=\"projetscourtsetabsencedemaintenance\">Projets courts et absence de maintenance</h4>\n<p>Un certain nombre de développeurs bossent sur des projets assez courts (entre 3 mois et 1 an) sans en assumer la maintenance. Au final, c'est soit un autre développeur qui reprendra les spaghettis pour le debugger ou essayer d'y ajouter une fonctionnalité.</p>\n<p>Alors ça peut être super cool :</p>\n<ul><li>on peut changer souvent de techno / librairies / frameworks</li>\n<li>on peut sortir du concret très vite</li>\n<li>on peut plus facilement contribuer à l'open source avec de nouveaux projets</li>\n</ul><p>Mais vous allez inévitablement contribuer à la plus grande frustration du développeur : reprendre du code qui a plusieurs années écrit par quelqu'un d'autre… Au final, soit vous ferez un hack, soit vous ferez une librairie à part sur un patron de conception différent, <strong>augmentant la dette technique</strong>.</p>\n<p><img src=\"http://wemucs.com/content/images/2016/02/65748811.jpg\" alt=\"Shitty code\"/></p>\n<h4 id=\"projetslongsetddis\">Projets longs et dédiés</h4>\n<p>De l'autre côté, si vous travaillez chez un éditeur ou un \"client final\", vous aurez sans doute l'opportunité de travailler sur des projets qui resteront en production durant des années, voir des dizaines d'années. Et là, la vision que vous allez avoir est quelque peu différente.</p>\n<p>Je ne vais pas revenir sur ce qu'est la dette technique. <a href=\"http://blog.dollon.net/la-dette-technique/\">Julien l'a très bien décrit dans son article</a>, que je vous invite à lire à la suite.</p>\n<p>Ne pas créer de dette technique involontaire et contrôler la volontaire, ce sera votre plus grande mission. Et pour cela, pas de magie : c'est <strong>l'expérience</strong> qui parlera. Les vieux ne sont pas tous des cons et ils vous donneront souvent de précieux conseils !<br/>La plus grande réussite, c'est de pouvoir ajouter des fonctionnalités dans 10 ans à votre projet en suivant la même conception de départ avec toutes les briques déjà en place.</p>\n<p>Quelques petites remarques en vrac :</p>\n<ul><li>Bien nommer ses variables, fonctions et classes : elles doivent s'auto-décrire sans commentaire, représenter la réalité sans confusion</li>\n<li>La POO, ce n'est pas automatique : le fonctionnel permet de découpler plus facilement les briques</li>\n<li>Les micro-services, c'est bien, mais il faut faire attention de ne pas devoir gérer 50 bases de projets différents</li>\n<li>Les tests unitaires et fonctionnels sont aussi importants que l'implémentation</li>\n<li>Les librairies externes, oui, mais elles ne doivent pas devenir un poids si elles deviennent trop couplées à votre projet</li>\n<li>Et j'en passe !</li>\n</ul><h2 id=\"rflectionvsttebaisse\">Réflection vs tête baissée</h2>\n<p>Dans une vie de développeur, on rencontre à la fois des projets simples, répétitifs et un peu bateau. Ce qui nous motive réellement, ce sont les <strong>défis complexes</strong> à résoudre et heureusement, on en rencontre très souvent.</p>\n<p>Démarrer à coder tout de suite, c'est foncer tête baissée et créer des fondations fragiles. Au final, vous commencez à poser des briques pour construire votre maison sans en avoir dessiné le plan précis.</p>\n<ul><li>Comprenez les besoins métiers, et mettez-vous à la place des utilisateurs. Passez beaucoup de temps avec eux pour tout expliciter et les avertir de ce que vous pourrez et ne pourrez pas faire</li>\n<li>Faites une étude sur l'architecture et les technologies possibles : prenez un papier, un crayon et représentez-les</li>\n<li>Soyez impartial de votre décision : mettez les points positifs en regard des négatifs pour chaque possibilité</li>\n<li>Demandez d'autres avis que le votre en organisant des brainstorming. <strong>C'est en équipe que l'on avance le plus</strong>, vous mettrez sans doute en évidence des points que vous aviez oublié et il faut savoir reconnaitre que vous n'aviez pas la meilleure solution !</li>\n</ul><h2 id=\"seremettreenquestion\">Se remettre en question</h2>\n<p>Il ne faut pas seulement avoir l'impression de faire du bon travail, il est important de s'en assurer. La définition d'un \"bon\" travail va varier énormément en fonction des contextes et en fonction des attentes. Cependant, au fur et à mesure de l'avancé de vos projets, <strong>faites un point sur ce que vous venez de créer</strong> : mettez en avant les points forts avec en perspective les parties faibles.</p>\n<p><img src=\"http://wemucs.com/content/images/2016/02/continuous-improvement-cycle.gif\" alt=\"Continuous Improvement Cycle\"/></p>\n<p>Il est évident qu'avec le recul, après mise en production et sans doute les premiers bugs ou comportements non voulus, ou même simplement la difficulté de faire évoluer vos outils, vous pourrez réellement voir ce qui a cloché et comment l'éviter à l'avenir. C'est ça le travail d'un développeur et d'un ingénieur en général : aller de l'avant en étant lucide sur le passé.</p>\n<p>Oh, et surtout <strong>pas de vanité</strong>. Utilisez des métriques qui veulent vraiment dire quelque chose, n'essayez pas de cacher la vilaine classe FileUtils qui devient un cauchemar : il faut savoir être sincère dans ces moments là.</p>\n<h2 id=\"enrsum\">En résumé…</h2>\n<p>Il faut de tout pour faire un monde ! Si vous préférez changer de projets tous les 4 matins, être à l'affut de toutes les nouveautés, alors restez comme vous êtes et soyez des précurseurs !</p>\n<p>A l'inverse, si vous désirez vraiment entrer dans de la conception logicielle, la pure et dure, alors je vous conseille fortement de travailler sur des projets au long court. Cela ne vous empêchera pas de vous éclatez, mais vous allez pouvoir vraiment réfléchir à ce qu'est un bon logiciel et ce qui ne l'est pas.</p>\n<p>Et puis, si vous le pouvez, <strong>bossez avec des pointures</strong> dans le domaine. Apprenez sur le tas avec des séniors qui ont des années de dev dans les baskets. Ils seront sans doute de précieux conseils, même si votre première Pull Request aura sans doute 3 commentaires par ligne !</p>\n<p><img src=\"http://wemucs.com/content/images/2016/02/57772588.jpg\" alt=\"Self merged\"/></p>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "reading_time": 6,
-        "domain_name": "wemucs.com",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 78,
-        "title": "The Role of Methylation in Gene Expression",
-        "url": "http://www.nature.com/scitable/topicpage/the-role-of-methylation-in-gene-expression-1070",
-        "content": "<p>Today, researchers know that DNA methylation occurs at the cytosine bases of eukaryotic DNA, which are converted to 5-methylcytosine by DNA methyltransferase (DNMT) enzymes. The altered cytosine residues are usually immediately adjacent to a guanine nucleotide, resulting in two methylated cytosine residues sitting diagonally to each other on opposing DNA strands. Different members of the DNMT family of enzymes act either as <em>de novo</em> DNMTs, putting the initial pattern of methyl groups in place on a DNA sequence, or as maintenance DNMTs, copying the methylation from an existing DNA strand to its new partner after replication. Methylation can be observed by staining cells with an immunofluorescently labeled antibody for 5-methylcytosine. In mammals, methylation is found sparsely but globally, distributed in definite CpG sequences throughout the entire genome, with the exception of CpG islands, or certain stretches (approximately 1 kilobase in length) where high CpG contents are found. The methylation of these sequences can lead to inappropriate gene silencing, such as the <a href=\"http://www.nature.com/scitable/topicpage/Tumor-Suppressor-TS-Genes-and-the-Two-887\" onclick=\"return isUDV('/topicpage/Tumor-Suppressor-TS-Genes-and-the-Two-887');\" title=\"silencing of tumor suppressor genes in cancer cells\">silencing of tumor suppressor genes in cancer cells</a>.</p>\n<p>Currently, the mechanism by which <em>de novo</em> DNMT enzymes are directed to the sites that they are meant to silence is not well understood. However, researchers have determined that some of these DNMTs are part of <a href=\"http://www.nature.com/scitable/topicpage/Chromatin-Remodeling-in-Eukaryotes-1082\" onclick=\"return isUDV('/topicpage/Chromatin-Remodeling-in-Eukaryotes-1082');\" title=\"chromatin-remodeling complexes\">chromatin-remodeling complexes</a> and serve to complete the remodeling process by performing on-the-spot DNA methylation to lock the closed shape of the chromatin in place.</p>\n<p>The roles and targets of DNA methylation vary among the kingdoms of organisms. As previously noted, among Animalia, mammals tend to have fairly globally distributed CpG methylation patterns. On the other hand, invertebrate animals generally have a \"mosaic\" pattern of methylation, where regions of heavily methylated DNA are interspersed with nonmethylated regions. The global pattern of methylation in mammals makes it difficult to determine whether methylation is targeted to certain gene sequences or is a default state, but the CpG islands tend to be near transcription start sites, indicating that there is a recognition system in place.</p>\n<p>Plantae are the most highly methylated eukaryotes, with up to 50% of their cytosine residues exhibiting methylation. Interestingly, in Fungi, only repetitive DNA sequences are methylated, and in some species, methylation is absent altogether, or it occurs on the DNA of <a href=\"http://www.nature.com/scitable/topicpage/Transposons-or-Jumping-Genes-Not-Junk-DNA-1211\" onclick=\"return isUDV('/topicpage/Transposons-or-Jumping-Genes-Not-Junk-DNA-1211');\" title=\"Transposons\">transposable elements</a> in the genome. The mechanism by which the transposons are recognized and methylated appears to involve <a href=\"http://www.nature.com/scitable/topicpage/Small-Non-coding-RNA-and-Gene-Expression-1078\" onclick=\"return isUDV('/topicpage/Small-Non-coding-RNA-and-Gene-Expression-1078');\" title=\"siRNA\">small interfering RNA</a> (siRNA). The whole silencing mechanism invoking DNMTs could be a way for these organisms to defend themselves against viral infections, which could generate transposon-like sequences. Such sequences can do less harm to the organism if they are prevented from being expressed, although replicating them can still be a burden (Suzuki &amp; Bird, 2008). In other fungi, such as fission yeast, siRNA is involved in gene silencing, but the targets include structural sequences of the chromosomes, such as the centromeric DNA and the telomeric repeats at the chromosome ends. </p>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 2,
-        "domain_name": "www.nature.com",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 53,
-        "title": "E-Mail-Adresse kostenlos, FreeMail, De-Mail & Nachrichten",
-        "url": "http://web.de",
-        "content": "<div class=\"r2\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"1\" readability=\"12\">\nNPD setzt auf Verzögerungen\n<p>Rechtsextremisten kämpfen vor Verfassungsgericht um ihr Überleben.</p>\n</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"8\">\n<a href=\"http://web.de/magazine/politik/frank-buschmann-schockiert-menschen-geschrieben-31389104\" data-teaser-id=\"31389104\" data-teaser-type=\"DEFAULT\">Schockiert über den Hass</a>\n<p>Kommentator Frank Buschmann spricht über Reaktionen auf sein Merkel-Lob.</p>\n</div>\n</div>\n</div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\nSchlägerei nach One-Night-Stand</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nPartei \"Die Rechte\" sorgt für Eklat</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nScheibe vereist? Das hilft!</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/wissen/deutscher-weltenbummler-mumifiziert-yacht-gefunden-31382634\" data-teaser-id=\"31382634\" data-teaser-type=\"DEFAULT\" data-reco-teaser=\"1\"><img src=\"http://i1.web.de/image/734/31382734,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Yacht\" width=\"72\" height=\"54\"/></a> Die Yacht des deutschen Weltenbummlers Manfred Fritz Bajorat wurde vor der philippinischen Küste gefunden.</li>\n<li><a href=\"http://web.de/magazine/panorama/one-night-stand-endet-unschoenem-ausgang-31384014\" data-teaser-id=\"31384014\" data-teaser-type=\"DEFAULT\" data-reco-teaser=\"1\"><img src=\"http://i1.web.de/image/078/31384078,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"One-Night-Stand\" width=\"72\" height=\"54\"/></a> Ein One-Night-Stand zweier Teenager endet anders als geplant.</li>\n<li><a href=\"http://web.de/magazine/politik/plakat-partei-rechte-haengen-plakate-31384064\" data-teaser-id=\"31384064\" data-teaser-type=\"DEFAULT\" data-reco-teaser=\"1\"><img src=\"http://i2.web.de/image/088/31384088,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"\" width=\"72\" height=\"54\"/></a> Das Landeskriminalamt in Sachsen-Anhalt prüft den Verdacht der Volksverhetzung wegen eines Wahlplakats der Partei \"Die Rechte\". (Symbolbild)</li>\n<li class=\"last\"><a href=\"http://www.auto-service.de/videos/76198-scheibe-vereist-hilft.html\" data-teaser-id=\"31384058\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\" data-reco-teaser=\"1\"><img src=\"http://i1.web.de/image/054/31384054,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Life Hack Eiskratzen\" width=\"72\" height=\"54\"/></a> Life Hack Eiskratzen</li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"r1 news-content teaser-content\" readability=\"8\">\n<a href=\"http://web.de/magazine/sport/fussball/bundesliga/fc-bayern-pep-guardiola-wagt-experimente-31385492\" data-teaser-id=\"31385492\" data-teaser-type=\"DEFAULT\" data-reco-teaser=\"1\">Spieler leiden unter Pep</a>\n<p>Guardiola hat Angst vor dem Scheitern und opfert für den Erfolg einiges.</p>\n</div>\n</div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"1\">\n<a href=\"http://www.auto-service.de/news/76208-consumer-reports-besten-automarken-welt.html\" data-teaser-id=\"31383558\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\">Die besten Automarken der Welt</a></div>\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"12\">\nHeidi, zieh das wieder aus!</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nDie besten Gebrauchten 2016</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nOscars: Kate feiert mit ihrem Leo</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://www.auto-service.de/news/76208-consumer-reports-besten-automarken-welt.html\" data-teaser-id=\"31383558\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\"><img src=\"http://i2.web.de/image/554/31383554,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Consumer Reports: Das sind die zehn besten Automarken der Welt!\" width=\"72\" height=\"54\"/></a> Consumer Reports: Das sind die zehn besten Automarken der Welt!</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/tv-film/oscar/oscar-2016-tops-flops-oscar-roben-31382576\" data-teaser-id=\"31382576\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i0.web.de/image/552/31383552,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Heidi Klum (l.) Flop, Charlize Theron Top!\" width=\"72\" height=\"54\"/></a> So nahe beieinander liegen manchmal die Tops und Flops auf dem Roten Teppich: Heidi Klum (l.) Flop, Charlize Theron Top!</li>\n<li><a href=\"http://www.auto-service.de/news/76134-gebrauchtwagenreport-2016-besten-gebrauchten-deutschland.html\" data-teaser-id=\"31379186\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\"><img src=\"http://i1.web.de/image/182/31379182,pd=4,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Gebrauchtwagenreport 2016: Das sind die besten Gebrauchten in Deutschland\" width=\"72\" height=\"54\"/></a> Gebrauchtwagenreport 2016: Das sind die besten Gebrauchten in Deutschland</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/unterhaltung/tv-film/oscar/oscars-2016-schoensten-bilder-oscar-nacht-31382570\" data-teaser-id=\"31382570\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i1.web.de/image/776/31382776,pd=2,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Kate Winslet, Leonardo DiCaprio, Oscars 2016\" width=\"72\" height=\"54\"/></a> Kate Winslet feiert mit Leonardo DiCaprio.</li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"service-content slide-lotto\" data-slide-id=\"1\" readability=\"36\">WEB.DE Lottoservice\n<div class=\"next-draw\" readability=\"7\">Jackpothöhe am Mittwoch, 02.03.16\n<div class=\"next-draw-content\">\n<p class=\"jackpot\">1</p>\n<a href=\"http://lotto.web.de/webshop/product/lottonormal/?partnerId=0WEHOMDISP&amp;advertisementId=0HPMODU000000000JACKPOTHO000LO000000000000\"><img src=\"http://img.ui-portal.de/homepage/img/webde/bg/lotto_button.png\" height=\"22\" width=\"104\" alt=\"Lotto spielen\"/></a> Chance 1:140 Mio.</div>\n</div>\n<div class=\"last-draw\" readability=\"7\">Ziehung vom Samstag, 27.02.16\n<div class=\"winning-numbers\">\n<ol class=\"numbers\"><li>7</li>\n<li>10</li>\n<li>15</li>\n<li>25</li>\n<li>37</li>\n<li>49</li>\n</ol>\nSZ\n<ol class=\"numbers\"><li>7</li>\n</ol></div>\n</div>\nAb 18 Jahren. Suchtgefahr. Hilfe bei www.bzga.de.</div>\n<div class=\"service-content slide-eurojackpot\" data-slide-id=\"2\" readability=\"36\">WEB.DE Lottoservice\n<div class=\"next-draw\" readability=\"7\">Jackpothöhe am Freitag, 04.03.16\n<div class=\"next-draw-content\">\n<p class=\"jackpot\">40</p>\n<a href=\"http://lotto.web.de/webshop/product/eurojackpot/?partnerId=0WEHOM0HOM&amp;advertisementId=0HPMODU000000000EUROJACKPO000EJ000000000000\"><img src=\"http://img.ui-portal.de/homepage/img/webde/bg/eurojackpot_button.png\" height=\"22\" width=\"104\" alt=\"Jetzt spielen\"/></a> Chance 1:95 Mio.</div>\n</div>\n<div class=\"last-draw\" readability=\"7\">Ziehung vom Freitag, 26.02.16\n<div class=\"winning-numbers\">\n<ol class=\"numbers\"><li>9</li>\n<li>11</li>\n<li>19</li>\n<li>42</li>\n<li>45</li>\n</ol>\nEZ\n<ol class=\"numbers\"><li>7</li>\n<li>10</li>\n</ol></div>\n</div>\nAb 18 Jahren. Suchtgefahr. Hilfe bei www.bzga.de.</div>\n</div>\n</div>\n<div class=\"r1 service-content\">Top 5 Artikel\n<a href=\"http://web.de/magazine/news/\">Weitere Nachrichten</a></div>\n<div class=\"r1 service-content\"><a href=\"http://web.de/magazine/unterhaltung/lifestyle/horoskop/\">Horoskop</a>\n</div>\n<div class=\"r2\">\n<div class=\"r1 news-content\"><a href=\"http://web.de/magazine/auto/\">Auto-Service</a>\n<div class=\"teaser-content\" readability=\"8\">\n<a href=\"http://www.auto-service.de/news/genfer-autosalon/76288-panne-audi-show-moderatorin-weichselbraun-bleibt-auto-stehen.html\" data-teaser-id=\"31388878\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\">Auto-Panne bei Audi-Show</a>\n<p>Moderatorin Mirjam Weichselbraun bleibt in Genf auf der Bühne stehen.</p>\n</div>\n</div>\n<div class=\"r1 news-content teaser-content\" readability=\"8\">\n<a href=\"http://www.auto-service.de/news/genfer-autosalon/76268-bugatti-chiron-uebersportwagen-unfassbaren-1500-ps-vorgestellt.html\" data-teaser-id=\"31385222\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\">1.500 Bugatti-PS - Wahnsinn!</a>\n<p>Der neue \"Chiron\" feiert auf dem Autosalon in Genf seine Premiere.</p>\n</div>\n<div class=\"r1 news-content teaser-content\" readability=\"7\">\n<a href=\"http://www.auto-service.de/news/genfer-autosalon/76276-mercedes-c-klasse-cabrio-open-air-spass-367-ps.html\" data-teaser-id=\"31385422\" data-teaser-type=\"AUTOSERVICE\" target=\"_blank\">Premiere für die offene C-Klasse</a>\n<p>Das brandneue Mercedes C-Klasse Cabrio rollt nach Genf.</p>\n</div>\n</div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\nRiskante Havarie in der Antarktis</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nSchnee sorgt für viele Unfälle</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nExplosion auf Kraftwerksgelände</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/politik/fluechtlingskrise-in-europa/dschungel-calais-zerstoerung-fluechtlingslager-gestattet-31377034\" data-teaser-id=\"31377034\" data-teaser-type=\"VIDEO\"><img src=\"http://i2.web.de/image/032/31377032,pd=1,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Zerstörung von Flüchtlingslager bei Calais gestattet\" width=\"72\" height=\"54\"/></a> Frankreichs Innenminister Bernard Cazeneuve begrüßte die Entscheidung und versprach Hilfe.</li>\n<li><a href=\"http://web.de/magazine/panorama/havarie-antarktis-31375668\" data-teaser-id=\"31375668\" data-teaser-type=\"VIDEO\"><img src=\"http://i1.web.de/image/666/31375666,pd=1,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Havarie in der Antarktis\" width=\"72\" height=\"54\"/></a> Der australische Eisbrecher Aurora Australis ist auf dem Weg zu einer Forschungsstation auf Grund gelaufen. Wegen schwieriger Witterungsbedingungen blieb das Ausmaß des dabei entstandenen Schadens zunächst unklar.</li>\n<li><a href=\"http://web.de/magazine/politik/winter-fruehling-schnee-eis-sorgen-unfaelle-31375364\" data-teaser-id=\"31375364\" data-teaser-type=\"VIDEO\"><img src=\"http://i0.web.de/image/362/31375362,pd=1,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Winter zum Frühling: Schnee und Eis sorgen für Unfälle\" width=\"72\" height=\"54\"/></a> Zum meteorologischen Frühlingsbeginn Anfang März stehen die Zeichen auf Schnee. Nach Auskunft der Wetterexperten ist mit einem Temperaturabfall und Glätte zu rechnen. Im Erzgebirge hatten die Autofahrer schon seit Wochenbeginn zu kämpfen.</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/panorama/medien-explosion-britischem-kraftwerksgelaende-31371758\" data-teaser-id=\"31371758\" data-teaser-type=\"VIDEO\"><img src=\"http://i0.web.de/image/756/31371756,pd=1,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Laut Medien Explosion auf britischem Kraftwerksgelände\" width=\"72\" height=\"54\"/></a> Es soll westlich von London Opfer gegeben haben.</li>\n</ul></div>\n<p><a href=\"http://route.web.de/\">Routenplaner</a> Der richtige Weg <a href=\"http://web.de/magazine/video/\">Video</a> Die besten Clips <a href=\"http://tv.web.de\">Fernsehprogramm</a> Die besten Serien, Filme und Sport-Events auf einen Blick <a href=\"https://millionenklick.web.de/#C0101041109010101\" target=\"_blank\">MillionenKlick</a> Jetzt mitmachen!</p>\n<p><a href=\"http://web.de/magazine/unicef/\">Unicef</a> Helfen Sie jetzt! <a href=\"http://www.auto-service.de/staumelder/\" target=\"_blank\">Staumelder</a> Gute Fahrt! <a href=\"http://web.de/magazine/reise/ferientermine/\">Schulferien</a> Urlaub planen <a href=\"http://web.de/magazine/unterhaltung/comic/\">Comics</a> Witzig, witzig</p>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"12\">\nVerschollen, aber überlebt</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nKorallenriffe sterben im Pazifik</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"12\">\nWer hier eine Stunde bleibt, ist tot</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/digital/laendern-selfie-toten-31341552\" data-teaser-id=\"31341552\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/578/31341578,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Selfie\" width=\"72\" height=\"54\"/></a> Um sich selbst spektakulär in Szene zu setzen, verhalten sich vor allem junge Menschen extrem.</li>\n<li><a href=\"http://web.de/magazine/wissen/robinson-crusoe-verschollenen-ueberlebt-31322746\" data-teaser-id=\"31322746\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/428/31332428,pd=4,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Jose Salvador Alvarenga \" width=\"72\" height=\"54\"/></a> Jose Salvador Alvarenga verschwand im November 2012 und tauchte im Januar 2014 wieder auf.</li>\n<li><a href=\"http://web.de/magazine/wissen/satellitenbilder-weltall-9077788\" data-teaser-id=\"9077788\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i1.web.de/image/762/31375762,pd=4,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Fatu Huku Pazifik El Nino\" width=\"72\" height=\"54\"/></a> El Niño, die ungewöhnlichen Strömungen im Pazifischen Ozean, bedroht die Korallenriffe. Die Korallen werden durch die Strömungen ausgebleicht. Es wird befürchtet, dass dieses Jahr Riffe weltweit bedroht sind. Das Bild zeigt die Pazifik-Insel Fatu Huku und wurde vom europäischen Satelliten Sentinel-2 aufgenommen. Es dient zur Überprüfung der Korallen-Schäden.</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/wissen/mystery/karatschai-see-russland-gefaehrlichste-ort-welt-31327140\" data-teaser-id=\"31327140\" data-teaser-type=\"DEFAULT\"><img src=\"http://i1.web.de/image/546/31327546,pd=5,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Mystery\" width=\"72\" height=\"54\"/></a> Der Karatschai-See in Russland gilt als gefährlichster Ort der Welt.</li>\n</ul></div>\n<div class=\"r1 service-content\">WEB.DE Produkte\n<a href=\"https://produkte.web.de/#.hp.int.produktebox\">Weitere Produkte</a></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\">\nDe-Mail</div>\n<div class=\"teaser-content\" data-slide-id=\"3\">\nMail App</div>\n<div class=\"teaser-content\" data-slide-id=\"4\">\nBrowser</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"https://produkte.web.de/mailcheck/#.hp.int.produktebox\" data-teaser-id=\"30017408\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/402/30017402,pd=17,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"\" width=\"72\" height=\"54\"/></a> WEB.DE Mailcheck</li>\n<li><a href=\"https://produkte.web.de/de-mail/#.hp.int.produktebox\" data-teaser-id=\"30017424\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/420/30017420,pd=17,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"\" width=\"72\" height=\"54\"/></a></li>\n<li><a href=\"https://produkte.web.de/freemail_mobile_startseite/mail-app/#.hp.int.produktebox\" data-teaser-id=\"30017430\" data-teaser-type=\"DEFAULT\"><img src=\"http://i1.web.de/image/428/30017428,pd=17,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Mobile Apps\" width=\"72\" height=\"54\"/></a></li>\n<li class=\"last\"><a href=\"https://produkte.web.de/browser/#.hp.int.produktebox\" data-teaser-id=\"30017436\" data-teaser-type=\"DEFAULT\"><img src=\"http://i1.web.de/image/434/30017434,pd=17,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Audible\" width=\"72\" height=\"54\"/></a></li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\nDie Missen und ihre sexy Tattoos</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nSo lief die Wahl der Miss Germany</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nMissen-Shooting am Strand</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/unterhaltung/lifestyle/miss-internet/schoen-miss-germany-2016-lena-broeder-31367418\" data-teaser-id=\"31367418\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i0.web.de/image/294/31368294,pd=6,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Lena Bröder Miss Germany 2016\" width=\"72\" height=\"54\"/></a> Lena Bröder (M.) und ihre beiden Stellvertreterinnen Francesca Orru (l.) und Katharina Schubert (r.) nach der Wahl zur Miss Germany 2016.</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/lifestyle/miss-internet/miss-germany-2016-missen-sexy-tattoos-31341074\" data-teaser-id=\"31341074\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i2.web.de/image/014/31341014,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Missen Tattoos Noten\" width=\"72\" height=\"54\"/></a> In diesem Tattoo steckt so einiges: Im \"L\" beim Wort Liebe hat sich ein Unendlichkeitszeichen versteckt, die Blumen erinnern aber daran, dass auch die Liebe welken kann. Und die Noten sind ein kurzer Ausschnitt aus dem Soundtrack von \"Die fabelhafte Welt der Amelie\". Große Körperkunst.</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/lifestyle/miss-internet/miss-germany-2016-religionslehrerin-schoenste-deutschlands-31365694\" data-teaser-id=\"31365694\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i2.web.de/image/686/31365686,pd=4,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Olga Hoffmann und Lena Bröder\" width=\"72\" height=\"54\"/></a> Die Krone bekommt die frischgebackene Miss Germany von ihrer Vorgängerin Olga Hoffmann aufgesetzt.</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/unterhaltung/lifestyle/miss-internet/miss-germany-2016-missen-shooting-strand-31333712\" data-teaser-id=\"31333712\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i1.web.de/image/672/31333672,pd=6,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Missen am Strand\" width=\"72\" height=\"54\"/></a> Sieht ein bisschen so aus, als gäbe es da etwas umsonst. Schuhe vielleicht?</li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\nExklusiver Clip: \"Eddie the Eagle\"</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nExklusiver Clip: \"Spotlight\"</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nEinblick in den Film \"Zoomania\"</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/unterhaltung/tv-film/aktuelle-kinotrailer/exklusiv-trailer-angry-birds-film-31371008\" data-teaser-id=\"31371008\" data-teaser-type=\"VIDEO\"><img src=\"http://i0.web.de/image/006/31371006,pd=2,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"AngryBirds2\" width=\"72\" height=\"54\"/></a> AngryBirds2</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/tv-film/aktuelle-kinotrailer/exklusiver-clip-eddie-the-eagle-31367488\" data-teaser-id=\"31367488\" data-teaser-type=\"VIDEO\"><img src=\"http://i2.web.de/image/486/31367486,pd=2,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"EddieEagleClip\" width=\"72\" height=\"54\"/></a> EddieEagleClip</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/tv-film/aktuelle-kinotrailer/exklusiver-clip-spotlight-31361458\" data-teaser-id=\"31361458\" data-teaser-type=\"VIDEO\"><img src=\"http://i2.web.de/image/456/31361456,pd=2,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"SpotlightClip\" width=\"72\" height=\"54\"/></a> SpotlightClip</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/unterhaltung/tv-film/aktuelle-kinotrailer/exklusiver-clip-zoomania-31359474\" data-teaser-id=\"31359474\" data-teaser-type=\"VIDEO\"><img src=\"http://i1.web.de/image/472/31359472,pd=2,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"ZoomaniaClip\" width=\"72\" height=\"54\"/></a> ZoomaniaClip</li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\nPlötzlich Mutter: Ist das möglich?</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nTödliche Geißel der Menschheit</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nMuss ich zur Krebsvorsorge?</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/gesundheit/500-kalorien-31356692\" data-teaser-id=\"31356692\" data-teaser-type=\"VIDEO\"><img src=\"http://i0.web.de/image/548/31357548,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"\" width=\"72\" height=\"54\"/></a></li>\n<li><a href=\"http://web.de/magazine/gesundheit/gntm-kandidatin-saskia-unbemerkt-schwanger-moeglich-31332426\" data-teaser-id=\"31332426\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/830/31332830,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Geburt Kind OP\" width=\"72\" height=\"54\"/></a> Normalerweise sendet der Körper während einer Schwangerschaft viele Zeichen. Doch nicht immer werden diese von der werdenden Mutter wahrgenommen. (Symbolbild)</li>\n<li><a href=\"http://web.de/magazine/gesundheit/krebs-unbesiegbare-geissel-menschheit-31291766\" data-teaser-id=\"31291766\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/422/31311422,pd=4,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Krebs, Patient, Krankenhaus\" width=\"72\" height=\"54\"/></a> Krebs rafft immer mehr Menschen dahin.</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/gesundheit/krebs-fruehzeitig-erkennen-vorsorgeuntersuchungen-brauche-31298136\" data-teaser-id=\"31298136\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/298/31330298,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Mammographie-Screening\" width=\"72\" height=\"54\"/></a> Das Mammographie-Screening wird Frauen ab 50 alle zwei Jahre empfohlen. Das Verfahren an sich kann jedoch ebenfalls Tumore entstehen lassen.</li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\n\"Bachelorette\" macht Schluss ...</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"12\">\nWas, die sind verwandt?</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nZiemlich dick im Geschäft</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/unterhaltung/stars/liebesnews-woche-liebt-trennt-31363836\" data-teaser-id=\"31363836\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i2.web.de/image/270/31379270,pd=4,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Jenny Elvers, Steffen von der Beeck\" width=\"72\" height=\"54\"/></a> Jenny Elvers im Glück: Ein ganzes Jahr lang konnten sie und ihr Freund Steffen von der Beeck das Geheimnis für sich behalten. Nun verriet Jenny auf ihrem Facebook-Profil, dass sie und Steffen schon seit über einem Jahr verlobt sind. Der Dschungelcamp-Kandidatin schien es lieber zu sein, selbst mit der schönen Botschaft an die Öffentlichkeit zu gehen. So ist sie den Medien zuvorgekommen.</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/tv-film/bachelorette/bachelorette-alisa-patrick-zusammenziehen-31365706\" data-teaser-id=\"31365706\" data-teaser-type=\"VIDEO\"><img src=\"http://i2.web.de/image/704/31365704,pd=3,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Bachelorette_Paar_zieht_zusammen\" width=\"72\" height=\"54\"/></a> Bachelorette_Paar_zieht_zusammen</li>\n<li><a href=\"http://web.de/magazine/unterhaltung/stars/stars-verwandt-haetten-sies-gewusst-30222388\" data-teaser-id=\"30222388\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i1.web.de/image/970/31362970,pd=5,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Melissa McCarthy Jenny McCarthy\" width=\"72\" height=\"54\"/></a> Dass es sich bei Ulknudel Melissa McCarthy (l.) und Ex-Playmate Jenny McCarthy um Cousinen handelt, ist trotz des Nachnamens nur schwer vorstellbar.</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/unterhaltung/stars/stars-dick-geschaeft-31361072\" data-teaser-id=\"31361072\" data-teaser-type=\"SLIDESHOW\"><img src=\"http://i0.web.de/image/460/31361460,pd=7,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Kevin James und Beth Ditto\" width=\"72\" height=\"54\"/></a> Kevin James und Beth Ditto sind \"dick im Geschäft\".</li>\n</ul></div>\n<div class=\"r1\">\n<div class=\"slider-container slider\" data-active-slide=\"1\">\n<div class=\"teaser-content\" data-slide-id=\"2\" readability=\"11\">\nEine Million Kinder in akuter Gefahr</div>\n<div class=\"teaser-content\" data-slide-id=\"3\" readability=\"11\">\nNächstenliebe als Geschenk</div>\n<div class=\"teaser-content\" data-slide-id=\"4\" readability=\"11\">\nUnsere Stiftung feiert Jubiläum</div>\n</div>\n<ul class=\"news-list\"><li class=\"first active\"><a href=\"http://web.de/magazine/unicef/gewinnspiel-aktion-geschenkte-tag-treffen-mats-hummels-31362846\" data-teaser-id=\"31362846\" data-teaser-type=\"DEFAULT\"><img src=\"http://i0.web.de/image/858/31362858,pd=6,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"UNICEF, United Internet for UNICEF, Mats Hummels, Gewinnspiel\" width=\"72\" height=\"54\"/></a> Anlässlich der Aktion \"Der geschenkte Tag\": Gewinnen Sie ein Treffen mit Mats Hummels.</li>\n<li><a href=\"http://web.de/magazine/unicef/unicef-million-kinder-ost-suedafrika-schwer-unterernaehrt-31356858\" data-teaser-id=\"31356858\" data-teaser-type=\"DEFAULT\"><img src=\"http://i0.web.de/image/286/31358286,pd=2,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"Mangelernährung, UNICEF\" width=\"72\" height=\"54\"/></a> Laut UNICEF sind knapp eine Million Kinder in Afrika schwer unterernährt.</li>\n<li><a href=\"http://web.de/magazine/unicef/valentinstag-2016-naechstenliebe-schoenste-geschenk-31347082\" data-teaser-id=\"31347082\" data-teaser-type=\"DEFAULT\"><img src=\"http://i2.web.de/image/080/31347080,pd=1,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"UNICEF, United Internet for UNICEF\" width=\"72\" height=\"54\"/></a> Zum Valentinstag wollen wir auch an diejenigen denken, denen es nicht so gut geht.</li>\n<li class=\"last\"><a href=\"http://web.de/magazine/unicef/united-internet-unicef-feiert-jubilaeum-unterstuetzer-31192220\" data-teaser-id=\"31192220\" data-teaser-type=\"DEFAULT\"><img src=\"http://i1.web.de/image/234/31192234,pd=7,h=54,mxh=600,mxw=800,w=72.jpg\" alt=\"UNICEF, United Internet for UNICEF\" width=\"72\" height=\"54\"/></a> Die Stiftung United Internet for UNICEF sagt DANKE.</li>\n</ul></div>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "de",
-        "reading_time": 4,
-        "domain_name": "web.de",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 48,
-        "title": "OpenSSH Server on Arch Linux | DominicM test",
-        "url": "http://dominicm.com/openssh-server-arch-linux/",
-        "content": "<p><a href=\"http://dominicm.com/openssh-server-arch-linux/\"><img class=\"aligncenter wp-image-2354 size-medium\" title=\"OpenSSH Server on Arch Linux\" src=\"http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux-450x450.png\" alt=\"OpenSSH Server on Arch Linux\" width=\"450\" height=\"450\" srcset=\"http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux-150x150.png 150w, http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux-450x450.png 450w, http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux-768x768.png 768w, http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux-1024x1024.png 1024w, http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux-60x60.png 60w, http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux.png 1200w\" sizes=\"(max-width: 450px) 100vw, 450px\"/></a></p>\n<p>OpenSSH allows powerful and convenient way to remotely access remote systems. However it creates a possible security weakness which is one reason it is not installed by default. With proper configuration it can be secured and allows the administration of headless servers servers or other devices.</p>\n\n<h2>Install OpenSSH</h2>\n<p>Install from the official repository.</p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\nsudo pacman -S openssh\n</pre>\n\n<h2>Configure OpenSSH</h2>\n<p>Open the configuration file.</p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\nsudo nano /etc/ssh/sshd_config\n</pre>\n\n<p>Uncomment and or modify the desired lines in the configuration file and save.</p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\nAllowUsers user1 user2\nAllowGroups group1 group2\nPermitRootLogin no\nPort 22\n</pre>\n<p>Only certain users can be allowed to login by listing them after <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">AllowUsers</code>. Analogously <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">AllowGroups</code> option allows users in listed groups to login. Root login can be controlled with <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">PermitRootLogin</code> option, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">yes</code> to allow, <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">no</code> to disallow and <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">without-password</code> to allow only with public key authentication. This should be set to <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">no</code> in almost always for security purposes. Root access can still be gained with the use of <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sudo</code> or <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">su</code> commands.</p>\n<p>Default <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">Port</code> is set to <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">22</code> which can make it easier for automated bots to attempt to login. In practice changing the default SSH port does not improve security but can reduce attempted logins which can fill the logs with errors. Using ports above <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">1024</code> can actually be detrimental to security as ports below <code class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">1024</code> are restricted to root access while ports above can be listened to by non-root users.</p>\n\n<p>For improved security and convenience it is also recommended to configure password-less SSH logins. Optionally also configure print Screenfetch on SSH login.</p>\n\n<h2>Run OpenSSH</h2>\n<p>SSH can be started as a daemon with sshd however this is not recommended in most cases. It is better to start SSH on demand. When a socket service is started it will listen for incoming connections and will only then start the daemon process.</p>\n\n<p>Start the socket service.</p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\nsudo systemctl start sshd.socket\n</pre>\n\n<p>Enable the socket service to run on boot.</p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\">\nsudo systemctl enable sshd.socket\n</pre>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en-GB",
-        "reading_time": 1,
-        "domain_name": "dominicm.com",
-        "preview_picture": "http://dominicm.com/wp-content/uploads/2016/01/ssh-arch-linux.png",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 39,
-        "title": "Site Moved | Site Help",
-        "url": "http://g1.com/help/sitemoved.asp",
-        "content": "<ul id=\"breadcrumbs\"><li class=\"level1\"><a href=\"http://g1.com/\" rel=\"home\">Home</a></li>\n<li><a href=\"http://g1.com/Support/\">Support</a></li>\n<li><a href=\"http://g1.com/Help/\">Site Help</a></li>\n<li id=\"lastItem\">Site Moved</li>\n</ul>\n<p>The Group 1 Software website has been discontinued and has been replaced by the Pitney Bowes Software website. For support of your Group 1 Software product, visit <a href=\"http://www.g1.com/Support/\" title=\"Group 1 Support website\">http://www.g1.com/Support/</a>. For information about our products, please visit <a href=\"http://www.pb.com/software\" title=\"Pitney Bowes Software website\">http://www.pb.com/software</a>.</p>\n<ul id=\"altPage\"><li><a href=\"http://g1.com/Help/TellAFriend.asp\" class=\"envelope\">Tell a Friend</a></li>\n</ul>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "en",
-        "reading_time": 0,
-        "domain_name": "g1.com",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 38,
-        "title": "#Maroc : le stylo anti-pédophiles EAGLE d’AMESYS est moins bien configuré que les faux-lowers Twitter du roi Mohammed VI",
-        "url": "https://reflets.info/maroc-le-stylo-anti-pedophiles-eagle-damesys-est-moins-bien-configure-que-les-faux-lowers-twitter-du-roi-mohammed-vi/",
-        "content": "<p><a href=\"http://reflets.info/wp-content/uploads/2013/08/pedobear.jpg\" data-rel=\"lightbox-0\" title=\"\"><img class=\"size-medium wp-image-26091 alignright\" alt=\"pedobear\" src=\"http://reflets.info/wp-content/uploads/2013/08/pedobear-350x301.jpg\" width=\"350\" height=\"301\" srcset=\"https://reflets.info/wp-content/uploads/2013/08/pedobear-350x301.jpg 350w, https://reflets.info/wp-content/uploads/2013/08/pedobear-550x473.jpg 550w, https://reflets.info/wp-content/uploads/2013/08/pedobear.jpg 610w\" sizes=\"(max-width: 350px) 100vw, 350px\"/></a>Le EAGLE déployé par Amesys / Bull au Maroc n’y aura rien fait. Quand la justice attrape un pédo-criminel, ce dernier trouve le moyen de se faire gracier. On peut au bas mot parler d’un sérieux dysfonctionnement de l’institution judiciaire et se demander quel genre de bug qui a pu provoquer ce malaise. En attendant, les bots Twitter de Sa Majesté sont bien présents pour tenter de récupérer la boulette. Mais comme d’habitude dans ce genre de cas, c’est tellement mal fait que ça se voit beaucoup.</p>\n<h3 class=\"c3\">Previously in PopCorn</h3>\n<p class=\"c4\">Deux millions d’euros rien qu’en disques durs, des mois de déploiement. Cet EAGLE béta testé par Kadhafi sur sa population est maintenant en production au Maroc. Evidemment Amesys / Bull contribue toujours activement (mais <a title=\"Advanced Middle East Systems, le Amesys nouveau est de retour en Libye\" href=\"http://reflets.info/advanced-middle-east-systems-le-amesys-nouveau-est-de-retour-en-libye/\">plus sous pavillon français</a> depuis un sombre <a title=\"Bull vend Eagle… à un actionnaire de Crescendo, qui est l’actionnaire principal de… Bull\" href=\"http://reflets.info/bull-vend-eagle-a-un-actionnaire-de-crescendo-qui-est-lactionnaire-principal-de-bull/\">tour de passe passe</a>) au paramétrage et à la formation des autorités marocaines pour mettre sur écoute l’ensemble de la population marocaine. Popcorn c’est le petit nom du projet du EAGLE marocain, nous vous en avions déjà assez largement parlé. L’amitié franco-marocaine c’est une bien belle histoire : ses accords de coopération policière, sa lutte contre les pédophiles et les narco trafiquants, et évidemment, la mise sur écoute téléphonique de ses 32 millions d’habitants et l’interception des communications de ses 1,5 millions d’accès Internet et de ses 14 millions d’internautes…</p>\n<p class=\"c4\">Il faut dire qu’EAGLE partait avec de sérieux avantages sur la concurrence, les technologies de BULL ont déjà fait leur preuve en Libye (projet CANDY), au Qatar (projet FINGER), au GABON  (projet CROCO) ainsi que dans d’autres pays ou l’amitié bilatérale se traduit également à grand renfort de cyber-matraques.</p>\n<h3 class=\"c3\">Le stylo traqueur de pédophiles</h3>\n<p class=\"c4\">Quand on demandait à Amesys pourquoi et comment Abdallah al Senousi, un terroriste notoire, s’était vu confier un outil comme Eagle en Libye pour surveiller l’ensemble de sa population, la réponse de Bruno Samtmann, directeur commercial d’Amesys, se faisait rassurante, pour lui, <a href=\"http://reflets.info/amesys-la-justice-et-la-morale/\" target=\"_blank\">Amesys avait fourni à Kadhafi un stylo traqueur de pédophiles, de narco trafiquants et terroristes</a>… ça ne s’invente pas. C’est exactement ce même genre de stylo qu’Amesys a fournit aux autorités marocaines qui a donc en toute logique placé l’ensemble de la population du pays sous écoute.</p>\n<iframe src=\"http://player.vimeo.com/video/41977398?title=0&amp;byline=0&amp;portrait=0&amp;color=ffffff\" height=\"400\" width=\"500\" allowfullscreen=\"\" frameborder=\"0\"> </iframe>\n<p class=\"c5\"><a href=\"http://vimeo.com/41977398\" data-rel=\"lightbox-video-0\">Traqué – documentaire de Paul Moreira – Canal+</a> from <a href=\"http://vimeo.com/fhimtcom\">fhimt.com</a> on <a href=\"https://vimeo.com\">Vimeo</a>.</p>\n<p class=\"c4\">Manque de bol, pour une fois que le Maroc arrête un pédophile, voilà que le roi le gracie ! Mais à quoi peut bien servir cet Eagle au juste s’il ne permet même pas aux autorités marocaines de conserver en prison des pédophiles qu’ils ont déjà arrêté, condamné et mis en prison ?</p>\n<h3>Un plugin Eagle à bots Twitter ?</h3>\n<p class=\"c4\">Pour désamorcer la contestation au sujet du Daniel Gate sur les réseaux sociaux, les matraques ne sont pas encore parfaitement au point. Configurer un Eagle, c’est un peu long voyez vous. On utilise donc, tout naturellement, une armée de bots, des faux comptes Twitter pour twitter et retweeter la propagande de Sa Majesté. L’<a href=\"https://fr.lakome.com/index.php/maroc/1234-twitter-les-robots-de-sa-majeste\" target=\"_blank\">excellent site d’information Lakome nous explique la supercherie dans le détail</a>.</p>\n<p class=\"c5\"><a href=\"http://reflets.info/wp-content/uploads/2013/08/tweeter-robot-m6-total.jpg\" data-rel=\"lightbox-1\" title=\"\"><img class=\"aligncenter size-large wp-image-26093\" alt=\"tweeter robot m6 total\" src=\"http://reflets.info/wp-content/uploads/2013/08/tweeter-robot-m6-total-550x386.jpg\" width=\"550\" height=\"386\" srcset=\"https://reflets.info/wp-content/uploads/2013/08/tweeter-robot-m6-total-350x246.jpg 350w, https://reflets.info/wp-content/uploads/2013/08/tweeter-robot-m6-total-550x386.jpg 550w, https://reflets.info/wp-content/uploads/2013/08/tweeter-robot-m6-total.jpg 579w\" sizes=\"(max-width: 550px) 100vw, 550px\"/></a></p>\n<p class=\"c4\">Pour parfaire l’attirail autoritariste et adapter son produit aux challenges de demain, nous suggérons donc à Amesys, si ce n’est déjà fait, un plugin Eagle pour créer des bots à tweeter des âneries de manière grossière, ce afin d’éviter aux contribuables marocains d’avoir à payer grassement des agences de communication pour ce genre de propagande ridicule.</p>\n<p class=\"c5\"><a href=\"http://reflets.info/wp-content/uploads/2013/08/tweeter-robot10-liste.jpg\" data-rel=\"lightbox-2\" title=\"\"><img class=\"aligncenter size-large wp-image-26092\" alt=\"tweeter robot10 liste\" src=\"http://reflets.info/wp-content/uploads/2013/08/tweeter-robot10-liste-550x503.jpg\" width=\"550\" height=\"503\" srcset=\"https://reflets.info/wp-content/uploads/2013/08/tweeter-robot10-liste-350x320.jpg 350w, https://reflets.info/wp-content/uploads/2013/08/tweeter-robot10-liste-550x503.jpg 550w, https://reflets.info/wp-content/uploads/2013/08/tweeter-robot10-liste.jpg 573w\" sizes=\"(max-width: 550px) 100vw, 550px\"/></a></p>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "language": "fr-FR",
-        "reading_time": 3,
-        "domain_name": "reflets.info",
-        "preview_picture": "http://reflets.info/wp-content/uploads/2013/08/tweeter-robot10-liste-550x503.jpg",
-        "tags": []
-    },
-    {
-        "is_archived": 1,
-        "created_at": "2016-09-08T11:55:58+0200",
-        "updated_at": "2016-09-08T11:57:16+0200",
-        "is_starred": 0,
-        "id": 3,
-        "title": "Simple Cloud Infrastructure for Developers",
-        "url": "https://www.digitalocean.com/",
-        "content": "<div class=\"wrapper-full\">\n<div class=\"container lighter-grey wrap-content\">\n<h3>Simple to Set Up. Flexible to Scale.</h3>\n<ul id=\"simple-setup\"><li readability=\"1\"><img src=\"https://www.digitalocean.com/assets/images/join/deploy-with-ease-ccf9cdee.svg\" alt=\"Deploy with Ease\"/><h4>Easy to Deploy</h4>\n<p>Spin up a Droplet complete with full root access in just a few clicks from our Control Panel.</p>\n</li>\n<li readability=\"3\"><img src=\"https://www.digitalocean.com/assets/images/join/build-to-scale-4d39297b.svg\" alt=\"Build to Scale\"/><h4>Built to Scale</h4>\n<p>Scale your applications with our API and Floating IPs. As you grow, manage your apps with team accounts.</p>\n</li>\n<li readability=\"3\"><img src=\"https://www.digitalocean.com/assets/images/join/select-location-e2a393dc.svg\" alt=\"Select Location\"/><h4>Reliable and Available</h4>\n<p>Select from datacenter regions around the world based on latency, or deploy across regions for redundancy.</p>\n</li>\n</ul></div>\n<div class=\"hide-group container wrap-content\" readability=\"32\">\n<h3 class=\"hasSub\">Straightforward Pricing</h3>\n<ul class=\"pricing-chart\"><li readability=\"2\">\n<p>5/mo $0.007/hour</p>\n<p>512MB / 1 cpu 20GB SSD Disk 1TB Transfer</p>\n</li>\n<li readability=\"2\">\n<p>10/mo $0.015/hour</p>\n<p>1GB / 1 cpu 30GB SSD Disk 2TB Transfer</p>\n</li>\n<li readability=\"2\">\n<p>20/mo $0.03/hour</p>\nMOST POPULAR PLAN\n<p>2GB / 2 cpu 40GB SSD Disk 3TB Transfer</p>\n</li>\n<li readability=\"2\">\n<p>40/mo $0.06/hour</p>\n<p>4GB / 2 cpu 60GB SSD Disk 4TB Transfer</p>\n</li>\n<li readability=\"2\">\n<p>80/mo $0.119/hour</p>\n<p>8GB / 4 cpu 80GB SSD Disk 5TB Transfer</p>\n</li>\n</ul><a href=\"https://cloud.digitalocean.com/registrations/new\" class=\"Button--blue\">Get Started</a></div>\n<div class=\"container wrap-content\" id=\"teams-on-do\" readability=\"29\">\n<h4 class=\"caps\">Teams on DigitalOcean</h4>\n<img class=\"case-study\" src=\"https://www.digitalocean.com/assets/images/ghost-676798cc.svg\"/><p>Blog publishing platform Ghost scaled to support one million customers.</p>\n<a href=\"https://www.digitalocean.com/customers/ghost/\" class=\"Button Button--blue\">Learn how they did it</a> <img class=\"teams-on-do\" src=\"https://www.digitalocean.com/assets/images/companies-944c4b3b.svg\"/></div>\n<div class=\"container wrap-content\" id=\"sales-cta\" readability=\"32\">\n<h3>Scaling or Migrating? Let's talk.</h3>\n<p>Our team is ready to answer your questions and help you get up and running.</p>\n<a class=\"Button Button--white\" href=\"https://www.digitalocean.com/company/contact/sales/\">Get in touch</a></div>\n</div>\n",
-        "annotations": [],
-        "mimetype": "text/html",
-        "reading_time": 0,
-        "domain_name": "www.digitalocean.com",
-        "preview_picture": "https://www.digitalocean.com/assets/images/logo-3b02463b.jpg",
-        "tags": []
     }
 ]
index 44b9a0301c51e11b4ba255c6b0c13a266f6f0af8..b46256a6eea17b76be1f984e60906ab6effe0352 100644 (file)
@@ -30,8 +30,8 @@ class ManageControllerTest extends WallabagCoreTestCase
         $form = $crawler->selectButton('user.form.save')->form(array(
             'new_user[username]' => 'test_user',
             'new_user[email]' => 'test@test.io',
-            'new_user[plainPassword][first]' => 'test',
-            'new_user[plainPassword][second]' => 'test',
+            'new_user[plainPassword][first]' => 'testtest',
+            'new_user[plainPassword][second]' => 'testtest',
         ));
 
         $client->submit($form);
index 361b0f6ee3855dfe7ff839ff000108525e359874..54188383ba0ed8fbe9cf7d150f5f44a7d6db767b 100644 (file)
@@ -1,2 +1,2 @@
-.materialize-red{background-color:#e51c23!important}.materialize-red-text{color:#e51c23!important}.materialize-red.lighten-5{background-color:#fdeaeb!important}.materialize-red-text.text-lighten-5{color:#fdeaeb!important}.materialize-red.lighten-4{background-color:#f8c1c3!important}.materialize-red-text.text-lighten-4{color:#f8c1c3!important}.materialize-red.lighten-3{background-color:#f3989b!important}.materialize-red-text.text-lighten-3{color:#f3989b!important}.materialize-red.lighten-2{background-color:#ee6e73!important}.materialize-red-text.text-lighten-2{color:#ee6e73!important}.materialize-red.lighten-1{background-color:#ea454b!important}.materialize-red-text.text-lighten-1{color:#ea454b!important}.materialize-red.darken-1{background-color:#d0181e!important}.materialize-red-text.text-darken-1{color:#d0181e!important}.materialize-red.darken-2{background-color:#b9151b!important}.materialize-red-text.text-darken-2{color:#b9151b!important}.materialize-red.darken-3{background-color:#a21318!important}.materialize-red-text.text-darken-3{color:#a21318!important}.materialize-red.darken-4{background-color:#8b1014!important}.materialize-red-text.text-darken-4{color:#8b1014!important}.red{background-color:#f44336!important}.red-text{color:#f44336!important}.red.lighten-5{background-color:#ffebee!important}.red-text.text-lighten-5{color:#ffebee!important}.red.lighten-4{background-color:#ffcdd2!important}.red-text.text-lighten-4{color:#ffcdd2!important}.red.lighten-3{background-color:#ef9a9a!important}.red-text.text-lighten-3{color:#ef9a9a!important}.red.lighten-2{background-color:#e57373!important}.red-text.text-lighten-2{color:#e57373!important}.red.lighten-1{background-color:#ef5350!important}.red-text.text-lighten-1{color:#ef5350!important}.red.darken-1{background-color:#e53935!important}.red-text.text-darken-1{color:#e53935!important}.red.darken-2{background-color:#d32f2f!important}.red-text.text-darken-2{color:#d32f2f!important}.red.darken-3{background-color:#c62828!important}.red-text.text-darken-3{color:#c62828!important}.red.darken-4{background-color:#b71c1c!important}.red-text.text-darken-4{color:#b71c1c!important}.red.accent-1{background-color:#ff8a80!important}.red-text.text-accent-1{color:#ff8a80!important}.red.accent-2{background-color:#ff5252!important}.red-text.text-accent-2{color:#ff5252!important}.red.accent-3{background-color:#ff1744!important}.red-text.text-accent-3{color:#ff1744!important}.red.accent-4{background-color:#d50000!important}.red-text.text-accent-4{color:#d50000!important}.pink{background-color:#e91e63!important}.pink-text{color:#e91e63!important}.pink.lighten-5{background-color:#fce4ec!important}.pink-text.text-lighten-5{color:#fce4ec!important}.pink.lighten-4{background-color:#f8bbd0!important}.pink-text.text-lighten-4{color:#f8bbd0!important}.pink.lighten-3{background-color:#f48fb1!important}.pink-text.text-lighten-3{color:#f48fb1!important}.pink.lighten-2{background-color:#f06292!important}.pink-text.text-lighten-2{color:#f06292!important}.pink.lighten-1{background-color:#ec407a!important}.pink-text.text-lighten-1{color:#ec407a!important}.pink.darken-1{background-color:#d81b60!important}.pink-text.text-darken-1{color:#d81b60!important}.pink.darken-2{background-color:#c2185b!important}.pink-text.text-darken-2{color:#c2185b!important}.pink.darken-3{background-color:#ad1457!important}.pink-text.text-darken-3{color:#ad1457!important}.pink.darken-4{background-color:#880e4f!important}.pink-text.text-darken-4{color:#880e4f!important}.pink.accent-1{background-color:#ff80ab!important}.pink-text.text-accent-1{color:#ff80ab!important}.pink.accent-2{background-color:#ff4081!important}.pink-text.text-accent-2{color:#ff4081!important}.pink.accent-3{background-color:#f50057!important}.pink-text.text-accent-3{color:#f50057!important}.pink.accent-4{background-color:#c51162!important}.pink-text.text-accent-4{color:#c51162!important}.purple{background-color:#9c27b0!important}.purple-text{color:#9c27b0!important}.purple.lighten-5{background-color:#f3e5f5!important}.purple-text.text-lighten-5{color:#f3e5f5!important}.purple.lighten-4{background-color:#e1bee7!important}.purple-text.text-lighten-4{color:#e1bee7!important}.purple.lighten-3{background-color:#ce93d8!important}.purple-text.text-lighten-3{color:#ce93d8!important}.purple.lighten-2{background-color:#ba68c8!important}.purple-text.text-lighten-2{color:#ba68c8!important}.purple.lighten-1{background-color:#ab47bc!important}.purple-text.text-lighten-1{color:#ab47bc!important}.purple.darken-1{background-color:#8e24aa!important}.purple-text.text-darken-1{color:#8e24aa!important}.purple.darken-2{background-color:#7b1fa2!important}.purple-text.text-darken-2{color:#7b1fa2!important}.purple.darken-3{background-color:#6a1b9a!important}.purple-text.text-darken-3{color:#6a1b9a!important}.purple.darken-4{background-color:#4a148c!important}.purple-text.text-darken-4{color:#4a148c!important}.purple.accent-1{background-color:#ea80fc!important}.purple-text.text-accent-1{color:#ea80fc!important}.purple.accent-2{background-color:#e040fb!important}.purple-text.text-accent-2{color:#e040fb!important}.purple.accent-3{background-color:#d500f9!important}.purple-text.text-accent-3{color:#d500f9!important}.purple.accent-4{background-color:#a0f!important}.purple-text.text-accent-4{color:#a0f!important}.deep-purple{background-color:#673ab7!important}.deep-purple-text{color:#673ab7!important}.deep-purple.lighten-5{background-color:#ede7f6!important}.deep-purple-text.text-lighten-5{color:#ede7f6!important}.deep-purple.lighten-4{background-color:#d1c4e9!important}.deep-purple-text.text-lighten-4{color:#d1c4e9!important}.deep-purple.lighten-3{background-color:#b39ddb!important}.deep-purple-text.text-lighten-3{color:#b39ddb!important}.deep-purple.lighten-2{background-color:#9575cd!important}.deep-purple-text.text-lighten-2{color:#9575cd!important}.deep-purple.lighten-1{background-color:#7e57c2!important}.deep-purple-text.text-lighten-1{color:#7e57c2!important}.deep-purple.darken-1{background-color:#5e35b1!important}.deep-purple-text.text-darken-1{color:#5e35b1!important}.deep-purple.darken-2{background-color:#512da8!important}.deep-purple-text.text-darken-2{color:#512da8!important}.deep-purple.darken-3{background-color:#4527a0!important}.deep-purple-text.text-darken-3{color:#4527a0!important}.deep-purple.darken-4{background-color:#311b92!important}.deep-purple-text.text-darken-4{color:#311b92!important}.deep-purple.accent-1{background-color:#b388ff!important}.deep-purple-text.text-accent-1{color:#b388ff!important}.deep-purple.accent-2{background-color:#7c4dff!important}.deep-purple-text.text-accent-2{color:#7c4dff!important}.deep-purple.accent-3{background-color:#651fff!important}.deep-purple-text.text-accent-3{color:#651fff!important}.deep-purple.accent-4{background-color:#6200ea!important}.deep-purple-text.text-accent-4{color:#6200ea!important}.indigo{background-color:#3f51b5!important}.indigo-text{color:#3f51b5!important}.indigo.lighten-5{background-color:#e8eaf6!important}.indigo-text.text-lighten-5{color:#e8eaf6!important}.indigo.lighten-4{background-color:#c5cae9!important}.indigo-text.text-lighten-4{color:#c5cae9!important}.indigo.lighten-3{background-color:#9fa8da!important}.indigo-text.text-lighten-3{color:#9fa8da!important}.indigo.lighten-2{background-color:#7986cb!important}.indigo-text.text-lighten-2{color:#7986cb!important}.indigo.lighten-1{background-color:#5c6bc0!important}.indigo-text.text-lighten-1{color:#5c6bc0!important}.indigo.darken-1{background-color:#3949ab!important}.indigo-text.text-darken-1{color:#3949ab!important}.indigo.darken-2{background-color:#303f9f!important}.indigo-text.text-darken-2{color:#303f9f!important}.indigo.darken-3{background-color:#283593!important}.indigo-text.text-darken-3{color:#283593!important}.indigo.darken-4{background-color:#1a237e!important}.indigo-text.text-darken-4{color:#1a237e!important}.indigo.accent-1{background-color:#8c9eff!important}.indigo-text.text-accent-1{color:#8c9eff!important}.indigo.accent-2{background-color:#536dfe!important}.indigo-text.text-accent-2{color:#536dfe!important}.indigo.accent-3{background-color:#3d5afe!important}.indigo-text.text-accent-3{color:#3d5afe!important}.indigo.accent-4{background-color:#304ffe!important}.indigo-text.text-accent-4{color:#304ffe!important}.blue{background-color:#2196f3!important}.blue-text{color:#2196f3!important}.blue.lighten-5{background-color:#e3f2fd!important}.blue-text.text-lighten-5{color:#e3f2fd!important}.blue.lighten-4{background-color:#bbdefb!important}.blue-text.text-lighten-4{color:#bbdefb!important}.blue.lighten-3{background-color:#90caf9!important}.blue-text.text-lighten-3{color:#90caf9!important}.blue.lighten-2{background-color:#64b5f6!important}.blue-text.text-lighten-2{color:#64b5f6!important}.blue.lighten-1{background-color:#42a5f5!important}.blue-text.text-lighten-1{color:#42a5f5!important}.blue.darken-1{background-color:#1e88e5!important}.blue-text.text-darken-1{color:#1e88e5!important}.blue.darken-2{background-color:#1976d2!important}.blue-text.text-darken-2{color:#1976d2!important}.blue.darken-3{background-color:#1565c0!important}.blue-text.text-darken-3{color:#1565c0!important}.blue.darken-4{background-color:#0d47a1!important}.blue-text.text-darken-4{color:#0d47a1!important}.blue.accent-1{background-color:#82b1ff!important}.blue-text.text-accent-1{color:#82b1ff!important}.blue.accent-2{background-color:#448aff!important}.blue-text.text-accent-2{color:#448aff!important}.blue.accent-3{background-color:#2979ff!important}.blue-text.text-accent-3{color:#2979ff!important}.blue.accent-4{background-color:#2962ff!important}.blue-text.text-accent-4{color:#2962ff!important}.light-blue{background-color:#03a9f4!important}.light-blue-text{color:#03a9f4!important}.light-blue.lighten-5{background-color:#e1f5fe!important}.light-blue-text.text-lighten-5{color:#e1f5fe!important}.light-blue.lighten-4{background-color:#b3e5fc!important}.light-blue-text.text-lighten-4{color:#b3e5fc!important}.light-blue.lighten-3{background-color:#81d4fa!important}.light-blue-text.text-lighten-3{color:#81d4fa!important}.light-blue.lighten-2{background-color:#4fc3f7!important}.light-blue-text.text-lighten-2{color:#4fc3f7!important}.light-blue.lighten-1{background-color:#29b6f6!important}.light-blue-text.text-lighten-1{color:#29b6f6!important}.light-blue.darken-1{background-color:#039be5!important}.light-blue-text.text-darken-1{color:#039be5!important}.light-blue.darken-2{background-color:#0288d1!important}.light-blue-text.text-darken-2{color:#0288d1!important}.light-blue.darken-3{background-color:#0277bd!important}.light-blue-text.text-darken-3{color:#0277bd!important}.light-blue.darken-4{background-color:#01579b!important}.light-blue-text.text-darken-4{color:#01579b!important}.light-blue.accent-1{background-color:#80d8ff!important}.light-blue-text.text-accent-1{color:#80d8ff!important}.light-blue.accent-2{background-color:#40c4ff!important}.light-blue-text.text-accent-2{color:#40c4ff!important}.light-blue.accent-3{background-color:#00b0ff!important}.light-blue-text.text-accent-3{color:#00b0ff!important}.light-blue.accent-4{background-color:#0091ea!important}.light-blue-text.text-accent-4{color:#0091ea!important}.cyan{background-color:#00bcd4!important}.cyan-text{color:#00bcd4!important}.cyan.lighten-5{background-color:#e0f7fa!important}.cyan-text.text-lighten-5{color:#e0f7fa!important}.cyan.lighten-4{background-color:#b2ebf2!important}.cyan-text.text-lighten-4{color:#b2ebf2!important}.cyan.lighten-3{background-color:#80deea!important}.cyan-text.text-lighten-3{color:#80deea!important}.cyan.lighten-2{background-color:#4dd0e1!important}.cyan-text.text-lighten-2{color:#4dd0e1!important}.cyan.lighten-1{background-color:#26c6da!important}.cyan-text.text-lighten-1{color:#26c6da!important}.cyan.darken-1{background-color:#00acc1!important}.cyan-text.text-darken-1{color:#00acc1!important}.cyan.darken-2{background-color:#0097a7!important}.cyan-text.text-darken-2{color:#0097a7!important}.cyan.darken-3{background-color:#00838f!important}.cyan-text.text-darken-3{color:#00838f!important}.cyan.darken-4{background-color:#006064!important}.cyan-text.text-darken-4{color:#006064!important}.cyan.accent-1{background-color:#84ffff!important}.cyan-text.text-accent-1{color:#84ffff!important}.cyan.accent-2{background-color:#18ffff!important}.cyan-text.text-accent-2{color:#18ffff!important}.cyan.accent-3{background-color:#00e5ff!important}.cyan-text.text-accent-3{color:#00e5ff!important}.cyan.accent-4{background-color:#00b8d4!important}.cyan-text.text-accent-4{color:#00b8d4!important}.teal{background-color:#009688!important}.teal-text{color:#009688!important}.teal.lighten-5{background-color:#e0f2f1!important}.teal-text.text-lighten-5{color:#e0f2f1!important}.teal.lighten-4{background-color:#b2dfdb!important}.teal-text.text-lighten-4{color:#b2dfdb!important}.teal.lighten-3{background-color:#80cbc4!important}.teal-text.text-lighten-3{color:#80cbc4!important}.teal.lighten-2{background-color:#4db6ac!important}.teal-text.text-lighten-2{color:#4db6ac!important}.teal.lighten-1{background-color:#26a69a!important}.teal-text.text-lighten-1{color:#26a69a!important}.teal.darken-1{background-color:#00897b!important}.teal-text.text-darken-1{color:#00897b!important}.teal.darken-2{background-color:#00796b!important}.teal-text.text-darken-2{color:#00796b!important}.teal.darken-3{background-color:#00695c!important}.teal-text.text-darken-3{color:#00695c!important}.teal.darken-4{background-color:#004d40!important}.teal-text.text-darken-4{color:#004d40!important}.teal.accent-1{background-color:#a7ffeb!important}.teal-text.text-accent-1{color:#a7ffeb!important}.teal.accent-2{background-color:#64ffda!important}.teal-text.text-accent-2{color:#64ffda!important}.teal.accent-3{background-color:#1de9b6!important}.teal-text.text-accent-3{color:#1de9b6!important}.teal.accent-4{background-color:#00bfa5!important}.teal-text.text-accent-4{color:#00bfa5!important}.green{background-color:#4caf50!important}.green-text{color:#4caf50!important}.green.lighten-5{background-color:#e8f5e9!important}.green-text.text-lighten-5{color:#e8f5e9!important}.green.lighten-4{background-color:#c8e6c9!important}.green-text.text-lighten-4{color:#c8e6c9!important}.green.lighten-3{background-color:#a5d6a7!important}.green-text.text-lighten-3{color:#a5d6a7!important}.green.lighten-2{background-color:#81c784!important}.green-text.text-lighten-2{color:#81c784!important}.green.lighten-1{background-color:#66bb6a!important}.green-text.text-lighten-1{color:#66bb6a!important}.green.darken-1{background-color:#43a047!important}.green-text.text-darken-1{color:#43a047!important}.green.darken-2{background-color:#388e3c!important}.green-text.text-darken-2{color:#388e3c!important}.green.darken-3{background-color:#2e7d32!important}.green-text.text-darken-3{color:#2e7d32!important}.green.darken-4{background-color:#1b5e20!important}.green-text.text-darken-4{color:#1b5e20!important}.green.accent-1{background-color:#b9f6ca!important}.green-text.text-accent-1{color:#b9f6ca!important}.green.accent-2{background-color:#69f0ae!important}.green-text.text-accent-2{color:#69f0ae!important}.green.accent-3{background-color:#00e676!important}.green-text.text-accent-3{color:#00e676!important}.green.accent-4{background-color:#00c853!important}.green-text.text-accent-4{color:#00c853!important}.light-green{background-color:#8bc34a!important}.light-green-text{color:#8bc34a!important}.light-green.lighten-5{background-color:#f1f8e9!important}.light-green-text.text-lighten-5{color:#f1f8e9!important}.light-green.lighten-4{background-color:#dcedc8!important}.light-green-text.text-lighten-4{color:#dcedc8!important}.light-green.lighten-3{background-color:#c5e1a5!important}.light-green-text.text-lighten-3{color:#c5e1a5!important}.light-green.lighten-2{background-color:#aed581!important}.light-green-text.text-lighten-2{color:#aed581!important}.light-green.lighten-1{background-color:#9ccc65!important}.light-green-text.text-lighten-1{color:#9ccc65!important}.light-green.darken-1{background-color:#7cb342!important}.light-green-text.text-darken-1{color:#7cb342!important}.light-green.darken-2{background-color:#689f38!important}.light-green-text.text-darken-2{color:#689f38!important}.light-green.darken-3{background-color:#558b2f!important}.light-green-text.text-darken-3{color:#558b2f!important}.light-green.darken-4{background-color:#33691e!important}.light-green-text.text-darken-4{color:#33691e!important}.light-green.accent-1{background-color:#ccff90!important}.light-green-text.text-accent-1{color:#ccff90!important}.light-green.accent-2{background-color:#b2ff59!important}.light-green-text.text-accent-2{color:#b2ff59!important}.light-green.accent-3{background-color:#76ff03!important}.light-green-text.text-accent-3{color:#76ff03!important}.light-green.accent-4{background-color:#64dd17!important}.light-green-text.text-accent-4{color:#64dd17!important}.lime{background-color:#cddc39!important}.lime-text{color:#cddc39!important}.lime.lighten-5{background-color:#f9fbe7!important}.lime-text.text-lighten-5{color:#f9fbe7!important}.lime.lighten-4{background-color:#f0f4c3!important}.lime-text.text-lighten-4{color:#f0f4c3!important}.lime.lighten-3{background-color:#e6ee9c!important}.lime-text.text-lighten-3{color:#e6ee9c!important}.lime.lighten-2{background-color:#dce775!important}.lime-text.text-lighten-2{color:#dce775!important}.lime.lighten-1{background-color:#d4e157!important}.lime-text.text-lighten-1{color:#d4e157!important}.lime.darken-1{background-color:#c0ca33!important}.lime-text.text-darken-1{color:#c0ca33!important}.lime.darken-2{background-color:#afb42b!important}.lime-text.text-darken-2{color:#afb42b!important}.lime.darken-3{background-color:#9e9d24!important}.lime-text.text-darken-3{color:#9e9d24!important}.lime.darken-4{background-color:#827717!important}.lime-text.text-darken-4{color:#827717!important}.lime.accent-1{background-color:#f4ff81!important}.lime-text.text-accent-1{color:#f4ff81!important}.lime.accent-2{background-color:#eeff41!important}.lime-text.text-accent-2{color:#eeff41!important}.lime.accent-3{background-color:#c6ff00!important}.lime-text.text-accent-3{color:#c6ff00!important}.lime.accent-4{background-color:#aeea00!important}.lime-text.text-accent-4{color:#aeea00!important}.yellow{background-color:#ffeb3b!important}.yellow-text{color:#ffeb3b!important}.yellow.lighten-5{background-color:#fffde7!important}.yellow-text.text-lighten-5{color:#fffde7!important}.yellow.lighten-4{background-color:#fff9c4!important}.yellow-text.text-lighten-4{color:#fff9c4!important}.yellow.lighten-3{background-color:#fff59d!important}.yellow-text.text-lighten-3{color:#fff59d!important}.yellow.lighten-2{background-color:#fff176!important}.yellow-text.text-lighten-2{color:#fff176!important}.yellow.lighten-1{background-color:#ffee58!important}.yellow-text.text-lighten-1{color:#ffee58!important}.yellow.darken-1{background-color:#fdd835!important}.yellow-text.text-darken-1{color:#fdd835!important}.yellow.darken-2{background-color:#fbc02d!important}.yellow-text.text-darken-2{color:#fbc02d!important}.yellow.darken-3{background-color:#f9a825!important}.yellow-text.text-darken-3{color:#f9a825!important}.yellow.darken-4{background-color:#f57f17!important}.yellow-text.text-darken-4{color:#f57f17!important}.yellow.accent-1{background-color:#ffff8d!important}.yellow-text.text-accent-1{color:#ffff8d!important}.yellow.accent-2{background-color:#ff0!important}.yellow-text.text-accent-2{color:#ff0!important}.yellow.accent-3{background-color:#ffea00!important}.yellow-text.text-accent-3{color:#ffea00!important}.yellow.accent-4{background-color:#ffd600!important}.yellow-text.text-accent-4{color:#ffd600!important}.amber{background-color:#ffc107!important}.amber-text{color:#ffc107!important}.amber.lighten-5{background-color:#fff8e1!important}.amber-text.text-lighten-5{color:#fff8e1!important}.amber.lighten-4{background-color:#ffecb3!important}.amber-text.text-lighten-4{color:#ffecb3!important}.amber.lighten-3{background-color:#ffe082!important}.amber-text.text-lighten-3{color:#ffe082!important}.amber.lighten-2{background-color:#ffd54f!important}.amber-text.text-lighten-2{color:#ffd54f!important}.amber.lighten-1{background-color:#ffca28!important}.amber-text.text-lighten-1{color:#ffca28!important}.amber.darken-1{background-color:#ffb300!important}.amber-text.text-darken-1{color:#ffb300!important}.amber.darken-2{background-color:#ffa000!important}.amber-text.text-darken-2{color:#ffa000!important}.amber.darken-3{background-color:#ff8f00!important}.amber-text.text-darken-3{color:#ff8f00!important}.amber.darken-4{background-color:#ff6f00!important}.amber-text.text-darken-4{color:#ff6f00!important}.amber.accent-1{background-color:#ffe57f!important}.amber-text.text-accent-1{color:#ffe57f!important}.amber.accent-2{background-color:#ffd740!important}.amber-text.text-accent-2{color:#ffd740!important}.amber.accent-3{background-color:#ffc400!important}.amber-text.text-accent-3{color:#ffc400!important}.amber.accent-4{background-color:#ffab00!important}.amber-text.text-accent-4{color:#ffab00!important}.orange{background-color:#ff9800!important}.orange-text{color:#ff9800!important}.orange.lighten-5{background-color:#fff3e0!important}.orange-text.text-lighten-5{color:#fff3e0!important}.orange.lighten-4{background-color:#ffe0b2!important}.orange-text.text-lighten-4{color:#ffe0b2!important}.orange.lighten-3{background-color:#ffcc80!important}.orange-text.text-lighten-3{color:#ffcc80!important}.orange.lighten-2{background-color:#ffb74d!important}.orange-text.text-lighten-2{color:#ffb74d!important}.orange.lighten-1{background-color:#ffa726!important}.orange-text.text-lighten-1{color:#ffa726!important}.orange.darken-1{background-color:#fb8c00!important}.orange-text.text-darken-1{color:#fb8c00!important}.orange.darken-2{background-color:#f57c00!important}.orange-text.text-darken-2{color:#f57c00!important}.orange.darken-3{background-color:#ef6c00!important}.orange-text.text-darken-3{color:#ef6c00!important}.orange.darken-4{background-color:#e65100!important}.orange-text.text-darken-4{color:#e65100!important}.orange.accent-1{background-color:#ffd180!important}.orange-text.text-accent-1{color:#ffd180!important}.orange.accent-2{background-color:#ffab40!important}.orange-text.text-accent-2{color:#ffab40!important}.orange.accent-3{background-color:#ff9100!important}.orange-text.text-accent-3{color:#ff9100!important}.orange.accent-4{background-color:#ff6d00!important}.orange-text.text-accent-4{color:#ff6d00!important}.deep-orange{background-color:#ff5722!important}.deep-orange-text{color:#ff5722!important}.deep-orange.lighten-5{background-color:#fbe9e7!important}.deep-orange-text.text-lighten-5{color:#fbe9e7!important}.deep-orange.lighten-4{background-color:#ffccbc!important}.deep-orange-text.text-lighten-4{color:#ffccbc!important}.deep-orange.lighten-3{background-color:#ffab91!important}.deep-orange-text.text-lighten-3{color:#ffab91!important}.deep-orange.lighten-2{background-color:#ff8a65!important}.deep-orange-text.text-lighten-2{color:#ff8a65!important}.deep-orange.lighten-1{background-color:#ff7043!important}.deep-orange-text.text-lighten-1{color:#ff7043!important}.deep-orange.darken-1{background-color:#f4511e!important}.deep-orange-text.text-darken-1{color:#f4511e!important}.deep-orange.darken-2{background-color:#e64a19!important}.deep-orange-text.text-darken-2{color:#e64a19!important}.deep-orange.darken-3{background-color:#d84315!important}.deep-orange-text.text-darken-3{color:#d84315!important}.deep-orange.darken-4{background-color:#bf360c!important}.deep-orange-text.text-darken-4{color:#bf360c!important}.deep-orange.accent-1{background-color:#ff9e80!important}.deep-orange-text.text-accent-1{color:#ff9e80!important}.deep-orange.accent-2{background-color:#ff6e40!important}.deep-orange-text.text-accent-2{color:#ff6e40!important}.deep-orange.accent-3{background-color:#ff3d00!important}.deep-orange-text.text-accent-3{color:#ff3d00!important}.deep-orange.accent-4{background-color:#dd2c00!important}.deep-orange-text.text-accent-4{color:#dd2c00!important}.brown{background-color:#795548!important}.brown-text{color:#795548!important}.brown.lighten-5{background-color:#efebe9!important}.brown-text.text-lighten-5{color:#efebe9!important}.brown.lighten-4{background-color:#d7ccc8!important}.brown-text.text-lighten-4{color:#d7ccc8!important}.brown.lighten-3{background-color:#bcaaa4!important}.brown-text.text-lighten-3{color:#bcaaa4!important}.brown.lighten-2{background-color:#a1887f!important}.brown-text.text-lighten-2{color:#a1887f!important}.brown.lighten-1{background-color:#8d6e63!important}.brown-text.text-lighten-1{color:#8d6e63!important}.brown.darken-1{background-color:#6d4c41!important}.brown-text.text-darken-1{color:#6d4c41!important}.brown.darken-2{background-color:#5d4037!important}.brown-text.text-darken-2{color:#5d4037!important}.brown.darken-3{background-color:#4e342e!important}.brown-text.text-darken-3{color:#4e342e!important}.brown.darken-4{background-color:#3e2723!important}.brown-text.text-darken-4{color:#3e2723!important}.blue-grey{background-color:#607d8b!important}.blue-grey-text{color:#607d8b!important}.blue-grey.lighten-5{background-color:#eceff1!important}.blue-grey-text.text-lighten-5{color:#eceff1!important}.blue-grey.lighten-4{background-color:#cfd8dc!important}.blue-grey-text.text-lighten-4{color:#cfd8dc!important}.blue-grey.lighten-3{background-color:#b0bec5!important}.blue-grey-text.text-lighten-3{color:#b0bec5!important}.blue-grey.lighten-2{background-color:#90a4ae!important}.blue-grey-text.text-lighten-2{color:#90a4ae!important}.blue-grey.lighten-1{background-color:#78909c!important}.blue-grey-text.text-lighten-1{color:#78909c!important}.blue-grey.darken-1{background-color:#546e7a!important}.blue-grey-text.text-darken-1{color:#546e7a!important}.blue-grey.darken-2{background-color:#455a64!important}.blue-grey-text.text-darken-2{color:#455a64!important}.blue-grey.darken-3{background-color:#37474f!important}.blue-grey-text.text-darken-3{color:#37474f!important}.blue-grey.darken-4{background-color:#263238!important}.blue-grey-text.text-darken-4{color:#263238!important}.grey{background-color:#9e9e9e!important}.grey-text{color:#9e9e9e!important}.grey.lighten-5{background-color:#fafafa!important}.grey-text.text-lighten-5{color:#fafafa!important}.grey.lighten-4{background-color:#f5f5f5!important}.grey-text.text-lighten-4{color:#f5f5f5!important}.grey.lighten-3{background-color:#eee!important}.grey-text.text-lighten-3{color:#eee!important}.grey.lighten-2{background-color:#e0e0e0!important}.grey-text.text-lighten-2{color:#e0e0e0!important}.grey.lighten-1{background-color:#bdbdbd!important}.grey-text.text-lighten-1{color:#bdbdbd!important}.grey.darken-1{background-color:#757575!important}.grey-text.text-darken-1{color:#757575!important}.grey.darken-2{background-color:#616161!important}.grey-text.text-darken-2{color:#616161!important}.grey.darken-3{background-color:#424242!important}.grey-text.text-darken-3{color:#424242!important}.grey.darken-4{background-color:#212121!important}.grey-text.text-darken-4{color:#212121!important}.black{background-color:#000!important}.black-text{color:#000!important}.white{background-color:#fff!important}.white-text{color:#fff!important}.transparent{background-color:transparent!important}.transparent-text{color:transparent!important}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default) li{list-style-type:none}a{color:#039be5;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none!important}.btn,.btn-floating,.btn-large,.card,.card-panel,.collapsible,.dropdown-content,.side-nav,.toast,.z-depth-1,nav{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.btn-floating:hover,.btn-large:hover,.btn:hover,.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.3)}.modal,.z-depth-4{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.3)}.z-depth-5{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.3)}.hoverable{transition:box-shadow .25s;box-shadow:0}.hoverable:hover{transition:box-shadow .25s;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width:992px){.pagination{width:100%}.pagination li.next,.pagination li.prev{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:hsla(0,0%,100%,.7)}.breadcrumb [class*=mdi-],.breadcrumb [class^=mdi-],.breadcrumb i,.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:"\E5CC";color:hsla(0,0%,100%,.7);vertical-align:top;display:inline-block;font-family:Material Icons;font-weight:400;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax{top:0;left:0;right:0;z-index:-1}.parallax,.parallax img{position:absolute;bottom:0}.parallax img{display:none;left:50%;min-width:100%;min-height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-bottom,.pin-top{position:relative}.pinned{position:fixed!important}.fade-in,ul.staggered-list li{opacity:0}.fade-in{-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width:600px){.hide-on-small-and-down,.hide-on-small-only{display:none!important}}@media only screen and (max-width:992px){.hide-on-med-and-down{display:none!important}}@media only screen and (min-width:601px){.hide-on-med-and-up{display:none!important}}@media only screen and (min-width:600px) and (max-width:992px){.hide-on-med-only{display:none!important}}@media only screen and (min-width:993px){.hide-on-large-only{display:none!important}}@media only screen and (min-width:993px){.show-on-large{display:block!important}}@media only screen and (min-width:600px) and (max-width:992px){.show-on-medium{display:block!important}}@media only screen and (max-width:600px){.show-on-small{display:block!important}}@media only screen and (min-width:601px){.show-on-medium-and-up{display:block!important}}@media only screen and (max-width:992px){.show-on-medium-and-down{display:block!important}}@media only screen and (max-width:600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:10px 0;color:hsla(0,0%,100%,.8);background-color:rgba(51,51,51,.08)}table,td,th{border:none}table{width:100%;display:table}table.bordered>tbody>tr,table.bordered>thead>tr{border-bottom:1px solid #d0d0d0}table.striped>tbody>tr:nth-child(odd){background-color:#f2f2f2}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:#f2f2f2}table.centered tbody tr td,table.centered thead tr th{text-align:center}thead{border-bottom:1px solid #d0d0d0}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width:992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:"\A0"}table.responsive-table td,table.responsive-table th{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th:before{content:"\A0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid #d0d0d0}table.responsive-table.bordered th{border-bottom:0;border-left:0}table.responsive-table.bordered td{border-left:0;border-right:0;border-bottom:0}table.responsive-table.bordered tr{border:0}table.responsive-table.bordered tbody tr{border-right:1px solid #d0d0d0}}.collection{margin:.5rem 0 1rem;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar .circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container embed,.video-container iframe,.video-container object{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;transition:width .3s linear}.progress .determinate,.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{-webkit-animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.progress .indeterminate:after,.progress .indeterminate:before{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right}.progress .indeterminate:after{-webkit-animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.hide{display:none!important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left!important}.right{float:right!important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0!important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]:after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-top:calc(1.5rem - 11px)}.side-nav span.badge{margin-top:13px}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:"liga";-moz-font-feature-settings:"liga";font-feature-settings:"liga"}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width:601px){.container{width:85%}}@media only screen and (min-width:993px){.container{width:70%}}.container .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*=pull-],.row .col[class*=push-]{position:relative}.row .col.s1{width:8.3333333333%}.row .col.s1,.row .col.s2{margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%}.row .col.s3{width:25%}.row .col.s3,.row .col.s4{margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%}.row .col.s5{width:41.6666666667%}.row .col.s5,.row .col.s6{margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%}.row .col.s7{width:58.3333333333%}.row .col.s7,.row .col.s8{margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%}.row .col.s9{width:75%}.row .col.s9,.row .col.s10{margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%}.row .col.s11{width:91.6666666667%}.row .col.s11,.row .col.s12{margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width:601px){.row .col.m1{width:8.3333333333%}.row .col.m1,.row .col.m2{margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%}.row .col.m3{width:25%}.row .col.m3,.row .col.m4{margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%}.row .col.m5{width:41.6666666667%}.row .col.m5,.row .col.m6{margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%}.row .col.m7{width:58.3333333333%}.row .col.m7,.row .col.m8{margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%}.row .col.m9{width:75%}.row .col.m9,.row .col.m10{margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%}.row .col.m11{width:91.6666666667%}.row .col.m11,.row .col.m12{margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width:993px){.row .col.l1{width:8.3333333333%}.row .col.l1,.row .col.l2{margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%}.row .col.l3{width:25%}.row .col.l3,.row .col.l4{margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%}.row .col.l5{width:41.6666666667%}.row .col.l5,.row .col.l6{margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%}.row .col.l7{width:58.3333333333%}.row .col.l7,.row .col.l8{margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%}.row .col.l9{width:75%}.row .col.l9,.row .col.l10{margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%}.row .col.l11{width:91.6666666667%}.row .col.l11,.row .col.l12{margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width:1201px){.row .col.xl1{width:8.3333333333%}.row .col.xl1,.row .col.xl2{margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%}.row .col.xl3{width:25%}.row .col.xl3,.row .col.xl4{margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%}.row .col.xl5{width:41.6666666667%}.row .col.xl5,.row .col.xl6{margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%}.row .col.xl7{width:58.3333333333%}.row .col.xl7,.row .col.xl8{margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%}.row .col.xl9{width:75%}.row .col.xl9,.row .col.xl10{margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%}.row .col.xl11{width:91.6666666667%}.row .col.xl11,.row .col.xl12{margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav [class*=mdi-],nav [class^=mdi-],nav i,nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width:993px){nav a.button-collapse{display:none}}nav .button-collapse{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .button-collapse i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0;white-space:nowrap}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width:992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:.5rem}nav .brand-logo.right{right:.5rem;left:auto}}nav .brand-logo.right{right:.5rem;padding:0}nav .brand-logo [class*=mdi-],nav .brand-logo [class^=mdi-],nav .brand-logo i,nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-flat,nav ul a.btn-floating,nav ul a.btn-large{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=date]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=text]:valid,nav .input-field input[type=url]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:hsla(0,0%,100%,.7);transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width:601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.button-collapse,nav a.button-collapse i{height:64px;line-height:64px}.navbar-fixed{height:64px}}@font-face{font-family:Roboto;src:local(Roboto Thin),url(/bundles/wallabagcore/fonts/Roboto-Thin.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Thin.woff) format("woff");font-weight:100}@font-face{font-family:Roboto;src:local(Roboto Light),url(/bundles/wallabagcore/fonts/Roboto-Light.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Light.woff) format("woff");font-weight:300}@font-face{font-family:Roboto;src:local(Roboto Regular),url(/bundles/wallabagcore/fonts/Roboto-Regular.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Regular.woff) format("woff");font-weight:400}@font-face{font-family:Roboto;src:local(Roboto Medium),url(/bundles/wallabagcore/fonts/Roboto-Medium.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Medium.woff) format("woff");font-weight:500}@font-face{font-family:Roboto;src:local(Roboto Bold),url(/bundles/wallabagcore/fonts/Roboto-Bold.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Bold.woff) format("woff");font-weight:700}a{text-decoration:none}html{line-height:1.5;font-family:Roboto,sans-serif;font-weight:400;color:rgba(0,0,0,.87)}@media only screen and (min-width:0){html{font-size:14px}}@media only screen and (min-width:992px){html{font-size:14.5px}}@media only screen and (min-width:1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.1}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;margin:2.1rem 0 1.68rem}h1,h2{line-height:110%}h2{font-size:3.56rem;margin:1.78rem 0 1.424rem}h3{font-size:2.92rem;margin:1.46rem 0 1.168rem}h3,h4{line-height:110%}h4{font-size:2.28rem;margin:1.14rem 0 .912rem}h5{font-size:1.64rem;margin:.82rem 0 .656rem}h5,h6{line-height:110%}h6{font-size:1rem;margin:.5rem 0 .4rem}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light,.page-footer .footer-copyright{font-weight:300}.thin{font-weight:200}.flow-text{font-weight:300}@media only screen and (min-width:360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width:390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width:420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width:450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width:480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width:510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width:540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width:570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width:600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width:630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width:660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width:690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width:720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width:750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width:780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width:810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width:840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width:870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width:900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width:930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width:960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width:360px){.flow-text{font-size:1.2rem}}.scale-transition{transition:-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63),-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s!important;transition:transform .2s!important;transition:transform .2s,-webkit-transform .2s!important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{padding:24px}.card,.card-panel{transition:box-shadow .25s;margin:.5rem 0 1rem;border-radius:2px;background-color:#fff}.card{position:relative}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.large,.card.medium,.card.small{position:relative}.card.large .card-image,.card.medium .card-image,.card.small .card-image{max-height:60%;overflow:hidden}.card.large .card-image+.card-content,.card.medium .card-image+.card-content,.card.small .card-image+.card-content{max-height:40%}.card.large .card-content,.card.medium .card-content,.card.small .card-content{max-height:100%;overflow:hidden}.card.large .card-action,.card.medium .card-action,.card.small .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.large .card-image,.card.horizontal.medium .card-image,.card.horizontal.small .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.large .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.small .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0;color:inherit}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{position:relative;background-color:inherit;border-top:1px solid hsla(0,0%,63%,.2);padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width:600px){#toast-container{min-width:100%;bottom:0}}@media only screen and (min-width:601px) and (max-width:992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width:993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;clear:both;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;word-break:break-all;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.toast .btn,.toast .btn-flat,.toast .btn-large{margin:0;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width:600px){.toast{width:100%;border-radius:0}}@media only screen and (min-width:601px) and (max-width:992px){.toast{float:left}}@media only screen and (min-width:993px){.toast{float:right}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover,.tabs.tabs-transparent .tab a{color:hsla(0,0%,100%,.7)}.tabs.tabs-transparent .tab a.active,.tabs.tabs-transparent .tab a:hover{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease}.tabs .tab a.active,.tabs .tab a:hover{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,.7);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left,right}@media only screen and (max-width:992px){.tabs{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none}.backdrop,.material-tooltip{opacity:0;position:absolute;visibility:hidden}.backdrop{height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0;transform-origin:50% 0}.btn,.btn-flat,.btn-large{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 2rem;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn-flat.disabled,.btn-flat:disabled,.btn-flat[disabled],.btn-floating.disabled,.btn-floating:disabled,.btn-floating[disabled],.btn-large.disabled,.btn-large:disabled,.btn-large[disabled],.btn.disabled,.btn:disabled,.btn[disabled],.disabled.btn-large,[disabled].btn-large{pointer-events:none;background-color:#dfdfdf!important;box-shadow:none;color:#9f9f9f!important;cursor:default}.btn-flat.disabled:hover,.btn-flat:disabled:hover,.btn-flat[disabled]:hover,.btn-floating.disabled:hover,.btn-floating:disabled:hover,.btn-floating[disabled]:hover,.btn-large.disabled:hover,.btn-large:disabled:hover,.btn-large[disabled]:hover,.btn.disabled:hover,.btn:disabled:hover,.btn[disabled]:hover,.disabled.btn-large:hover,[disabled].btn-large:hover{background-color:#dfdfdf!important;color:#9f9f9f!important}.btn,.btn-flat,.btn-floating,.btn-large{font-size:1rem;outline:0}.btn-flat i,.btn-floating i,.btn-large i,.btn i{font-size:1.3rem;line-height:inherit}.btn-floating:focus,.btn-large:focus,.btn:focus{background-color:#1d7d74}.btn,.btn-large{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:.2s ease-out;cursor:pointer}.btn-large:hover,.btn:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;border-radius:50%;transition:.3s;cursor:pointer;vertical-align:middle}.btn-floating,.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:998}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.horizontal{padding:0 0 0 15px}.fixed-action-btn.horizontal ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.horizontal ul li{display:inline-block;margin:15px 15px 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0}.fixed-action-btn.toolbar ul li{-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{box-shadow:none;color:#343434;cursor:pointer;transition:background-color .2s}.btn-flat,.btn-flat:active,.btn-flat:focus{background-color:transparent}.btn-flat:focus,.btn-flat:hover{background-color:rgba(0,0,0,.1);box-shadow:none}.btn-flat:active{background-color:rgba(0,0,0,.2)}.btn-flat.disabled{background-color:transparent!important;color:#b3b3b3!important;cursor:default}.btn-large{height:54px;line-height:54px}.btn-large i{font-size:1.6rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;max-height:650px;overflow-y:auto;opacity:0;position:absolute;z-index:999;will-change:width,height}.dropdown-content li{clear:both;color:rgba(0,0,0,.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left;text-transform:none}.dropdown-content li.active,.dropdown-content li.selected,.dropdown-content li:hover{background-color:#eee}.dropdown-content li.active.selected{background-color:#e1e1e1}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}.input-field.col .dropdown-content [type=checkbox]+label{top:1px;left:0;height:18px}.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,.2);transition:all .7s ease-out;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:hsla(0,0%,100%,.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,.7)}.waves-effect input[type=button],.waves-effect input[type=reset],.waves-effect input[type=submit]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{transition:none!important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top,opacity}@media only screen and (max-width:992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%}.modal .modal-footer .btn,.modal .modal-footer .btn-flat,.modal .modal-footer .btn-large{float:right;margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-100px;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom,opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem}.collapsible-header{display:block;cursor:pointer;min-height:3rem;line-height:3rem;padding:0 1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header i{width:2rem;font-size:1.6rem;line-height:3rem;display:block;float:left;text-align:center;margin-right:1rem}.collapsible-body{display:none;border-bottom:1px solid #ddd;box-sizing:border-box;padding:2rem}.side-nav .collapsible,.side-nav.fixed .collapsible{border:none;box-shadow:none}.side-nav .collapsible li,.side-nav.fixed .collapsible li{padding:0}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.side-nav .collapsible-header:hover,.side-nav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,.05)}.side-nav .collapsible-header i,.side-nav.fixed .collapsible-header i{line-height:inherit}.side-nav .collapsible-body,.side-nav.fixed .collapsible-body{border:0;background-color:#fff}.side-nav .collapsible-body li a,.side-nav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin:0 24px;transition:margin .35s cubic-bezier(.25,.46,.45,.94)}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;box-shadow:none;margin:0 0 20px;min-height:45px;outline:none;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .chip.selected{background-color:#26a69a;color:#fff}.chips .input{background:none;border:0;color:rgba(0,0,0,.6);display:inline-block;font-size:1rem;height:3rem;line-height:32px;outline:0;margin:0;padding:0!important;width:120px!important}.chips .input:focus{border:0!important;box-shadow:none!important}.chips .autocomplete-content{margin-top:0}.prefix~.chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty~label{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{top:0;right:0;background-color:#292929;will-change:opacity}#materialbox-overlay,.materialbox-caption{position:fixed;bottom:0;left:0;z-index:1000}.materialbox-caption{display:none;color:#fff;line-height:50px;width:100%;text-align:center;padding:0 15%;height:50px;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}:-moz-placeholder,::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}input:not([type]),input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}input:not([type]):disabled,input:not([type])[readonly=readonly],input[type=date]:disabled,input[type=date][readonly=readonly],input[type=datetime-local]:disabled,input[type=datetime-local][readonly=readonly],input[type=datetime]:disabled,input[type=datetime][readonly=readonly],input[type=email]:disabled,input[type=email][readonly=readonly],input[type=number]:disabled,input[type=number][readonly=readonly],input[type=password]:disabled,input[type=password][readonly=readonly],input[type=search]:disabled,input[type=search][readonly=readonly],input[type=tel]:disabled,input[type=tel][readonly=readonly],input[type=text]:disabled,input[type=text][readonly=readonly],input[type=time]:disabled,input[type=time][readonly=readonly],input[type=url]:disabled,input[type=url][readonly=readonly],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly=readonly]{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26)}input:not([type]):disabled+label,input:not([type])[readonly=readonly]+label,input[type=date]:disabled+label,input[type=date][readonly=readonly]+label,input[type=datetime-local]:disabled+label,input[type=datetime-local][readonly=readonly]+label,input[type=datetime]:disabled+label,input[type=datetime][readonly=readonly]+label,input[type=email]:disabled+label,input[type=email][readonly=readonly]+label,input[type=number]:disabled+label,input[type=number][readonly=readonly]+label,input[type=password]:disabled+label,input[type=password][readonly=readonly]+label,input[type=search]:disabled+label,input[type=search][readonly=readonly]+label,input[type=tel]:disabled+label,input[type=tel][readonly=readonly]+label,input[type=text]:disabled+label,input[type=text][readonly=readonly]+label,input[type=time]:disabled+label,input[type=time][readonly=readonly]+label,input[type=url]:disabled+label,input[type=url][readonly=readonly]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly=readonly]+label{color:rgba(0,0,0,.26)}input:not([type]):focus:not([readonly]),input[type=date]:focus:not([readonly]),input[type=datetime-local]:focus:not([readonly]),input[type=datetime]:focus:not([readonly]),input[type=email]:focus:not([readonly]),input[type=number]:focus:not([readonly]),input[type=password]:focus:not([readonly]),input[type=search]:focus:not([readonly]),input[type=tel]:focus:not([readonly]),input[type=text]:focus:not([readonly]),input[type=time]:focus:not([readonly]),input[type=url]:focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=date]:focus:not([readonly])+label,input[type=datetime-local]:focus:not([readonly])+label,input[type=datetime]:focus:not([readonly])+label,input[type=email]:focus:not([readonly])+label,input[type=number]:focus:not([readonly])+label,input[type=password]:focus:not([readonly])+label,input[type=search]:focus:not([readonly])+label,input[type=tel]:focus:not([readonly])+label,input[type=text]:focus:not([readonly])+label,input[type=time]:focus:not([readonly])+label,input[type=url]:focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]).valid,input:not([type]):focus.valid,input[type=date].valid,input[type=date]:focus.valid,input[type=datetime-local].valid,input[type=datetime-local]:focus.valid,input[type=datetime].valid,input[type=datetime]:focus.valid,input[type=email].valid,input[type=email]:focus.valid,input[type=number].valid,input[type=number]:focus.valid,input[type=password].valid,input[type=password]:focus.valid,input[type=search].valid,input[type=search]:focus.valid,input[type=tel].valid,input[type=tel]:focus.valid,input[type=text].valid,input[type=text]:focus.valid,input[type=time].valid,input[type=time]:focus.valid,input[type=url].valid,input[type=url]:focus.valid,textarea.materialize-textarea.valid,textarea.materialize-textarea:focus.valid{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}input:not([type]).valid+label:after,input:not([type]):focus.valid+label:after,input[type=date].valid+label:after,input[type=date]:focus.valid+label:after,input[type=datetime-local].valid+label:after,input[type=datetime-local]:focus.valid+label:after,input[type=datetime].valid+label:after,input[type=datetime]:focus.valid+label:after,input[type=email].valid+label:after,input[type=email]:focus.valid+label:after,input[type=number].valid+label:after,input[type=number]:focus.valid+label:after,input[type=password].valid+label:after,input[type=password]:focus.valid+label:after,input[type=search].valid+label:after,input[type=search]:focus.valid+label:after,input[type=tel].valid+label:after,input[type=tel]:focus.valid+label:after,input[type=text].valid+label:after,input[type=text]:focus.valid+label:after,input[type=time].valid+label:after,input[type=time]:focus.valid+label:after,input[type=url].valid+label:after,input[type=url]:focus.valid+label:after,textarea.materialize-textarea.valid+label:after,textarea.materialize-textarea:focus.valid+label:after{content:attr(data-success);color:#4caf50;opacity:1}input:not([type]).invalid,input:not([type]):focus.invalid,input[type=date].invalid,input[type=date]:focus.invalid,input[type=datetime-local].invalid,input[type=datetime-local]:focus.invalid,input[type=datetime].invalid,input[type=datetime]:focus.invalid,input[type=email].invalid,input[type=email]:focus.invalid,input[type=number].invalid,input[type=number]:focus.invalid,input[type=password].invalid,input[type=password]:focus.invalid,input[type=search].invalid,input[type=search]:focus.invalid,input[type=tel].invalid,input[type=tel]:focus.invalid,input[type=text].invalid,input[type=text]:focus.invalid,input[type=time].invalid,input[type=time]:focus.invalid,input[type=url].invalid,input[type=url]:focus.invalid,textarea.materialize-textarea.invalid,textarea.materialize-textarea:focus.invalid{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}input:not([type]).invalid+label:after,input:not([type]):focus.invalid+label:after,input[type=date].invalid+label:after,input[type=date]:focus.invalid+label:after,input[type=datetime-local].invalid+label:after,input[type=datetime-local]:focus.invalid+label:after,input[type=datetime].invalid+label:after,input[type=datetime]:focus.invalid+label:after,input[type=email].invalid+label:after,input[type=email]:focus.invalid+label:after,input[type=number].invalid+label:after,input[type=number]:focus.invalid+label:after,input[type=password].invalid+label:after,input[type=password]:focus.invalid+label:after,input[type=search].invalid+label:after,input[type=search]:focus.invalid+label:after,input[type=tel].invalid+label:after,input[type=tel]:focus.invalid+label:after,input[type=text].invalid+label:after,input[type=text]:focus.invalid+label:after,input[type=time].invalid+label:after,input[type=time]:focus.invalid+label:after,input[type=url].invalid+label:after,input[type=url]:focus.invalid+label:after,textarea.materialize-textarea.invalid+label:after,textarea.materialize-textarea:focus.invalid+label:after{content:attr(data-error);color:#f44336;opacity:1}input:not([type]).validate+label,input[type=date].validate+label,input[type=datetime-local].validate+label,input[type=datetime].validate+label,input[type=email].validate+label,input[type=number].validate+label,input[type=password].validate+label,input[type=search].validate+label,input[type=tel].validate+label,input[type=text].validate+label,input[type=time].validate+label,input[type=url].validate+label,textarea.materialize-textarea.validate+label{width:100%;pointer-events:none}input:not([type])+label:after,input[type=date]+label:after,input[type=datetime-local]+label:after,input[type=datetime]+label:after,input[type=email]+label:after,input[type=number]+label:after,input[type=password]+label:after,input[type=search]+label:after,input[type=tel]+label:after,input[type=text]+label:after,input[type=time]+label:after,input[type=url]+label:after,textarea.materialize-textarea+label:after{display:block;content:"";position:absolute;top:60px;opacity:0;transition:opacity .2s ease-out,color .2s ease-out}.input-field{position:relative;margin-top:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline .select-dropdown,.input-field.inline input{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix~.validate~label,.input-field.col .prefix~label{width:calc(100% - 3rem - 1.5rem)}.input-field label{color:#9e9e9e;position:absolute;top:.8rem;left:0;font-size:1rem;cursor:text;transition:.2s ease-out;text-align:initial}.input-field label:not(.label-icon).active{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s}.input-field .prefix.active{color:#26a69a}.input-field .prefix~.autocomplete-content,.input-field .prefix~.validate~label,.input-field .prefix~input,.input-field .prefix~label,.input-field .prefix~textarea{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix~label{margin-left:3rem}@media only screen and (max-width:992px){.input-field .prefix~input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width:600px){.input-field .prefix~input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;padding-left:4rem;width:calc(100% - 4rem)}.input-field input[type=search]:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus+label i,.input-field input[type=search]:focus~.material-icons,.input-field input[type=search]:focus~.mdi-navigation-close{color:#444}.input-field input[type=search]+label{left:1rem}.input-field input[type=search]~.material-icons,.input-field input[type=search]~.mdi-navigation-close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{overflow-y:hidden;padding:.8rem 0 1.6rem;resize:none;min-height:3rem}.hiddendiv{display:none;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0}.autocomplete-content{margin-top:-20px;display:block;opacity:1;position:static}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}[type=radio]:checked,[type=radio]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=radio]:checked+label,[type=radio]:not(:checked)+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type=radio]+label:after,[type=radio]+label:before{content:"";position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after,[type=radio]:checked+label:before,[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border-radius:50%}[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border:2px solid #5a5a5a}[type=radio]:not(:checked)+label:after{-webkit-transform:scale(0);transform:scale(0)}[type=radio]:checked+label:before{border:2px solid transparent}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after{border:2px solid #26a69a}[type=radio].with-gap:checked+label:after,[type=radio]:checked+label:after{background-color:#26a69a}[type=radio]:checked+label:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type=radio].with-gap:checked+label:after{-webkit-transform:scale(.5);transform:scale(.5)}[type=radio].tabbed:focus+label:before{box-shadow:0 0 0 10px rgba(0,0,0,.1)}[type=radio].with-gap:disabled:checked+label:before{border:2px solid rgba(0,0,0,.26)}[type=radio].with-gap:disabled:checked+label:after{border:none;background-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:before,[type=radio]:disabled:not(:checked)+label:before{background-color:transparent;border-color:rgba(0,0,0,.26)}[type=radio]:disabled+label{color:rgba(0,0,0,.26)}[type=radio]:disabled:not(:checked)+label:before{border-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:after{background-color:rgba(0,0,0,.26);border-color:#bdbdbd}form p{margin-bottom:10px;text-align:left}form p:last-child{margin-bottom:0}[type=checkbox]:checked,[type=checkbox]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=checkbox]+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type=checkbox]+label:before,[type=checkbox]:not(.filled-in)+label:after{content:"";position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:2px;transition:.2s}[type=checkbox]:not(.filled-in)+label:after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type=checkbox]:not(:checked):disabled+label:before{border:none;background-color:rgba(0,0,0,.26)}[type=checkbox].tabbed:focus+label:after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;box-shadow:0 0 0 10px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}[type=checkbox]:checked+label:before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:checked:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);border-bottom:2px solid rgba(0,0,0,.26)}[type=checkbox]:indeterminate+label:before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:indeterminate:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);background-color:transparent}[type=checkbox].filled-in+label:after{border-radius:2px}[type=checkbox].filled-in+label:after,[type=checkbox].filled-in+label:before{content:"";left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1}[type=checkbox].filled-in:not(:checked)+label:before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}[type=checkbox].filled-in:not(:checked)+label:after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;z-index:0}[type=checkbox].filled-in:checked+label:before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox].filled-in:checked+label:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type=checkbox].filled-in.tabbed:focus+label:after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,.1)}[type=checkbox].filled-in.tabbed:checked:focus+label:after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type=checkbox].filled-in:disabled:not(:checked)+label:before{background-color:transparent;border:2px solid transparent}[type=checkbox].filled-in:disabled:not(:checked)+label:after{border-color:transparent;background-color:#bdbdbd}[type=checkbox].filled-in:disabled:checked+label:before{background-color:transparent}[type=checkbox].filled-in:disabled:checked+label:after{background-color:#bdbdbd;border-color:#bdbdbd}.switch,.switch *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a;left:24px}.switch label .lever{content:"";display:inline-block;position:relative;width:40px;height:15px;background-color:#818181;border-radius:15px;margin-right:10px;transition:background .3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:after{content:"";position:absolute;display:inline-block;width:21px;height:21px;background-color:#f1f1f1;border-radius:21px;box-shadow:0 1px 3px 1px rgba(0,0,0,.4);left:-5px;top:-3px;transition:left .3s ease,background .3s ease,box-shadow .1s ease}input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:checked:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(38,166,154,.1)}input[type=checkbox]:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(0,0,0,.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#bdbdbd}select{display:none}select.browser-default{display:block}select{background-color:hsla(0,0%,100%,.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;display:block}.select-wrapper span.caret{color:initial;position:absolute;right:0;top:0;bottom:0;height:10px;margin:auto 0;font-size:10px;line-height:10px}.select-wrapper span.caret.disabled{color:rgba(0,0,0,.26)}.select-wrapper+label{position:absolute;top:-14px;font-size:.8rem}select:disabled{color:rgba(0,0,0,.3)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.3)}.select-wrapper i{color:rgba(0,0,0,.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,.3);background-color:transparent}.prefix~.select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix~label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,.4)}.select-dropdown li.optgroup~li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:14px;width:14px;border-radius:50%;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0;transition:.3s}input[type=range]:focus::-webkit-slider-runnable-track{background:#ccc}input[type=range]{border:1px solid #fff}input[type=range]::-moz-range-track{height:3px;background:#ddd;border:none}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input[type=range]:focus::-moz-range-track{background:#ccc}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a}input[type=range]:focus::-ms-fill-lower{background:#888}input[type=range]:focus::-ms-fill-upper{background:#ccc}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{font-weight:300;color:#757575;padding-left:20px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:19px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:18px;border-left:2px solid #ee6e73}.side-nav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:calc(100% + 60px);height:100%;padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.side-nav .collapsible{margin:0}.side-nav li{float:none;line-height:48px}.side-nav li.active{background-color:rgba(0,0,0,.05)}.side-nav li>a{color:rgba(0,0,0,.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.side-nav li>a:hover{background-color:rgba(0,0,0,.05)}.side-nav li>a.btn,.side-nav li>a.btn-flat,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{margin:10px 15px}.side-nav li>a.btn,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{color:#fff}.side-nav li>a.btn-flat{color:#343434}.side-nav li>a.btn-large:hover,.side-nav li>a.btn:hover{background-color:#2bbbad}.side-nav li>a.btn-floating:hover{background-color:#26a69a}.side-nav li>a>[class^=mdi-],.side-nav li>a>i,.side-nav li>a>i.material-icons,.side-nav li>a li>a>[class*=mdi-]{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,.54)}.side-nav .divider{margin:8px 0 0}.side-nav .subheader{cursor:auto;pointer-events:none;color:rgba(0,0,0,.54);font-size:14px;font-weight:500;line-height:48px}.side-nav .subheader:hover{background-color:transparent}.side-nav .userView{position:relative;padding:32px 32px 0;margin-bottom:8px}.side-nav .userView>a{height:auto;padding:0}.side-nav .userView>a:hover{background-color:transparent}.side-nav .userView .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.side-nav .userView .circle,.side-nav .userView .email,.side-nav .userView .name{display:block}.side-nav .userView .circle{height:64px;width:64px}.side-nav .userView .email,.side-nav .userView .name{font-size:14px;line-height:24px}.side-nav .userView .name{margin-top:16px;font-weight:500}.side-nav .userView .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.side-nav.fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.side-nav.fixed.right-aligned{right:0;left:auto}@media only screen and (max-width:992px){.side-nav.fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.side-nav a{padding:0 16px}.side-nav .userView{padding:16px 16px 0}}.side-nav .collapsible-body>ul:not(.collapsible)>li.active,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.side-nav .collapsible-body>ul:not(.collapsible)>li.active a,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.side-nav .collapsible-body{padding:0}#sidenav-overlay{position:fixed;top:0;left:0;right:0;height:120vh;background-color:rgba(0,0,0,.5);z-index:997;will-change:opacity}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(1turn)}}@keyframes container-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-green-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(3turn)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(3turn);transform:rotate(3turn)}}@-webkit-keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@-webkit-keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}@keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes left-spin{0%{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{0%{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1);animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1)}@-webkit-keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:50%}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4caf50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0 50%;transform-origin:0 50%}.carousel.carousel-slider{top:0;left:0;height:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{display:none;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:hsla(0,0%,100%,.5);transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel .carousel-item:not(.active) .materialboxed,.carousel.scrolling .carousel-item .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;transition:visibility 0s}.tap-target-wrapper.open .tap-target{opacity:.95;transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-wrapper.open .tap-target,.tap-target-wrapper.open .tap-target-wave:before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave:after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;transition:opacity .3s,visibility 0s 1s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s 1s;transition:opacity .3s,transform .3s,visibility 0s 1s,-webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;box-shadow:0 20px 20px 0 rgba(0,0,0,.14),0 10px 50px 0 rgba(0,0,0,.12),0 30px 10px -20px rgba(0,0,0,.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave:after,.tap-target-wave:before{content:"";display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#fff}.tap-target-wave:before{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.tap-target-wave:after{visibility:hidden;transition:opacity .3s,visibility 0s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s;transition:opacity .3s,transform .3s,visibility 0s,-webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10002;position:absolute!important}.tap-target-origin:not(.btn):not(.btn-large),.tap-target-origin:not(.btn):not(.btn-large):hover{background:none}@media only screen and (max-width:600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:initial;position:relative}.pulse:before{content:"";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s;transition:opacity .3s,transform .3s,-webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.picker__frame,.picker__holder{bottom:0;left:0;right:0;top:100%}.picker__holder{position:fixed;transition:background .15s ease-out,top 0s .15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;min-width:256px;width:300px;max-height:350px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;transition:all .15s ease-out}@media (min-height:28.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height:40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height:28.875em){.picker__wrap{display:block}}.picker__box{background:#fff;display:table-cell;vertical-align:middle}@media (min-height:28.875em){.picker__box{display:block;border:1px solid #777;border-top-color:#898989;border-bottom-width:0;border-radius:5px 5px 0 0;box-shadow:0 12px 36px 16px rgba(0,0,0,.24)}}.picker--opened .picker__holder{top:0;background:transparent;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)";zoom:1;background:rgba(0,0,0,.32);transition:background .15s ease-out}.picker--opened .picker__frame{top:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height:35.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__input.picker__input--active{border-color:#e3f2fd}.picker__frame{margin:0 auto;max-width:325px}@media (min-height:38.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{display:inline-block;margin-left:.25em;margin-right:.25em}.picker__select--month,.picker__select--year{height:2em;padding:0;margin-left:.25em;margin-right:.25em}.picker__select--month.browser-default{display:inline;background-color:#fff;width:40%}.picker__select--year.browser-default{display:inline;background-color:#fff;width:26%}.picker__select--month:focus,.picker__select--year:focus{border-color:rgba(0,0,0,.05)}.picker__nav--next,.picker__nav--prev{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}.picker__nav--disabled,.picker__nav--disabled:before,.picker__nav--disabled:before:hover,.picker__nav--disabled:hover{cursor:default;background:none;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:1rem;width:100%;margin-top:.75em}.picker__table,.picker__table td,.picker__table th{text-align:center}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999;font-weight:500}@media (min-height:33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day--today{position:relative;color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day--disabled:before{border-top-color:#aaa}.picker__day--infocus:hover{cursor:pointer;color:#000;font-weight:500}.picker__day--outfocus{display:none;padding:.75rem 0;color:#fff}.picker__day--outfocus:hover{cursor:pointer;color:#ddd;font-weight:500}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover{cursor:pointer}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{-webkit-transform:scale(.75);transform:scale(.75);background:#0089ec}.picker--focused .picker__day--disabled,.picker__day--disabled,.picker__day--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbb}.picker__footer{text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.picker__button--clear,.picker__button--close,.picker__button--today{border:1px solid #fff;background:#fff;font-size:.8em;padding:.66em 0;font-weight:700;width:33%;display:inline-block;vertical-align:bottom}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{cursor:pointer;color:#000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--clear:focus,.picker__button--close:focus,.picker__button--today:focus{background:#b1dcfb;border-color:rgba(0,0,0,.05);outline:none}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{position:relative;display:inline-block;height:0}.picker__button--clear:before,.picker__button--today:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-.05em;width:0;border-top:.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-.25em;width:.66em;border-top:3px solid #e20}.picker__button--close:before{content:"\D7";top:-.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaa}.picker__box{border-radius:2px;overflow:hidden}.picker__date-display{text-align:center;background-color:#26a69a;color:#fff;padding-bottom:15px;font-weight:300}.picker__nav--next:hover,.picker__nav--prev:hover{cursor:pointer;color:#000;background:#a1ded8}.picker__weekday-display{background-color:#1f897f;padding:10px;font-weight:200;letter-spacing:.5;font-size:1rem;margin-bottom:15px}.picker__month-display{text-transform:uppercase;font-size:2rem}.picker__day-display{font-size:4.5rem;font-weight:400}.picker__year-display{font-size:1.8rem;color:hsla(0,0%,100%,.4)}.picker__box{padding:0}.picker__calendar-container{padding:0 1rem}.picker__calendar-container thead{border:none}.picker__table{margin-top:0;margin-bottom:.5em}.picker__day--infocus{color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day.picker__day--today{color:#26a69a}.picker__day.picker__day--today.picker__day--selected{color:#fff}.picker__weekday{font-size:.9rem}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{border-radius:50%;-webkit-transform:scale(.9);transform:scale(.9);background-color:#26a69a;color:#fff}.picker--focused .picker__day--selected.picker__day--outfocus,.picker__day--selected.picker__day--outfocus,.picker__day--selected:hover.picker__day--outfocus{background-color:#a1ded8}.picker__footer{text-align:right;padding:5px 10px}.picker__close,.picker__today{font-size:1.1rem;padding:0 1rem;color:#26a69a}.picker__nav--next:before,.picker__nav--prev:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:.75em solid #676767;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:.75em solid #676767}button.picker__clear:focus,button.picker__close:focus,button.picker__today:focus{background-color:#a1ded8}.picker__list{list-style:none;padding:.75em 0 4.2em;margin:0}.picker__list-item{border-bottom:1px solid #ddd;border-top:1px solid #ddd;margin-bottom:-1px;position:relative;background:#fff;padding:.75em 1.25em}@media (min-height:46.75em){.picker__list-item{padding:.5em 1em}}.picker__list-item:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__list-item--highlighted,.picker__list-item:hover{border-color:#0089ec;z-index:10}.picker--focused .picker__list-item--highlighted,.picker__list-item--highlighted:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker--focused .picker__list-item--selected,.picker__list-item--selected,.picker__list-item--selected:hover{background:#0089ec;color:#fff;z-index:10}.picker--focused .picker__list-item--disabled,.picker__list-item--disabled,.picker__list-item--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default;border-color:#ddd;z-index:auto}.picker--time .picker__button--clear{display:block;width:80%;margin:1em auto 0;padding:1em 1.25em;background:none;border:0;font-weight:500;font-size:.67em;text-align:center;text-transform:uppercase;color:#666}.picker--time .picker__button--clear:focus,.picker--time .picker__button--clear:hover{color:#000;background:#b1dcfb;background:#e20;border-color:#e20;cursor:pointer;color:#fff;outline:none}.picker--time .picker__button--clear:before{top:-.25em;color:#666;font-size:1.25em;font-weight:700}.picker--time .picker__button--clear:focus:before,.picker--time .picker__button--clear:hover:before{color:#fff}.picker--time .picker__frame{min-width:256px;max-width:320px}.picker--time .picker__box{font-size:1em;background:#f2f2f2;padding:0}@media (min-height:40.125em){.picker--time .picker__box{margin-bottom:5em}}.annotator-filter *,.annotator-notice,.annotator-widget *{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:400;text-align:left;margin:0;padding:0;background:none;-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;-moz-box-shadow:none;-webkit-box-shadow:none;-o-box-shadow:none;box-shadow:none;color:#909090}.annotator-adder{background-image:url(/bundles/wallabagcore/img/annotator-icon-sprite.png);background-repeat:no-repeat}.annotator-editor a:after,.annotator-filter .annotator-filter-navigation button:after,.annotator-filter .annotator-filter-property .annotator-filter-clear,.annotator-resize,.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button,.annotator-widget:after{background-image:url(/bundles/wallabagcore/img/annotator-glyph-sprite.png);background-repeat:no-repeat}.annotator-hl{background:#ffff0a;background:rgba(255,255,10,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4DFFFF0A, endColorstr=#4DFFFF0A)"}.annotator-hl-temporary{background:#007cff;background:rgba(0,124,255,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4D007CFF, endColorstr=#4D007CFF)"}.annotator-wrapper{position:relative}.annotator-adder,.annotator-notice,.annotator-outer{z-index:1020}.annotator-filter{z-index:1010}.annotator-adder,.annotator-notice,.annotator-outer,.annotator-widget{position:absolute;font-size:10px;line-height:1}.annotator-hide{display:none;visibility:hidden}.annotator-adder{margin-top:-48px;margin-left:-24px;width:48px;height:48px;background-position:0 0}.annotator-adder:hover{background-position:top}.annotator-adder:active{background-position:100%}.annotator-adder button{display:block;width:36px;height:41px;margin:0 auto;border:none;background:none;text-indent:-999em;cursor:pointer}.annotator-outer{width:0;height:0}.annotator-widget{margin:0;padding:0;bottom:15px;left:-18px;min-width:265px;background-color:#fbfbfb;background-color:hsla(0,0%,98%,.98);border:1px solid #7a7a7a;border:1px solid hsla(0,0%,48%,.6);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.2);-moz-box-shadow:0 5px 15px rgba(0,0,0,.2);-o-box-shadow:0 5px 15px rgba(0,0,0,.2);box-shadow:0 5px 15px rgba(0,0,0,.2)}.annotator-invert-x .annotator-widget{left:auto;right:-18px}.annotator-invert-y .annotator-widget{bottom:auto;top:8px}.annotator-widget strong{font-weight:700}.annotator-widget .annotator-item,.annotator-widget .annotator-listing{padding:0;margin:0;list-style:none}.annotator-widget:after{content:"";display:block;width:18px;height:10px;background-position:0 0;position:absolute;bottom:-10px;left:8px}.annotator-invert-x .annotator-widget:after{left:auto;right:8px}.annotator-invert-y .annotator-widget:after{background-position:0 -15px;bottom:auto;top:-9px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea,.annotator-widget .annotator-item{position:relative;font-size:12px}.annotator-viewer .annotator-item{border-top:2px solid #7a7a7a;border-top:2px solid hsla(0,0%,48%,.2)}.annotator-widget .annotator-item:first-child{border-top:none}.annotator-editor .annotator-item,.annotator-viewer div{border-top:1px solid #858585;border-top:1px solid hsla(0,0%,52%,.11)}.annotator-viewer div{padding:6px}.annotator-viewer .annotator-item ol,.annotator-viewer .annotator-item ul{padding:4px 16px}.annotator-editor .annotator-item:first-child textarea,.annotator-viewer div:first-of-type{padding-top:12px;padding-bottom:12px;color:#3c3c3c;font-size:13px;font-style:italic;line-height:1.3;border-top:none}.annotator-viewer .annotator-controls{position:relative;top:5px;right:5px;padding-left:5px;opacity:0;-webkit-transition:opacity .2s ease-in;-moz-transition:opacity .2s ease-in;-o-transition:opacity .2s ease-in;transition:opacity .2s ease-in;float:right}.annotator-viewer li .annotator-controls.annotator-visible,.annotator-viewer li:hover .annotator-controls{opacity:1}.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button{cursor:pointer;display:inline-block;width:13px;height:13px;margin-left:2px;border:none;opacity:.2;text-indent:-900em;background-color:transparent;outline:none}.annotator-viewer .annotator-controls a:focus,.annotator-viewer .annotator-controls a:hover,.annotator-viewer .annotator-controls button:focus,.annotator-viewer .annotator-controls button:hover{opacity:.9}.annotator-viewer .annotator-controls a:active,.annotator-viewer .annotator-controls button:active{opacity:1}.annotator-viewer .annotator-controls button[disabled]{display:none}.annotator-viewer .annotator-controls .annotator-edit{background-position:0 -60px}.annotator-viewer .annotator-controls .annotator-delete{background-position:0 -75px}.annotator-viewer .annotator-controls .annotator-link{background-position:0 -270px}.annotator-editor .annotator-item{position:relative}.annotator-editor .annotator-item label{top:0;display:inline;cursor:pointer;font-size:12px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea{display:block;min-width:100%;padding:10px 8px;border:none;margin:0;color:#3c3c3c;background:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;resize:none}.annotator-editor .annotator-item textarea::-webkit-scrollbar{height:8px;width:8px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-track-piece{margin:13px 0 3px;background-color:#e5e5e5;-webkit-border-radius:4px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:vertical{height:25px;background-color:#ccc;-webkit-border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1)}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:horizontal{width:25px;background-color:#ccc;-webkit-border-radius:4px}.annotator-editor .annotator-item:first-child textarea{min-height:5.5em;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor .annotator-item input:focus,.annotator-editor .annotator-item textarea:focus{background-color:#f3f3f3;outline:none}.annotator-editor .annotator-item input[type=checkbox],.annotator-editor .annotator-item input[type=radio]{width:auto;min-width:0;padding:0;display:inline;margin:0 4px 0 0;cursor:pointer}.annotator-editor .annotator-checkbox{padding:8px 6px}.annotator-editor .annotator-controls,.annotator-filter,.annotator-filter .annotator-filter-navigation button{text-align:right;padding:3px;border-top:1px solid #d4d4d4;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.6,#dcdcdc),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);-webkit-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-moz-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-o-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-o-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.annotator-editor.annotator-invert-y .annotator-controls{border-top:none;border-bottom:1px solid #b4b4b4;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor a,.annotator-filter .annotator-filter-property label{position:relative;display:inline-block;padding:0 6px 0 22px;color:#363636;text-shadow:0 1px 0 hsla(0,0%,100%,.75);text-decoration:none;line-height:24px;font-size:12px;font-weight:700;border:1px solid #a2a2a2;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.5,#d2d2d2),color-stop(.5,#bebebe),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#d2d2d2 50%,#bebebe 50%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px}.annotator-editor a:after{position:absolute;top:50%;left:5px;display:block;content:"";width:15px;height:15px;margin-top:-7px;background-position:0 -90px}.annotator-editor a.annotator-focus,.annotator-editor a:focus,.annotator-editor a:hover,.annotator-filter .annotator-filter-active label,.annotator-filter .annotator-filter-navigation button:hover{outline:none;border-color:#435aa0;background-color:#3865f9;background-image:-webkit-gradient(linear,left top,left bottom,from(#7691fb),color-stop(.5,#5075fb),color-stop(.5,#3865f9),to(#3665fa));background-image:-moz-linear-gradient(to bottom,#7691fb,#5075fb 50%,#3865f9 50%,#3665fa);background-image:-webkit-linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);background-image:linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.42)}.annotator-editor a:focus:after,.annotator-editor a:hover:after{margin-top:-8px;background-position:0 -105px}.annotator-editor a:active,.annotator-filter .annotator-filter-navigation button:active{border-color:#700c49;background-color:#d12e8e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fc7cca),color-stop(.5,#e85db2),color-stop(.5,#d12e8e),to(#ff009c));background-image:-moz-linear-gradient(to bottom,#fc7cca,#e85db2 50%,#d12e8e 50%,#ff009c);background-image:-webkit-linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c);background-image:linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c)}.annotator-editor a.annotator-save:after{background-position:0 -120px}.annotator-editor a.annotator-save.annotator-focus:after,.annotator-editor a.annotator-save:focus:after,.annotator-editor a.annotator-save:hover:after{margin-top:-8px;background-position:0 -135px}.annotator-editor .annotator-widget:after{background-position:0 -30px}.annotator-editor.annotator-invert-y .annotator-widget .annotator-controls{background-color:#f2f2f2}.annotator-editor.annotator-invert-y .annotator-widget:after{background-position:0 -45px;height:11px}.annotator-resize{position:absolute;top:0;right:0;width:12px;height:12px;background-position:2px -150px}.annotator-invert-x .annotator-resize{right:auto;left:0;background-position:0 -195px}.annotator-invert-y .annotator-resize{top:auto;bottom:0;background-position:2px -165px}.annotator-invert-y.annotator-invert-x .annotator-resize{background-position:0 -180px}.annotator-notice{color:#fff;position:fixed;top:-54px;left:0;width:100%;font-size:14px;line-height:50px;text-align:center;background:#000;background:rgba(0,0,0,.9);border-bottom:4px solid #d4d4d4;-webkit-transition:top .4s ease-out;-moz-transition:top .4s ease-out;-o-transition:top .4s ease-out;transition:top .4s ease-out}.annotator-notice-success{border-color:#3665f9}.annotator-notice-error{border-color:#ff7e00}.annotator-notice p{margin:0}.annotator-notice a{color:#fff}.annotator-notice-show{top:0}.annotator-tags{margin-bottom:-2px}.annotator-tags .annotator-tag{display:inline-block;padding:0 8px;margin-bottom:2px;line-height:1.6;font-weight:700;background-color:#e6e6e6;-webkit-border-radius:8px;-moz-border-radius:8px;-o-border-radius:8px;border-radius:8px}.annotator-filter{position:fixed;top:0;right:0;left:0;text-align:left;line-height:0;border:none;border-bottom:1px solid #878787;padding-left:10px;padding-right:10px;-webkit-border-radius:0;-moz-border-radius:0;-o-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-moz-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-o-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3)}.annotator-filter strong{font-size:12px;font-weight:700;color:#3c3c3c;text-shadow:0 1px 0 hsla(0,0%,100%,.7);position:relative;top:-9px}.annotator-filter .annotator-filter-navigation,.annotator-filter .annotator-filter-property{position:relative;display:inline-block;overflow:hidden;line-height:10px;padding:2px 0;margin-right:8px}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-property label{text-align:left;display:block;float:left;line-height:20px;-webkit-border-radius:10px 0 0 10px;-moz-border-radius:10px 0 0 10px;-o-border-radius:10px 0 0 10px;border-radius:10px 0 0 10px}.annotator-filter .annotator-filter-property label{padding-left:8px}.annotator-filter .annotator-filter-property input{display:block;float:right;-webkit-appearance:none;background-color:#fff;border:1px solid #878787;border-left:none;padding:2px 4px;line-height:16px;min-height:16px;font-size:12px;width:150px;color:#333;background-color:#f8f8f8;-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-o-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);box-shadow:inset 0 1px 1px rgba(0,0,0,.2)}.annotator-filter .annotator-filter-property input:focus{outline:none;background-color:#fff}.annotator-filter .annotator-filter-clear{position:absolute;right:3px;top:6px;border:none;text-indent:-900em;width:15px;height:15px;background-position:0 -90px;opacity:.4}.annotator-filter .annotator-filter-clear:focus,.annotator-filter .annotator-filter-clear:hover{opacity:.8}.annotator-filter .annotator-filter-clear:active{opacity:1}.annotator-filter .annotator-filter-navigation button{border:1px solid #a2a2a2;padding:0;text-indent:-900px;width:20px;min-height:22px;-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8)}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-navigation button:focus,.annotator-filter .annotator-filter-navigation button:hover{color:transparent}.annotator-filter .annotator-filter-navigation button:after{position:absolute;top:8px;left:8px;content:"";display:block;width:9px;height:9px;background-position:0 -210px}.annotator-filter .annotator-filter-navigation button:hover:after{background-position:0 -225px}.annotator-filter .annotator-filter-navigation .annotator-filter-next{-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;border-left:none}.annotator-filter .annotator-filter-navigation .annotator-filter-next:after{left:auto;right:7px;background-position:0 -240px}.annotator-filter .annotator-filter-navigation .annotator-filter-next:hover:after{background-position:0 -255px}.annotator-hl-active{background:#ffff0a;background:rgba(255,255,10,.8);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#CCFFFF0A, endColorstr=#CCFFFF0A)"}.annotator-hl-filtered{background-color:transparent}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.woff) format("woff"),url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}@font-face{font-family:Lato;font-weight:100;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-hairline.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-hairline.woff) format("woff")}@font-face{font-family:Lato;font-weight:100;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-hairline-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-hairline-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-thin.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-thin.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-thin-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-thin-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-light.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-light.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-light-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-light-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-normal.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-normal.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-normal-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-normal-italic.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-medium.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-medium.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-medium-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-medium-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-semibold.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-semibold.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-semibold-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-semibold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-bold.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-bold.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-bold-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-bold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-heavy.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-heavy.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-heavy-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-heavy-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-black.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-black.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-black-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-black-italic.woff) format("woff")}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}.material-icons.md-dark{color:rgba(0,0,0,.54)}.material-icons.md-dark.md-inactive{color:rgba(0,0,0,.26)}.material-icons.md-light{color:#fff}.material-icons.md-light.md-inactive{color:hsla(0,0%,100%,.3)}#article{font-size:20px;margin:0 auto;max-width:45em}#article article{color:#424242;font-size:18px;line-height:1.7em}#article article h1,#article article h2,#article article h3,#article article h4,#article article h5,#article article h6{color:#212121}#article article h1 strong,#article article h2 strong,#article article h3 strong,#article article h4 strong,#article article h5 strong,#article article h6 strong{font-weight:500}#article article h6{font-size:1.2rem}#article article h5{font-size:1.6rem}#article article h4{font-size:1.9rem}#article article h3{font-size:2.2rem}#article article h2{font-size:2.5rem}#article article h1{font-size:2.7rem}#article article a{border-bottom:1px dotted #03a9f4;text-decoration:none}#article article a:hover{border-bottom-style:solid}#article article ul{padding-left:30px}#article article ul,#article article ul li{list-style-type:disc}#article article blockquote{font-style:italic}#article article strong{font-weight:700}#article figure,#article img{max-width:100%;height:auto}#article pre{box-sizing:border-box;margin:0 0 1.75em;border:1px solid #e3f2fd;width:100%;padding:10px;font-family:monospace;font-size:.8em;white-space:pre;overflow:auto;background:#f5f5f5;border-radius:3px}#article>header>h1{font-size:2em;margin:2.1rem 0 .68rem}#article aside .tools{display:flex;flex-flow:row wrap}#article aside .tools .stats{font-size:.8em;margin:8px 15px 5px}#article aside .tools .stats li{display:inline-flex;vertical-align:middle;margin:0 5px}#article aside .tools .stats a{color:#000;text-decoration:none}#article aside .tools .tags{float:right;margin:5px 15px 10px}#article aside .chip{background-color:rgba(0,151,167,.85);padding:0 15px 0 10px;margin:auto 2px}#article aside .chip a,#article aside .chip i{color:#fff}#article aside .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.reader-mode{width:70px!important;transition:width .2s ease}.reader-mode .collapsible-body{height:0;overflow:hidden}.reader-mode span{opacity:0;transition:opacity .2s ease}.reader-mode:hover{width:260px!important}.reader-mode:hover .collapsible-body{height:auto}.reader-mode:hover .collapsible-body li a i.material-icons{margin:auto 5px auto -8px}.reader-mode:hover span{opacity:1}.progress{position:fixed;top:0;width:100%;height:3px;margin:0;z-index:9999}main #content{padding:0 .5rem}main ul.row{padding:0 .75rem}.data .card .card-body{height:19em;overflow:hidden}.card .card-content .card-title,.card .card-reveal .card-title{line-height:22.8px;max-height:80px;font-size:19px;font-family:roberto,Helvetica Neue,Helvetica,Arial,sans-serif;color:#313131}.card .card-stacked .card-content .card-title{display:inline-block}.card .card-content .activator,.card .card-reveal .activator{cursor:pointer;font-family:Material Icons}.card .card-content i.right,.card .card-reveal i.right{margin-left:0}.card .card-content .original{line-height:24px;font-size:15px}.card .card-entry-labels{position:absolute;top:10px;z-index:90;max-width:50%}.card .card-entry-labels-hidden{margin:2.5px auto}.card .card-entry-labels-hidden li{display:inline-block;background-color:rgba(0,151,167,.85);margin:0 5px;padding:5px 12px;border-radius:3px;color:#fff;max-height:2em;max-width:calc(100% - 15px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card .card-content .estimatedTime{margin-bottom:10px}.card .card-action{padding:10px 5px 10px 15px}.card .card-action ul.links{margin:0;font-size:24px;line-height:24px}.card .card-action a{color:#fff;margin:0}.card .card-action a:hover{color:#fff}.card .card-action ul.tools li a.tool{margin-right:5px!important}.card .card-action .reading-time{display:inline-flex;vertical-align:middle}.card .card-action .reading-time span{margin-right:5px}.card .card-image{height:10em}.card .card-fullimage{height:13.5em}.card .card-fullimage .preview,.card .card-image .preview{height:14em;background:no-repeat 50%/cover}.card.sw{max-width:370px;margin-left:auto;margin-right:auto}a.original:not(.waves-effect){text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.card-entry-labels li,.card-tag-labels li{margin:10px 10px 10px auto;padding:5px 12px 5px 16px!important;background-color:rgba(0,151,167,.85);border-radius:0 3px 3px 0;color:#fff;cursor:default;max-height:2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#list .chip a,.card-entry-labels-hidden a,.card-entry-labels a,.card-entry-tags a,.card-tag-labels a{text-decoration:none;font-weight:400;color:#fff}.card-stacked:hover ul.tools-list{display:block}.card-stacked ul.tools-list{display:none}.quickstart .card .card-action a,.quickstart .card .card-action a:hover{color:#fff!important}.settings .div_tabs{padding-bottom:15px}.results{height:1em}.results .nb-results,.results .pagination{margin:15px 15px 0}.results .nb-results{display:inline-flex}.results a{color:#444}.pagination{float:right}.pagination ul{margin:0!important}.pagination ul .next.disabled,.pagination ul .prev.disabled{display:none}.pagination li{padding:0}.pagination a{padding:0 10px;height:30px;display:block}.pagination .disabled{margin-right:10px;margin-left:10px}.pagination li.active span{padding:0 10px;height:30px;display:block;color:#fff}.page-footer .footer-copyright{min-width:50px;height:auto!important;line-height:1em!important}.page-footer .footer-copyright p{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.hidden,.picker__date-display{display:none}footer.page-footer{margin-top:10px;padding-top:0}footer .row{margin-bottom:10px}#filters button{padding:0;width:100%}#filters div.with-checkbox{height:3rem;margin-top:0}body{display:flex;min-height:100vh;flex-direction:column;background:#fafafa}body.login main{padding:0;min-height:100vh}.border-bottom{border-bottom:1px solid #ddd}footer,main,nav{padding-left:240px}#content,.valign-wrapper,main{height:100%}#main{flex:1 0 auto}#main .logo a{height:100pt}#main .logo img{height:100pt;width:100pt}#main .logo:hover{background:transparent}nav{height:auto}nav input{color:#aaa}nav ul a:hover{background-color:initial}.nav-wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;min-height:64px}.nav-wrapper .button-collapse{padding:0 15px}.nav-input{display:none}.nav-panel-buttom{display:flex;flex-grow:1;justify-content:flex-end}.nav-panel-buttom li{max-height:64px}.nav-panel-add .add,.nav-panel-search .search,.nav-panels .close{color:#444!important}.nav-panels{transition:background .2s ease}.nav-panels .action{padding-left:.75rem;font-size:2.1rem;white-space:nowrap}.nav-panels .input-field input{display:block;line-height:inherit;padding-left:4rem!important;width:calc(100% - 8rem);height:4.1rem}.nav-panels .input-field input:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field.nav-panel-add label,.input-field.nav-panel-search label{left:1rem}.input-field.nav-panel-add .close,.input-field.nav-panel-search .close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}.input-field.nav-panel-add,.input-field.nav-panel-add form,.input-field.nav-panel-search,.input-field.nav-panel-search form{display:flex;flex:1}#button_export,#button_filters{display:none}.side-nav{width:240px}.side-nav li{padding:0}.side-nav li.logo>a:hover{background:initial}.side-nav a{margin:0}.side-nav.fixed a{font-size:13px;line-height:44px;height:44px}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{height:45px;line-height:44px;padding:0 20px}.side-nav>li.logo{line-height:0;text-align:center}.bold>a{font-weight:700}span.numberItems{float:right}div.settings div.file-field div,div.settings div.file-field ul{margin-top:40px}div.settings div.file-field div{margin-top:inherit}.input-field label.active{font-size:1rem}nav .input-field input{margin:0}.tabs{display:flex}.tab{flex:1}@font-face{font-family:icomoon;src:url(/bundles/wallabagcore/fonts/IcoMoon-Free.ttf);font-weight:400;font-style:normal}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;width:1em;height:1em;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.material-icons .md-18{font-size:18px}.material-icons .md-24{font-size:24px}.material-icons .md-36{font-size:36px}.material-icons .md-48{font-size:48px}.material-icons .md-dark{color:rgba(0,0,0,.54)}.material-icons .md-dark .md-inactive{color:rgba(0,0,0,.26)}.material-icons .md-light{color:#fff}.material-icons .md-light .md-inactive{color:hsla(0,0%,100%,.3)}[class*=" icon-"]:before,[class^=icon-]:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;background-size:24px;letter-spacing:0;font-feature-settings:"liga"}.icon-eye:before{content:"\E9CE"}.icon-no-eye:before{content:"\E9D1"}.icon-calendar:before{content:"\E953"}.icon-mail:before{content:"\EA86"}.icon-time:before{content:"\E952"}a.icon-image{background-repeat:no-repeat;padding-right:.4em!important;padding-left:0!important;margin-left:25px}a.icon-image:before{content:"";display:block;width:24px;height:24px;float:left;margin:7px 1.5px 0 0}a.icon-image.carrot:before{background:url(/bundles/wallabagcore/img/carrot-icon--black.png) no-repeat 50%/90%}a.icon-image.diaspora:before{background:url(/bundles/wallabagcore/img/diaspora-icon--black.png) no-repeat 50%/80%}a.icon-image.unmark:before{background:url(/bundles/wallabagcore/img/unmark-icon--black.png) no-repeat 50%/80%}a.icon-image.shaarli:before{background:url(/bundles/wallabagcore/img/shaarli.png) no-repeat 50%/80%}a.icon-image.scuttle:before{background:url(/bundles/wallabagcore/img/scuttle.png) no-repeat 50%/80%}.icon-google-plus2:before{content:"\EA89"}.icon-facebook2:before{content:"\EA8D"}.icon-twitter:before{content:"\EA96"}.icon-apple:before{content:"\EABF"}.icon-android:before{content:"\EAC1"}.icon-chrome:before{content:"\EAE5"}.icon-firefox:before{content:"\EAE6"}.icon-link:before{content:"\E9CB"}footer [class*=" icon-"],footer [class^=icon-]{font-size:2em;transition:text-shadow .2s ease;padding-right:10px}footer [class*=" icon-"]:hover,footer [class^=icon-]:hover{text-shadow:0 0 10px rgba(0,0,0,.3)}@media print{body{font-family:Serif;background-color:#fff}@page{margin:1cm}img{max-width:100%!important}#article .mbm a,#article>aside,#article_toolbar,#links,#slide-out,#sort,.entry+.results,.hide-on-large-only,.messages,.progress,.top_link,body>footer,body>header,div.tools,header div{display:none!important}main{padding-left:0!important}#article{margin:inherit!important}article{border:none!important}.vieworiginal a:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.pagination span.current{border-style:dashed}#main{margin:0;padding:0}#article,#main{width:100%}}@media only screen and (max-width:992px){footer,header,main,nav{padding-left:0}.pagination{width:auto}.nav-panels .action{padding-right:.75rem}.nav-panel-buttom{justify-content:space-around}#article{max-width:35em;margin-left:auto;margin-right:auto;font-size:18px}#article>header>h1{font-size:1.33em}.reader-mode{width:240px!important}.reader-mode span{opacity:1}.tabs{display:inline-block;height:auto}.tab{min-width:100%}.indicator{display:none}.pagination li.next,.pagination li.prev{width:auto}.drag-target+.drag-target{height:50%}.drag-target+.drag-target+.drag-target{top:50%}}@media only screen and (min-width:1200px) and (max-width:1650px){.row .col.l3{width:33.33333%;margin-left:0}}@media only screen and (min-width:993px) and (max-width:1200px){.row .col.l1{width:25%;margin-left:0}.row .col.l2{width:33.33333%;margin-left:0}.row .col.l3{width:41.66667%;margin-left:0}.row .col.l4{width:50%;margin-left:0}.row .col.l5{width:58.33333%;margin-left:0}.row .col.l6{width:66.66667%;margin-left:0}.row .col.l7{width:75%;margin-left:0}.row .col.l8{width:83.33333%;margin-left:0}.row .col.l9{width:91.66667%;margin-left:0}.row .col.l10{width:100%;margin-left:0}}@media only screen and (max-width:350px){.nb-results{display:none}.row .col,main ul.row{padding:0}}
+.materialize-red{background-color:#e51c23!important}.materialize-red-text{color:#e51c23!important}.materialize-red.lighten-5{background-color:#fdeaeb!important}.materialize-red-text.text-lighten-5{color:#fdeaeb!important}.materialize-red.lighten-4{background-color:#f8c1c3!important}.materialize-red-text.text-lighten-4{color:#f8c1c3!important}.materialize-red.lighten-3{background-color:#f3989b!important}.materialize-red-text.text-lighten-3{color:#f3989b!important}.materialize-red.lighten-2{background-color:#ee6e73!important}.materialize-red-text.text-lighten-2{color:#ee6e73!important}.materialize-red.lighten-1{background-color:#ea454b!important}.materialize-red-text.text-lighten-1{color:#ea454b!important}.materialize-red.darken-1{background-color:#d0181e!important}.materialize-red-text.text-darken-1{color:#d0181e!important}.materialize-red.darken-2{background-color:#b9151b!important}.materialize-red-text.text-darken-2{color:#b9151b!important}.materialize-red.darken-3{background-color:#a21318!important}.materialize-red-text.text-darken-3{color:#a21318!important}.materialize-red.darken-4{background-color:#8b1014!important}.materialize-red-text.text-darken-4{color:#8b1014!important}.red{background-color:#f44336!important}.red-text{color:#f44336!important}.red.lighten-5{background-color:#ffebee!important}.red-text.text-lighten-5{color:#ffebee!important}.red.lighten-4{background-color:#ffcdd2!important}.red-text.text-lighten-4{color:#ffcdd2!important}.red.lighten-3{background-color:#ef9a9a!important}.red-text.text-lighten-3{color:#ef9a9a!important}.red.lighten-2{background-color:#e57373!important}.red-text.text-lighten-2{color:#e57373!important}.red.lighten-1{background-color:#ef5350!important}.red-text.text-lighten-1{color:#ef5350!important}.red.darken-1{background-color:#e53935!important}.red-text.text-darken-1{color:#e53935!important}.red.darken-2{background-color:#d32f2f!important}.red-text.text-darken-2{color:#d32f2f!important}.red.darken-3{background-color:#c62828!important}.red-text.text-darken-3{color:#c62828!important}.red.darken-4{background-color:#b71c1c!important}.red-text.text-darken-4{color:#b71c1c!important}.red.accent-1{background-color:#ff8a80!important}.red-text.text-accent-1{color:#ff8a80!important}.red.accent-2{background-color:#ff5252!important}.red-text.text-accent-2{color:#ff5252!important}.red.accent-3{background-color:#ff1744!important}.red-text.text-accent-3{color:#ff1744!important}.red.accent-4{background-color:#d50000!important}.red-text.text-accent-4{color:#d50000!important}.pink{background-color:#e91e63!important}.pink-text{color:#e91e63!important}.pink.lighten-5{background-color:#fce4ec!important}.pink-text.text-lighten-5{color:#fce4ec!important}.pink.lighten-4{background-color:#f8bbd0!important}.pink-text.text-lighten-4{color:#f8bbd0!important}.pink.lighten-3{background-color:#f48fb1!important}.pink-text.text-lighten-3{color:#f48fb1!important}.pink.lighten-2{background-color:#f06292!important}.pink-text.text-lighten-2{color:#f06292!important}.pink.lighten-1{background-color:#ec407a!important}.pink-text.text-lighten-1{color:#ec407a!important}.pink.darken-1{background-color:#d81b60!important}.pink-text.text-darken-1{color:#d81b60!important}.pink.darken-2{background-color:#c2185b!important}.pink-text.text-darken-2{color:#c2185b!important}.pink.darken-3{background-color:#ad1457!important}.pink-text.text-darken-3{color:#ad1457!important}.pink.darken-4{background-color:#880e4f!important}.pink-text.text-darken-4{color:#880e4f!important}.pink.accent-1{background-color:#ff80ab!important}.pink-text.text-accent-1{color:#ff80ab!important}.pink.accent-2{background-color:#ff4081!important}.pink-text.text-accent-2{color:#ff4081!important}.pink.accent-3{background-color:#f50057!important}.pink-text.text-accent-3{color:#f50057!important}.pink.accent-4{background-color:#c51162!important}.pink-text.text-accent-4{color:#c51162!important}.purple{background-color:#9c27b0!important}.purple-text{color:#9c27b0!important}.purple.lighten-5{background-color:#f3e5f5!important}.purple-text.text-lighten-5{color:#f3e5f5!important}.purple.lighten-4{background-color:#e1bee7!important}.purple-text.text-lighten-4{color:#e1bee7!important}.purple.lighten-3{background-color:#ce93d8!important}.purple-text.text-lighten-3{color:#ce93d8!important}.purple.lighten-2{background-color:#ba68c8!important}.purple-text.text-lighten-2{color:#ba68c8!important}.purple.lighten-1{background-color:#ab47bc!important}.purple-text.text-lighten-1{color:#ab47bc!important}.purple.darken-1{background-color:#8e24aa!important}.purple-text.text-darken-1{color:#8e24aa!important}.purple.darken-2{background-color:#7b1fa2!important}.purple-text.text-darken-2{color:#7b1fa2!important}.purple.darken-3{background-color:#6a1b9a!important}.purple-text.text-darken-3{color:#6a1b9a!important}.purple.darken-4{background-color:#4a148c!important}.purple-text.text-darken-4{color:#4a148c!important}.purple.accent-1{background-color:#ea80fc!important}.purple-text.text-accent-1{color:#ea80fc!important}.purple.accent-2{background-color:#e040fb!important}.purple-text.text-accent-2{color:#e040fb!important}.purple.accent-3{background-color:#d500f9!important}.purple-text.text-accent-3{color:#d500f9!important}.purple.accent-4{background-color:#a0f!important}.purple-text.text-accent-4{color:#a0f!important}.deep-purple{background-color:#673ab7!important}.deep-purple-text{color:#673ab7!important}.deep-purple.lighten-5{background-color:#ede7f6!important}.deep-purple-text.text-lighten-5{color:#ede7f6!important}.deep-purple.lighten-4{background-color:#d1c4e9!important}.deep-purple-text.text-lighten-4{color:#d1c4e9!important}.deep-purple.lighten-3{background-color:#b39ddb!important}.deep-purple-text.text-lighten-3{color:#b39ddb!important}.deep-purple.lighten-2{background-color:#9575cd!important}.deep-purple-text.text-lighten-2{color:#9575cd!important}.deep-purple.lighten-1{background-color:#7e57c2!important}.deep-purple-text.text-lighten-1{color:#7e57c2!important}.deep-purple.darken-1{background-color:#5e35b1!important}.deep-purple-text.text-darken-1{color:#5e35b1!important}.deep-purple.darken-2{background-color:#512da8!important}.deep-purple-text.text-darken-2{color:#512da8!important}.deep-purple.darken-3{background-color:#4527a0!important}.deep-purple-text.text-darken-3{color:#4527a0!important}.deep-purple.darken-4{background-color:#311b92!important}.deep-purple-text.text-darken-4{color:#311b92!important}.deep-purple.accent-1{background-color:#b388ff!important}.deep-purple-text.text-accent-1{color:#b388ff!important}.deep-purple.accent-2{background-color:#7c4dff!important}.deep-purple-text.text-accent-2{color:#7c4dff!important}.deep-purple.accent-3{background-color:#651fff!important}.deep-purple-text.text-accent-3{color:#651fff!important}.deep-purple.accent-4{background-color:#6200ea!important}.deep-purple-text.text-accent-4{color:#6200ea!important}.indigo{background-color:#3f51b5!important}.indigo-text{color:#3f51b5!important}.indigo.lighten-5{background-color:#e8eaf6!important}.indigo-text.text-lighten-5{color:#e8eaf6!important}.indigo.lighten-4{background-color:#c5cae9!important}.indigo-text.text-lighten-4{color:#c5cae9!important}.indigo.lighten-3{background-color:#9fa8da!important}.indigo-text.text-lighten-3{color:#9fa8da!important}.indigo.lighten-2{background-color:#7986cb!important}.indigo-text.text-lighten-2{color:#7986cb!important}.indigo.lighten-1{background-color:#5c6bc0!important}.indigo-text.text-lighten-1{color:#5c6bc0!important}.indigo.darken-1{background-color:#3949ab!important}.indigo-text.text-darken-1{color:#3949ab!important}.indigo.darken-2{background-color:#303f9f!important}.indigo-text.text-darken-2{color:#303f9f!important}.indigo.darken-3{background-color:#283593!important}.indigo-text.text-darken-3{color:#283593!important}.indigo.darken-4{background-color:#1a237e!important}.indigo-text.text-darken-4{color:#1a237e!important}.indigo.accent-1{background-color:#8c9eff!important}.indigo-text.text-accent-1{color:#8c9eff!important}.indigo.accent-2{background-color:#536dfe!important}.indigo-text.text-accent-2{color:#536dfe!important}.indigo.accent-3{background-color:#3d5afe!important}.indigo-text.text-accent-3{color:#3d5afe!important}.indigo.accent-4{background-color:#304ffe!important}.indigo-text.text-accent-4{color:#304ffe!important}.blue{background-color:#2196f3!important}.blue-text{color:#2196f3!important}.blue.lighten-5{background-color:#e3f2fd!important}.blue-text.text-lighten-5{color:#e3f2fd!important}.blue.lighten-4{background-color:#bbdefb!important}.blue-text.text-lighten-4{color:#bbdefb!important}.blue.lighten-3{background-color:#90caf9!important}.blue-text.text-lighten-3{color:#90caf9!important}.blue.lighten-2{background-color:#64b5f6!important}.blue-text.text-lighten-2{color:#64b5f6!important}.blue.lighten-1{background-color:#42a5f5!important}.blue-text.text-lighten-1{color:#42a5f5!important}.blue.darken-1{background-color:#1e88e5!important}.blue-text.text-darken-1{color:#1e88e5!important}.blue.darken-2{background-color:#1976d2!important}.blue-text.text-darken-2{color:#1976d2!important}.blue.darken-3{background-color:#1565c0!important}.blue-text.text-darken-3{color:#1565c0!important}.blue.darken-4{background-color:#0d47a1!important}.blue-text.text-darken-4{color:#0d47a1!important}.blue.accent-1{background-color:#82b1ff!important}.blue-text.text-accent-1{color:#82b1ff!important}.blue.accent-2{background-color:#448aff!important}.blue-text.text-accent-2{color:#448aff!important}.blue.accent-3{background-color:#2979ff!important}.blue-text.text-accent-3{color:#2979ff!important}.blue.accent-4{background-color:#2962ff!important}.blue-text.text-accent-4{color:#2962ff!important}.light-blue{background-color:#03a9f4!important}.light-blue-text{color:#03a9f4!important}.light-blue.lighten-5{background-color:#e1f5fe!important}.light-blue-text.text-lighten-5{color:#e1f5fe!important}.light-blue.lighten-4{background-color:#b3e5fc!important}.light-blue-text.text-lighten-4{color:#b3e5fc!important}.light-blue.lighten-3{background-color:#81d4fa!important}.light-blue-text.text-lighten-3{color:#81d4fa!important}.light-blue.lighten-2{background-color:#4fc3f7!important}.light-blue-text.text-lighten-2{color:#4fc3f7!important}.light-blue.lighten-1{background-color:#29b6f6!important}.light-blue-text.text-lighten-1{color:#29b6f6!important}.light-blue.darken-1{background-color:#039be5!important}.light-blue-text.text-darken-1{color:#039be5!important}.light-blue.darken-2{background-color:#0288d1!important}.light-blue-text.text-darken-2{color:#0288d1!important}.light-blue.darken-3{background-color:#0277bd!important}.light-blue-text.text-darken-3{color:#0277bd!important}.light-blue.darken-4{background-color:#01579b!important}.light-blue-text.text-darken-4{color:#01579b!important}.light-blue.accent-1{background-color:#80d8ff!important}.light-blue-text.text-accent-1{color:#80d8ff!important}.light-blue.accent-2{background-color:#40c4ff!important}.light-blue-text.text-accent-2{color:#40c4ff!important}.light-blue.accent-3{background-color:#00b0ff!important}.light-blue-text.text-accent-3{color:#00b0ff!important}.light-blue.accent-4{background-color:#0091ea!important}.light-blue-text.text-accent-4{color:#0091ea!important}.cyan{background-color:#00bcd4!important}.cyan-text{color:#00bcd4!important}.cyan.lighten-5{background-color:#e0f7fa!important}.cyan-text.text-lighten-5{color:#e0f7fa!important}.cyan.lighten-4{background-color:#b2ebf2!important}.cyan-text.text-lighten-4{color:#b2ebf2!important}.cyan.lighten-3{background-color:#80deea!important}.cyan-text.text-lighten-3{color:#80deea!important}.cyan.lighten-2{background-color:#4dd0e1!important}.cyan-text.text-lighten-2{color:#4dd0e1!important}.cyan.lighten-1{background-color:#26c6da!important}.cyan-text.text-lighten-1{color:#26c6da!important}.cyan.darken-1{background-color:#00acc1!important}.cyan-text.text-darken-1{color:#00acc1!important}.cyan.darken-2{background-color:#0097a7!important}.cyan-text.text-darken-2{color:#0097a7!important}.cyan.darken-3{background-color:#00838f!important}.cyan-text.text-darken-3{color:#00838f!important}.cyan.darken-4{background-color:#006064!important}.cyan-text.text-darken-4{color:#006064!important}.cyan.accent-1{background-color:#84ffff!important}.cyan-text.text-accent-1{color:#84ffff!important}.cyan.accent-2{background-color:#18ffff!important}.cyan-text.text-accent-2{color:#18ffff!important}.cyan.accent-3{background-color:#00e5ff!important}.cyan-text.text-accent-3{color:#00e5ff!important}.cyan.accent-4{background-color:#00b8d4!important}.cyan-text.text-accent-4{color:#00b8d4!important}.teal{background-color:#009688!important}.teal-text{color:#009688!important}.teal.lighten-5{background-color:#e0f2f1!important}.teal-text.text-lighten-5{color:#e0f2f1!important}.teal.lighten-4{background-color:#b2dfdb!important}.teal-text.text-lighten-4{color:#b2dfdb!important}.teal.lighten-3{background-color:#80cbc4!important}.teal-text.text-lighten-3{color:#80cbc4!important}.teal.lighten-2{background-color:#4db6ac!important}.teal-text.text-lighten-2{color:#4db6ac!important}.teal.lighten-1{background-color:#26a69a!important}.teal-text.text-lighten-1{color:#26a69a!important}.teal.darken-1{background-color:#00897b!important}.teal-text.text-darken-1{color:#00897b!important}.teal.darken-2{background-color:#00796b!important}.teal-text.text-darken-2{color:#00796b!important}.teal.darken-3{background-color:#00695c!important}.teal-text.text-darken-3{color:#00695c!important}.teal.darken-4{background-color:#004d40!important}.teal-text.text-darken-4{color:#004d40!important}.teal.accent-1{background-color:#a7ffeb!important}.teal-text.text-accent-1{color:#a7ffeb!important}.teal.accent-2{background-color:#64ffda!important}.teal-text.text-accent-2{color:#64ffda!important}.teal.accent-3{background-color:#1de9b6!important}.teal-text.text-accent-3{color:#1de9b6!important}.teal.accent-4{background-color:#00bfa5!important}.teal-text.text-accent-4{color:#00bfa5!important}.green{background-color:#4caf50!important}.green-text{color:#4caf50!important}.green.lighten-5{background-color:#e8f5e9!important}.green-text.text-lighten-5{color:#e8f5e9!important}.green.lighten-4{background-color:#c8e6c9!important}.green-text.text-lighten-4{color:#c8e6c9!important}.green.lighten-3{background-color:#a5d6a7!important}.green-text.text-lighten-3{color:#a5d6a7!important}.green.lighten-2{background-color:#81c784!important}.green-text.text-lighten-2{color:#81c784!important}.green.lighten-1{background-color:#66bb6a!important}.green-text.text-lighten-1{color:#66bb6a!important}.green.darken-1{background-color:#43a047!important}.green-text.text-darken-1{color:#43a047!important}.green.darken-2{background-color:#388e3c!important}.green-text.text-darken-2{color:#388e3c!important}.green.darken-3{background-color:#2e7d32!important}.green-text.text-darken-3{color:#2e7d32!important}.green.darken-4{background-color:#1b5e20!important}.green-text.text-darken-4{color:#1b5e20!important}.green.accent-1{background-color:#b9f6ca!important}.green-text.text-accent-1{color:#b9f6ca!important}.green.accent-2{background-color:#69f0ae!important}.green-text.text-accent-2{color:#69f0ae!important}.green.accent-3{background-color:#00e676!important}.green-text.text-accent-3{color:#00e676!important}.green.accent-4{background-color:#00c853!important}.green-text.text-accent-4{color:#00c853!important}.light-green{background-color:#8bc34a!important}.light-green-text{color:#8bc34a!important}.light-green.lighten-5{background-color:#f1f8e9!important}.light-green-text.text-lighten-5{color:#f1f8e9!important}.light-green.lighten-4{background-color:#dcedc8!important}.light-green-text.text-lighten-4{color:#dcedc8!important}.light-green.lighten-3{background-color:#c5e1a5!important}.light-green-text.text-lighten-3{color:#c5e1a5!important}.light-green.lighten-2{background-color:#aed581!important}.light-green-text.text-lighten-2{color:#aed581!important}.light-green.lighten-1{background-color:#9ccc65!important}.light-green-text.text-lighten-1{color:#9ccc65!important}.light-green.darken-1{background-color:#7cb342!important}.light-green-text.text-darken-1{color:#7cb342!important}.light-green.darken-2{background-color:#689f38!important}.light-green-text.text-darken-2{color:#689f38!important}.light-green.darken-3{background-color:#558b2f!important}.light-green-text.text-darken-3{color:#558b2f!important}.light-green.darken-4{background-color:#33691e!important}.light-green-text.text-darken-4{color:#33691e!important}.light-green.accent-1{background-color:#ccff90!important}.light-green-text.text-accent-1{color:#ccff90!important}.light-green.accent-2{background-color:#b2ff59!important}.light-green-text.text-accent-2{color:#b2ff59!important}.light-green.accent-3{background-color:#76ff03!important}.light-green-text.text-accent-3{color:#76ff03!important}.light-green.accent-4{background-color:#64dd17!important}.light-green-text.text-accent-4{color:#64dd17!important}.lime{background-color:#cddc39!important}.lime-text{color:#cddc39!important}.lime.lighten-5{background-color:#f9fbe7!important}.lime-text.text-lighten-5{color:#f9fbe7!important}.lime.lighten-4{background-color:#f0f4c3!important}.lime-text.text-lighten-4{color:#f0f4c3!important}.lime.lighten-3{background-color:#e6ee9c!important}.lime-text.text-lighten-3{color:#e6ee9c!important}.lime.lighten-2{background-color:#dce775!important}.lime-text.text-lighten-2{color:#dce775!important}.lime.lighten-1{background-color:#d4e157!important}.lime-text.text-lighten-1{color:#d4e157!important}.lime.darken-1{background-color:#c0ca33!important}.lime-text.text-darken-1{color:#c0ca33!important}.lime.darken-2{background-color:#afb42b!important}.lime-text.text-darken-2{color:#afb42b!important}.lime.darken-3{background-color:#9e9d24!important}.lime-text.text-darken-3{color:#9e9d24!important}.lime.darken-4{background-color:#827717!important}.lime-text.text-darken-4{color:#827717!important}.lime.accent-1{background-color:#f4ff81!important}.lime-text.text-accent-1{color:#f4ff81!important}.lime.accent-2{background-color:#eeff41!important}.lime-text.text-accent-2{color:#eeff41!important}.lime.accent-3{background-color:#c6ff00!important}.lime-text.text-accent-3{color:#c6ff00!important}.lime.accent-4{background-color:#aeea00!important}.lime-text.text-accent-4{color:#aeea00!important}.yellow{background-color:#ffeb3b!important}.yellow-text{color:#ffeb3b!important}.yellow.lighten-5{background-color:#fffde7!important}.yellow-text.text-lighten-5{color:#fffde7!important}.yellow.lighten-4{background-color:#fff9c4!important}.yellow-text.text-lighten-4{color:#fff9c4!important}.yellow.lighten-3{background-color:#fff59d!important}.yellow-text.text-lighten-3{color:#fff59d!important}.yellow.lighten-2{background-color:#fff176!important}.yellow-text.text-lighten-2{color:#fff176!important}.yellow.lighten-1{background-color:#ffee58!important}.yellow-text.text-lighten-1{color:#ffee58!important}.yellow.darken-1{background-color:#fdd835!important}.yellow-text.text-darken-1{color:#fdd835!important}.yellow.darken-2{background-color:#fbc02d!important}.yellow-text.text-darken-2{color:#fbc02d!important}.yellow.darken-3{background-color:#f9a825!important}.yellow-text.text-darken-3{color:#f9a825!important}.yellow.darken-4{background-color:#f57f17!important}.yellow-text.text-darken-4{color:#f57f17!important}.yellow.accent-1{background-color:#ffff8d!important}.yellow-text.text-accent-1{color:#ffff8d!important}.yellow.accent-2{background-color:#ff0!important}.yellow-text.text-accent-2{color:#ff0!important}.yellow.accent-3{background-color:#ffea00!important}.yellow-text.text-accent-3{color:#ffea00!important}.yellow.accent-4{background-color:#ffd600!important}.yellow-text.text-accent-4{color:#ffd600!important}.amber{background-color:#ffc107!important}.amber-text{color:#ffc107!important}.amber.lighten-5{background-color:#fff8e1!important}.amber-text.text-lighten-5{color:#fff8e1!important}.amber.lighten-4{background-color:#ffecb3!important}.amber-text.text-lighten-4{color:#ffecb3!important}.amber.lighten-3{background-color:#ffe082!important}.amber-text.text-lighten-3{color:#ffe082!important}.amber.lighten-2{background-color:#ffd54f!important}.amber-text.text-lighten-2{color:#ffd54f!important}.amber.lighten-1{background-color:#ffca28!important}.amber-text.text-lighten-1{color:#ffca28!important}.amber.darken-1{background-color:#ffb300!important}.amber-text.text-darken-1{color:#ffb300!important}.amber.darken-2{background-color:#ffa000!important}.amber-text.text-darken-2{color:#ffa000!important}.amber.darken-3{background-color:#ff8f00!important}.amber-text.text-darken-3{color:#ff8f00!important}.amber.darken-4{background-color:#ff6f00!important}.amber-text.text-darken-4{color:#ff6f00!important}.amber.accent-1{background-color:#ffe57f!important}.amber-text.text-accent-1{color:#ffe57f!important}.amber.accent-2{background-color:#ffd740!important}.amber-text.text-accent-2{color:#ffd740!important}.amber.accent-3{background-color:#ffc400!important}.amber-text.text-accent-3{color:#ffc400!important}.amber.accent-4{background-color:#ffab00!important}.amber-text.text-accent-4{color:#ffab00!important}.orange{background-color:#ff9800!important}.orange-text{color:#ff9800!important}.orange.lighten-5{background-color:#fff3e0!important}.orange-text.text-lighten-5{color:#fff3e0!important}.orange.lighten-4{background-color:#ffe0b2!important}.orange-text.text-lighten-4{color:#ffe0b2!important}.orange.lighten-3{background-color:#ffcc80!important}.orange-text.text-lighten-3{color:#ffcc80!important}.orange.lighten-2{background-color:#ffb74d!important}.orange-text.text-lighten-2{color:#ffb74d!important}.orange.lighten-1{background-color:#ffa726!important}.orange-text.text-lighten-1{color:#ffa726!important}.orange.darken-1{background-color:#fb8c00!important}.orange-text.text-darken-1{color:#fb8c00!important}.orange.darken-2{background-color:#f57c00!important}.orange-text.text-darken-2{color:#f57c00!important}.orange.darken-3{background-color:#ef6c00!important}.orange-text.text-darken-3{color:#ef6c00!important}.orange.darken-4{background-color:#e65100!important}.orange-text.text-darken-4{color:#e65100!important}.orange.accent-1{background-color:#ffd180!important}.orange-text.text-accent-1{color:#ffd180!important}.orange.accent-2{background-color:#ffab40!important}.orange-text.text-accent-2{color:#ffab40!important}.orange.accent-3{background-color:#ff9100!important}.orange-text.text-accent-3{color:#ff9100!important}.orange.accent-4{background-color:#ff6d00!important}.orange-text.text-accent-4{color:#ff6d00!important}.deep-orange{background-color:#ff5722!important}.deep-orange-text{color:#ff5722!important}.deep-orange.lighten-5{background-color:#fbe9e7!important}.deep-orange-text.text-lighten-5{color:#fbe9e7!important}.deep-orange.lighten-4{background-color:#ffccbc!important}.deep-orange-text.text-lighten-4{color:#ffccbc!important}.deep-orange.lighten-3{background-color:#ffab91!important}.deep-orange-text.text-lighten-3{color:#ffab91!important}.deep-orange.lighten-2{background-color:#ff8a65!important}.deep-orange-text.text-lighten-2{color:#ff8a65!important}.deep-orange.lighten-1{background-color:#ff7043!important}.deep-orange-text.text-lighten-1{color:#ff7043!important}.deep-orange.darken-1{background-color:#f4511e!important}.deep-orange-text.text-darken-1{color:#f4511e!important}.deep-orange.darken-2{background-color:#e64a19!important}.deep-orange-text.text-darken-2{color:#e64a19!important}.deep-orange.darken-3{background-color:#d84315!important}.deep-orange-text.text-darken-3{color:#d84315!important}.deep-orange.darken-4{background-color:#bf360c!important}.deep-orange-text.text-darken-4{color:#bf360c!important}.deep-orange.accent-1{background-color:#ff9e80!important}.deep-orange-text.text-accent-1{color:#ff9e80!important}.deep-orange.accent-2{background-color:#ff6e40!important}.deep-orange-text.text-accent-2{color:#ff6e40!important}.deep-orange.accent-3{background-color:#ff3d00!important}.deep-orange-text.text-accent-3{color:#ff3d00!important}.deep-orange.accent-4{background-color:#dd2c00!important}.deep-orange-text.text-accent-4{color:#dd2c00!important}.brown{background-color:#795548!important}.brown-text{color:#795548!important}.brown.lighten-5{background-color:#efebe9!important}.brown-text.text-lighten-5{color:#efebe9!important}.brown.lighten-4{background-color:#d7ccc8!important}.brown-text.text-lighten-4{color:#d7ccc8!important}.brown.lighten-3{background-color:#bcaaa4!important}.brown-text.text-lighten-3{color:#bcaaa4!important}.brown.lighten-2{background-color:#a1887f!important}.brown-text.text-lighten-2{color:#a1887f!important}.brown.lighten-1{background-color:#8d6e63!important}.brown-text.text-lighten-1{color:#8d6e63!important}.brown.darken-1{background-color:#6d4c41!important}.brown-text.text-darken-1{color:#6d4c41!important}.brown.darken-2{background-color:#5d4037!important}.brown-text.text-darken-2{color:#5d4037!important}.brown.darken-3{background-color:#4e342e!important}.brown-text.text-darken-3{color:#4e342e!important}.brown.darken-4{background-color:#3e2723!important}.brown-text.text-darken-4{color:#3e2723!important}.blue-grey{background-color:#607d8b!important}.blue-grey-text{color:#607d8b!important}.blue-grey.lighten-5{background-color:#eceff1!important}.blue-grey-text.text-lighten-5{color:#eceff1!important}.blue-grey.lighten-4{background-color:#cfd8dc!important}.blue-grey-text.text-lighten-4{color:#cfd8dc!important}.blue-grey.lighten-3{background-color:#b0bec5!important}.blue-grey-text.text-lighten-3{color:#b0bec5!important}.blue-grey.lighten-2{background-color:#90a4ae!important}.blue-grey-text.text-lighten-2{color:#90a4ae!important}.blue-grey.lighten-1{background-color:#78909c!important}.blue-grey-text.text-lighten-1{color:#78909c!important}.blue-grey.darken-1{background-color:#546e7a!important}.blue-grey-text.text-darken-1{color:#546e7a!important}.blue-grey.darken-2{background-color:#455a64!important}.blue-grey-text.text-darken-2{color:#455a64!important}.blue-grey.darken-3{background-color:#37474f!important}.blue-grey-text.text-darken-3{color:#37474f!important}.blue-grey.darken-4{background-color:#263238!important}.blue-grey-text.text-darken-4{color:#263238!important}.grey{background-color:#9e9e9e!important}.grey-text{color:#9e9e9e!important}.grey.lighten-5{background-color:#fafafa!important}.grey-text.text-lighten-5{color:#fafafa!important}.grey.lighten-4{background-color:#f5f5f5!important}.grey-text.text-lighten-4{color:#f5f5f5!important}.grey.lighten-3{background-color:#eee!important}.grey-text.text-lighten-3{color:#eee!important}.grey.lighten-2{background-color:#e0e0e0!important}.grey-text.text-lighten-2{color:#e0e0e0!important}.grey.lighten-1{background-color:#bdbdbd!important}.grey-text.text-lighten-1{color:#bdbdbd!important}.grey.darken-1{background-color:#757575!important}.grey-text.text-darken-1{color:#757575!important}.grey.darken-2{background-color:#616161!important}.grey-text.text-darken-2{color:#616161!important}.grey.darken-3{background-color:#424242!important}.grey-text.text-darken-3{color:#424242!important}.grey.darken-4{background-color:#212121!important}.grey-text.text-darken-4{color:#212121!important}.black{background-color:#000!important}.black-text{color:#000!important}.white{background-color:#fff!important}.white-text{color:#fff!important}.transparent{background-color:transparent!important}.transparent-text{color:transparent!important}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}ul:not(.browser-default){padding-left:0;list-style-type:none}ul:not(.browser-default) li{list-style-type:none}a{color:#039be5;-webkit-tap-highlight-color:transparent}.valign-wrapper{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.clearfix{clear:both}.z-depth-0{box-shadow:none!important}.btn,.btn-floating,.btn-large,.card,.card-panel,.collapsible,.dropdown-content,.side-nav,.toast,.z-depth-1,nav{box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12),0 3px 1px -2px rgba(0,0,0,.2)}.btn-floating:hover,.btn-large:hover,.btn:hover,.z-depth-1-half{box-shadow:0 3px 3px 0 rgba(0,0,0,.14),0 1px 7px 0 rgba(0,0,0,.12),0 3px 1px -1px rgba(0,0,0,.2)}.z-depth-2{box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.3)}.z-depth-3{box-shadow:0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12),0 3px 5px -1px rgba(0,0,0,.3)}.modal,.z-depth-4{box-shadow:0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12),0 5px 5px -3px rgba(0,0,0,.3)}.z-depth-5{box-shadow:0 16px 24px 2px rgba(0,0,0,.14),0 6px 30px 5px rgba(0,0,0,.12),0 8px 10px -5px rgba(0,0,0,.3)}.hoverable{transition:box-shadow .25s;box-shadow:0}.hoverable:hover{transition:box-shadow .25s;box-shadow:0 8px 17px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19)}.divider{height:1px;overflow:hidden;background-color:#e0e0e0}blockquote{margin:20px 0;padding-left:1.5rem;border-left:5px solid #ee6e73}i{line-height:inherit}i.left{float:left;margin-right:15px}i.right{float:right;margin-left:15px}i.tiny{font-size:1rem}i.small{font-size:2rem}i.medium{font-size:4rem}i.large{font-size:6rem}img.responsive-img,video.responsive-video{max-width:100%;height:auto}.pagination li{display:inline-block;border-radius:2px;text-align:center;vertical-align:top;height:30px}.pagination li a{color:#444;display:inline-block;font-size:1.2rem;padding:0 10px;line-height:30px}.pagination li.active a{color:#fff}.pagination li.active{background-color:#ee6e73}.pagination li.disabled a{cursor:default;color:#999}.pagination li i{font-size:2rem}.pagination li.pages ul li{display:inline-block;float:none}@media only screen and (max-width:992px){.pagination{width:100%}.pagination li.next,.pagination li.prev{width:10%}.pagination li.pages{width:80%;overflow:hidden;white-space:nowrap}}.breadcrumb{font-size:18px;color:hsla(0,0%,100%,.7)}.breadcrumb [class*=mdi-],.breadcrumb [class^=mdi-],.breadcrumb i,.breadcrumb i.material-icons{display:inline-block;float:left;font-size:24px}.breadcrumb:before{content:"\E5CC";color:hsla(0,0%,100%,.7);vertical-align:top;display:inline-block;font-family:Material Icons;font-weight:400;font-style:normal;font-size:25px;margin:0 10px 0 8px;-webkit-font-smoothing:antialiased}.breadcrumb:first-child:before{display:none}.breadcrumb:last-child{color:#fff}.parallax-container{position:relative;overflow:hidden;height:500px}.parallax{top:0;left:0;right:0;z-index:-1}.parallax,.parallax img{position:absolute;bottom:0}.parallax img{display:none;left:50%;min-width:100%;min-height:100%;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-transform:translateX(-50%);transform:translateX(-50%)}.pin-bottom,.pin-top{position:relative}.pinned{position:fixed!important}.fade-in,ul.staggered-list li{opacity:0}.fade-in{-webkit-transform-origin:0 50%;transform-origin:0 50%}@media only screen and (max-width:600px){.hide-on-small-and-down,.hide-on-small-only{display:none!important}}@media only screen and (max-width:992px){.hide-on-med-and-down{display:none!important}}@media only screen and (min-width:601px){.hide-on-med-and-up{display:none!important}}@media only screen and (min-width:600px) and (max-width:992px){.hide-on-med-only{display:none!important}}@media only screen and (min-width:993px){.hide-on-large-only{display:none!important}}@media only screen and (min-width:993px){.show-on-large{display:block!important}}@media only screen and (min-width:600px) and (max-width:992px){.show-on-medium{display:block!important}}@media only screen and (max-width:600px){.show-on-small{display:block!important}}@media only screen and (min-width:601px){.show-on-medium-and-up{display:block!important}}@media only screen and (max-width:992px){.show-on-medium-and-down{display:block!important}}@media only screen and (max-width:600px){.center-on-small-only{text-align:center}}.page-footer{padding-top:20px;background-color:#ee6e73}.page-footer .footer-copyright{overflow:hidden;min-height:50px;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;padding:10px 0;color:hsla(0,0%,100%,.8);background-color:rgba(51,51,51,.08)}table,td,th{border:none}table{width:100%;display:table}table.bordered>tbody>tr,table.bordered>thead>tr{border-bottom:1px solid #d0d0d0}table.striped>tbody>tr:nth-child(odd){background-color:#f2f2f2}table.striped>tbody>tr>td{border-radius:0}table.highlight>tbody>tr{transition:background-color .25s ease}table.highlight>tbody>tr:hover{background-color:#f2f2f2}table.centered tbody tr td,table.centered thead tr th{text-align:center}thead{border-bottom:1px solid #d0d0d0}td,th{padding:15px 5px;display:table-cell;text-align:left;vertical-align:middle;border-radius:2px}@media only screen and (max-width:992px){table.responsive-table{width:100%;border-collapse:collapse;border-spacing:0;display:block;position:relative}table.responsive-table td:empty:before{content:"\A0"}table.responsive-table td,table.responsive-table th{margin:0;vertical-align:top}table.responsive-table th{text-align:left}table.responsive-table thead{display:block;float:left}table.responsive-table thead tr{display:block;padding:0 10px 0 0}table.responsive-table thead tr th:before{content:"\A0"}table.responsive-table tbody{display:block;width:auto;position:relative;overflow-x:auto;white-space:nowrap}table.responsive-table tbody tr{display:inline-block;vertical-align:top}table.responsive-table th{display:block;text-align:right}table.responsive-table td{display:block;min-height:1.25em;text-align:left}table.responsive-table tr{padding:0 10px}table.responsive-table thead{border:0;border-right:1px solid #d0d0d0}table.responsive-table.bordered th{border-bottom:0;border-left:0}table.responsive-table.bordered td{border-left:0;border-right:0;border-bottom:0}table.responsive-table.bordered tr{border:0}table.responsive-table.bordered tbody tr{border-right:1px solid #d0d0d0}}.collection{margin:.5rem 0 1rem;border:1px solid #e0e0e0;border-radius:2px;overflow:hidden;position:relative}.collection .collection-item{background-color:#fff;line-height:1.5rem;padding:10px 20px;margin:0;border-bottom:1px solid #e0e0e0}.collection .collection-item.avatar{min-height:84px;padding-left:72px;position:relative}.collection .collection-item.avatar .circle{position:absolute;width:42px;height:42px;overflow:hidden;left:15px;display:inline-block;vertical-align:middle}.collection .collection-item.avatar i.circle{font-size:18px;line-height:42px;color:#fff;background-color:#999;text-align:center}.collection .collection-item.avatar .title{font-size:16px}.collection .collection-item.avatar p{margin:0}.collection .collection-item.avatar .secondary-content{position:absolute;top:16px;right:16px}.collection .collection-item:last-child{border-bottom:none}.collection .collection-item.active{background-color:#26a69a;color:#eafaf9}.collection .collection-item.active .secondary-content{color:#fff}.collection a.collection-item{display:block;transition:.25s;color:#26a69a}.collection a.collection-item:not(.active):hover{background-color:#ddd}.collection.with-header .collection-header{background-color:#fff;border-bottom:1px solid #e0e0e0;padding:10px 20px}.collection.with-header .collection-item{padding-left:30px}.collection.with-header .collection-item.avatar{padding-left:72px}.secondary-content{float:right;color:#26a69a}.collapsible .collection{margin:0;border:none}.video-container{position:relative;padding-bottom:56.25%;height:0;overflow:hidden}.video-container embed,.video-container iframe,.video-container object{position:absolute;top:0;left:0;width:100%;height:100%}.progress{position:relative;height:4px;display:block;width:100%;background-color:#acece6;border-radius:2px;margin:.5rem 0 1rem;overflow:hidden}.progress .determinate{position:absolute;top:0;left:0;bottom:0;transition:width .3s linear}.progress .determinate,.progress .indeterminate{background-color:#26a69a}.progress .indeterminate:before{-webkit-animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite;animation:indeterminate 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.progress .indeterminate:after,.progress .indeterminate:before{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right}.progress .indeterminate:after{-webkit-animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation:indeterminate-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes indeterminate{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@-webkit-keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.hide{display:none!important}.left-align{text-align:left}.right-align{text-align:right}.center,.center-align{text-align:center}.left{float:left!important}.right{float:right!important}.no-select,input[type=range],input[type=range]+.thumb{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.circle{border-radius:50%}.center-block{display:block;margin-left:auto;margin-right:auto}.truncate{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.no-padding{padding:0!important}span.badge{min-width:3rem;padding:0 6px;margin-left:14px;text-align:center;font-size:1rem;line-height:22px;height:22px;color:#757575;float:right;box-sizing:border-box}span.badge.new{font-weight:300;font-size:.8rem;color:#fff;background-color:#26a69a;border-radius:2px}span.badge.new:after{content:" new"}span.badge[data-badge-caption]:after{content:" " attr(data-badge-caption)}nav ul a span.badge{display:inline-block;float:none;margin-left:4px;line-height:22px;height:22px}.collection-item span.badge{margin-top:calc(.75rem - 11px)}.collapsible span.badge{margin-top:calc(1.5rem - 11px)}.side-nav span.badge{margin-top:13px}.material-icons{text-rendering:optimizeLegibility;-webkit-font-feature-settings:"liga";-moz-font-feature-settings:"liga";font-feature-settings:"liga"}.container{margin:0 auto;max-width:1280px;width:90%}@media only screen and (min-width:601px){.container{width:85%}}@media only screen and (min-width:993px){.container{width:70%}}.container .row{margin-left:-.75rem;margin-right:-.75rem}.section{padding-top:1rem;padding-bottom:1rem}.section.no-pad{padding:0}.section.no-pad-bot{padding-bottom:0}.section.no-pad-top{padding-top:0}.row{margin-left:auto;margin-right:auto;margin-bottom:20px}.row:after{content:"";display:table;clear:both}.row .col{float:left;box-sizing:border-box;padding:0 .75rem;min-height:1px}.row .col[class*=pull-],.row .col[class*=push-]{position:relative}.row .col.s1{width:8.3333333333%}.row .col.s1,.row .col.s2{margin-left:auto;left:auto;right:auto}.row .col.s2{width:16.6666666667%}.row .col.s3{width:25%}.row .col.s3,.row .col.s4{margin-left:auto;left:auto;right:auto}.row .col.s4{width:33.3333333333%}.row .col.s5{width:41.6666666667%}.row .col.s5,.row .col.s6{margin-left:auto;left:auto;right:auto}.row .col.s6{width:50%}.row .col.s7{width:58.3333333333%}.row .col.s7,.row .col.s8{margin-left:auto;left:auto;right:auto}.row .col.s8{width:66.6666666667%}.row .col.s9{width:75%}.row .col.s9,.row .col.s10{margin-left:auto;left:auto;right:auto}.row .col.s10{width:83.3333333333%}.row .col.s11{width:91.6666666667%}.row .col.s11,.row .col.s12{margin-left:auto;left:auto;right:auto}.row .col.s12{width:100%}.row .col.offset-s1{margin-left:8.3333333333%}.row .col.pull-s1{right:8.3333333333%}.row .col.push-s1{left:8.3333333333%}.row .col.offset-s2{margin-left:16.6666666667%}.row .col.pull-s2{right:16.6666666667%}.row .col.push-s2{left:16.6666666667%}.row .col.offset-s3{margin-left:25%}.row .col.pull-s3{right:25%}.row .col.push-s3{left:25%}.row .col.offset-s4{margin-left:33.3333333333%}.row .col.pull-s4{right:33.3333333333%}.row .col.push-s4{left:33.3333333333%}.row .col.offset-s5{margin-left:41.6666666667%}.row .col.pull-s5{right:41.6666666667%}.row .col.push-s5{left:41.6666666667%}.row .col.offset-s6{margin-left:50%}.row .col.pull-s6{right:50%}.row .col.push-s6{left:50%}.row .col.offset-s7{margin-left:58.3333333333%}.row .col.pull-s7{right:58.3333333333%}.row .col.push-s7{left:58.3333333333%}.row .col.offset-s8{margin-left:66.6666666667%}.row .col.pull-s8{right:66.6666666667%}.row .col.push-s8{left:66.6666666667%}.row .col.offset-s9{margin-left:75%}.row .col.pull-s9{right:75%}.row .col.push-s9{left:75%}.row .col.offset-s10{margin-left:83.3333333333%}.row .col.pull-s10{right:83.3333333333%}.row .col.push-s10{left:83.3333333333%}.row .col.offset-s11{margin-left:91.6666666667%}.row .col.pull-s11{right:91.6666666667%}.row .col.push-s11{left:91.6666666667%}.row .col.offset-s12{margin-left:100%}.row .col.pull-s12{right:100%}.row .col.push-s12{left:100%}@media only screen and (min-width:601px){.row .col.m1{width:8.3333333333%}.row .col.m1,.row .col.m2{margin-left:auto;left:auto;right:auto}.row .col.m2{width:16.6666666667%}.row .col.m3{width:25%}.row .col.m3,.row .col.m4{margin-left:auto;left:auto;right:auto}.row .col.m4{width:33.3333333333%}.row .col.m5{width:41.6666666667%}.row .col.m5,.row .col.m6{margin-left:auto;left:auto;right:auto}.row .col.m6{width:50%}.row .col.m7{width:58.3333333333%}.row .col.m7,.row .col.m8{margin-left:auto;left:auto;right:auto}.row .col.m8{width:66.6666666667%}.row .col.m9{width:75%}.row .col.m9,.row .col.m10{margin-left:auto;left:auto;right:auto}.row .col.m10{width:83.3333333333%}.row .col.m11{width:91.6666666667%}.row .col.m11,.row .col.m12{margin-left:auto;left:auto;right:auto}.row .col.m12{width:100%}.row .col.offset-m1{margin-left:8.3333333333%}.row .col.pull-m1{right:8.3333333333%}.row .col.push-m1{left:8.3333333333%}.row .col.offset-m2{margin-left:16.6666666667%}.row .col.pull-m2{right:16.6666666667%}.row .col.push-m2{left:16.6666666667%}.row .col.offset-m3{margin-left:25%}.row .col.pull-m3{right:25%}.row .col.push-m3{left:25%}.row .col.offset-m4{margin-left:33.3333333333%}.row .col.pull-m4{right:33.3333333333%}.row .col.push-m4{left:33.3333333333%}.row .col.offset-m5{margin-left:41.6666666667%}.row .col.pull-m5{right:41.6666666667%}.row .col.push-m5{left:41.6666666667%}.row .col.offset-m6{margin-left:50%}.row .col.pull-m6{right:50%}.row .col.push-m6{left:50%}.row .col.offset-m7{margin-left:58.3333333333%}.row .col.pull-m7{right:58.3333333333%}.row .col.push-m7{left:58.3333333333%}.row .col.offset-m8{margin-left:66.6666666667%}.row .col.pull-m8{right:66.6666666667%}.row .col.push-m8{left:66.6666666667%}.row .col.offset-m9{margin-left:75%}.row .col.pull-m9{right:75%}.row .col.push-m9{left:75%}.row .col.offset-m10{margin-left:83.3333333333%}.row .col.pull-m10{right:83.3333333333%}.row .col.push-m10{left:83.3333333333%}.row .col.offset-m11{margin-left:91.6666666667%}.row .col.pull-m11{right:91.6666666667%}.row .col.push-m11{left:91.6666666667%}.row .col.offset-m12{margin-left:100%}.row .col.pull-m12{right:100%}.row .col.push-m12{left:100%}}@media only screen and (min-width:993px){.row .col.l1{width:8.3333333333%}.row .col.l1,.row .col.l2{margin-left:auto;left:auto;right:auto}.row .col.l2{width:16.6666666667%}.row .col.l3{width:25%}.row .col.l3,.row .col.l4{margin-left:auto;left:auto;right:auto}.row .col.l4{width:33.3333333333%}.row .col.l5{width:41.6666666667%}.row .col.l5,.row .col.l6{margin-left:auto;left:auto;right:auto}.row .col.l6{width:50%}.row .col.l7{width:58.3333333333%}.row .col.l7,.row .col.l8{margin-left:auto;left:auto;right:auto}.row .col.l8{width:66.6666666667%}.row .col.l9{width:75%}.row .col.l9,.row .col.l10{margin-left:auto;left:auto;right:auto}.row .col.l10{width:83.3333333333%}.row .col.l11{width:91.6666666667%}.row .col.l11,.row .col.l12{margin-left:auto;left:auto;right:auto}.row .col.l12{width:100%}.row .col.offset-l1{margin-left:8.3333333333%}.row .col.pull-l1{right:8.3333333333%}.row .col.push-l1{left:8.3333333333%}.row .col.offset-l2{margin-left:16.6666666667%}.row .col.pull-l2{right:16.6666666667%}.row .col.push-l2{left:16.6666666667%}.row .col.offset-l3{margin-left:25%}.row .col.pull-l3{right:25%}.row .col.push-l3{left:25%}.row .col.offset-l4{margin-left:33.3333333333%}.row .col.pull-l4{right:33.3333333333%}.row .col.push-l4{left:33.3333333333%}.row .col.offset-l5{margin-left:41.6666666667%}.row .col.pull-l5{right:41.6666666667%}.row .col.push-l5{left:41.6666666667%}.row .col.offset-l6{margin-left:50%}.row .col.pull-l6{right:50%}.row .col.push-l6{left:50%}.row .col.offset-l7{margin-left:58.3333333333%}.row .col.pull-l7{right:58.3333333333%}.row .col.push-l7{left:58.3333333333%}.row .col.offset-l8{margin-left:66.6666666667%}.row .col.pull-l8{right:66.6666666667%}.row .col.push-l8{left:66.6666666667%}.row .col.offset-l9{margin-left:75%}.row .col.pull-l9{right:75%}.row .col.push-l9{left:75%}.row .col.offset-l10{margin-left:83.3333333333%}.row .col.pull-l10{right:83.3333333333%}.row .col.push-l10{left:83.3333333333%}.row .col.offset-l11{margin-left:91.6666666667%}.row .col.pull-l11{right:91.6666666667%}.row .col.push-l11{left:91.6666666667%}.row .col.offset-l12{margin-left:100%}.row .col.pull-l12{right:100%}.row .col.push-l12{left:100%}}@media only screen and (min-width:1201px){.row .col.xl1{width:8.3333333333%}.row .col.xl1,.row .col.xl2{margin-left:auto;left:auto;right:auto}.row .col.xl2{width:16.6666666667%}.row .col.xl3{width:25%}.row .col.xl3,.row .col.xl4{margin-left:auto;left:auto;right:auto}.row .col.xl4{width:33.3333333333%}.row .col.xl5{width:41.6666666667%}.row .col.xl5,.row .col.xl6{margin-left:auto;left:auto;right:auto}.row .col.xl6{width:50%}.row .col.xl7{width:58.3333333333%}.row .col.xl7,.row .col.xl8{margin-left:auto;left:auto;right:auto}.row .col.xl8{width:66.6666666667%}.row .col.xl9{width:75%}.row .col.xl9,.row .col.xl10{margin-left:auto;left:auto;right:auto}.row .col.xl10{width:83.3333333333%}.row .col.xl11{width:91.6666666667%}.row .col.xl11,.row .col.xl12{margin-left:auto;left:auto;right:auto}.row .col.xl12{width:100%}.row .col.offset-xl1{margin-left:8.3333333333%}.row .col.pull-xl1{right:8.3333333333%}.row .col.push-xl1{left:8.3333333333%}.row .col.offset-xl2{margin-left:16.6666666667%}.row .col.pull-xl2{right:16.6666666667%}.row .col.push-xl2{left:16.6666666667%}.row .col.offset-xl3{margin-left:25%}.row .col.pull-xl3{right:25%}.row .col.push-xl3{left:25%}.row .col.offset-xl4{margin-left:33.3333333333%}.row .col.pull-xl4{right:33.3333333333%}.row .col.push-xl4{left:33.3333333333%}.row .col.offset-xl5{margin-left:41.6666666667%}.row .col.pull-xl5{right:41.6666666667%}.row .col.push-xl5{left:41.6666666667%}.row .col.offset-xl6{margin-left:50%}.row .col.pull-xl6{right:50%}.row .col.push-xl6{left:50%}.row .col.offset-xl7{margin-left:58.3333333333%}.row .col.pull-xl7{right:58.3333333333%}.row .col.push-xl7{left:58.3333333333%}.row .col.offset-xl8{margin-left:66.6666666667%}.row .col.pull-xl8{right:66.6666666667%}.row .col.push-xl8{left:66.6666666667%}.row .col.offset-xl9{margin-left:75%}.row .col.pull-xl9{right:75%}.row .col.push-xl9{left:75%}.row .col.offset-xl10{margin-left:83.3333333333%}.row .col.pull-xl10{right:83.3333333333%}.row .col.push-xl10{left:83.3333333333%}.row .col.offset-xl11{margin-left:91.6666666667%}.row .col.pull-xl11{right:91.6666666667%}.row .col.push-xl11{left:91.6666666667%}.row .col.offset-xl12{margin-left:100%}.row .col.pull-xl12{right:100%}.row .col.push-xl12{left:100%}}nav{color:#fff;background-color:#ee6e73;width:100%;height:56px;line-height:56px}nav.nav-extended{height:auto}nav.nav-extended .nav-wrapper{min-height:56px;height:auto}nav.nav-extended .nav-content{position:relative;line-height:normal}nav a{color:#fff}nav [class*=mdi-],nav [class^=mdi-],nav i,nav i.material-icons{display:block;font-size:24px;height:56px;line-height:56px}nav .nav-wrapper{position:relative;height:100%}@media only screen and (min-width:993px){nav a.button-collapse{display:none}}nav .button-collapse{float:left;position:relative;z-index:1;height:56px;margin:0 18px}nav .button-collapse i{height:56px;line-height:56px}nav .brand-logo{position:absolute;color:#fff;display:inline-block;font-size:2.1rem;padding:0;white-space:nowrap}nav .brand-logo.center{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}@media only screen and (max-width:992px){nav .brand-logo{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}nav .brand-logo.left,nav .brand-logo.right{padding:0;-webkit-transform:none;transform:none}nav .brand-logo.left{left:.5rem}nav .brand-logo.right{right:.5rem;left:auto}}nav .brand-logo.right{right:.5rem;padding:0}nav .brand-logo [class*=mdi-],nav .brand-logo [class^=mdi-],nav .brand-logo i,nav .brand-logo i.material-icons{float:left;margin-right:15px}nav .nav-title{display:inline-block;font-size:32px;padding:28px 0}nav ul{margin:0}nav ul li{transition:background-color .3s;float:left;padding:0}nav ul li.active{background-color:rgba(0,0,0,.1)}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}nav ul a.btn,nav ul a.btn-flat,nav ul a.btn-floating,nav ul a.btn-large{margin-top:-2px;margin-left:15px;margin-right:15px}nav ul a.btn-flat>.material-icons,nav ul a.btn-floating>.material-icons,nav ul a.btn-large>.material-icons,nav ul a.btn>.material-icons{height:inherit;line-height:inherit}nav ul a:hover{background-color:rgba(0,0,0,.1)}nav ul.left{float:left}nav form{height:100%}nav .input-field{margin:0;height:100%}nav .input-field input{height:100%;font-size:1.2rem;border:none;padding-left:2rem}nav .input-field input:focus,nav .input-field input[type=date]:valid,nav .input-field input[type=email]:valid,nav .input-field input[type=password]:valid,nav .input-field input[type=text]:valid,nav .input-field input[type=url]:valid{border:none;box-shadow:none}nav .input-field label{top:0;left:0}nav .input-field label i{color:hsla(0,0%,100%,.7);transition:color .3s}nav .input-field label.active i{color:#fff}.navbar-fixed{position:relative;height:56px;z-index:997}.navbar-fixed nav{position:fixed}@media only screen and (min-width:601px){nav.nav-extended .nav-wrapper{min-height:64px}nav,nav .nav-wrapper i,nav a.button-collapse,nav a.button-collapse i{height:64px;line-height:64px}.navbar-fixed{height:64px}}@font-face{font-family:Roboto;src:local(Roboto Thin),url(/bundles/wallabagcore/fonts/Roboto-Thin.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Thin.woff) format("woff");font-weight:100}@font-face{font-family:Roboto;src:local(Roboto Light),url(/bundles/wallabagcore/fonts/Roboto-Light.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Light.woff) format("woff");font-weight:300}@font-face{font-family:Roboto;src:local(Roboto Regular),url(/bundles/wallabagcore/fonts/Roboto-Regular.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Regular.woff) format("woff");font-weight:400}@font-face{font-family:Roboto;src:local(Roboto Medium),url(/bundles/wallabagcore/fonts/Roboto-Medium.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Medium.woff) format("woff");font-weight:500}@font-face{font-family:Roboto;src:local(Roboto Bold),url(/bundles/wallabagcore/fonts/Roboto-Bold.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/Roboto-Bold.woff) format("woff");font-weight:700}a{text-decoration:none}html{line-height:1.5;font-family:Roboto,sans-serif;font-weight:400;color:rgba(0,0,0,.87)}@media only screen and (min-width:0){html{font-size:14px}}@media only screen and (min-width:992px){html{font-size:14.5px}}@media only screen and (min-width:1200px){html{font-size:15px}}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.1}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1{font-size:4.2rem;margin:2.1rem 0 1.68rem}h1,h2{line-height:110%}h2{font-size:3.56rem;margin:1.78rem 0 1.424rem}h3{font-size:2.92rem;margin:1.46rem 0 1.168rem}h3,h4{line-height:110%}h4{font-size:2.28rem;margin:1.14rem 0 .912rem}h5{font-size:1.64rem;margin:.82rem 0 .656rem}h5,h6{line-height:110%}h6{font-size:1rem;margin:.5rem 0 .4rem}em{font-style:italic}strong{font-weight:500}small{font-size:75%}.light,.page-footer .footer-copyright{font-weight:300}.thin{font-weight:200}.flow-text{font-weight:300}@media only screen and (min-width:360px){.flow-text{font-size:1.2rem}}@media only screen and (min-width:390px){.flow-text{font-size:1.224rem}}@media only screen and (min-width:420px){.flow-text{font-size:1.248rem}}@media only screen and (min-width:450px){.flow-text{font-size:1.272rem}}@media only screen and (min-width:480px){.flow-text{font-size:1.296rem}}@media only screen and (min-width:510px){.flow-text{font-size:1.32rem}}@media only screen and (min-width:540px){.flow-text{font-size:1.344rem}}@media only screen and (min-width:570px){.flow-text{font-size:1.368rem}}@media only screen and (min-width:600px){.flow-text{font-size:1.392rem}}@media only screen and (min-width:630px){.flow-text{font-size:1.416rem}}@media only screen and (min-width:660px){.flow-text{font-size:1.44rem}}@media only screen and (min-width:690px){.flow-text{font-size:1.464rem}}@media only screen and (min-width:720px){.flow-text{font-size:1.488rem}}@media only screen and (min-width:750px){.flow-text{font-size:1.512rem}}@media only screen and (min-width:780px){.flow-text{font-size:1.536rem}}@media only screen and (min-width:810px){.flow-text{font-size:1.56rem}}@media only screen and (min-width:840px){.flow-text{font-size:1.584rem}}@media only screen and (min-width:870px){.flow-text{font-size:1.608rem}}@media only screen and (min-width:900px){.flow-text{font-size:1.632rem}}@media only screen and (min-width:930px){.flow-text{font-size:1.656rem}}@media only screen and (min-width:960px){.flow-text{font-size:1.68rem}}@media only screen and (max-width:360px){.flow-text{font-size:1.2rem}}.scale-transition{transition:-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63)!important;transition:transform .3s cubic-bezier(.53,.01,.36,1.63),-webkit-transform .3s cubic-bezier(.53,.01,.36,1.63)!important}.scale-transition.scale-out{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .2s!important;transition:transform .2s!important;transition:transform .2s,-webkit-transform .2s!important}.scale-transition.scale-in{-webkit-transform:scale(1);transform:scale(1)}.card-panel{padding:24px}.card,.card-panel{transition:box-shadow .25s;margin:.5rem 0 1rem;border-radius:2px;background-color:#fff}.card{position:relative}.card .card-title{font-size:24px;font-weight:300}.card .card-title.activator{cursor:pointer}.card.large,.card.medium,.card.small{position:relative}.card.large .card-image,.card.medium .card-image,.card.small .card-image{max-height:60%;overflow:hidden}.card.large .card-image+.card-content,.card.medium .card-image+.card-content,.card.small .card-image+.card-content{max-height:40%}.card.large .card-content,.card.medium .card-content,.card.small .card-content{max-height:100%;overflow:hidden}.card.large .card-action,.card.medium .card-action,.card.small .card-action{position:absolute;bottom:0;left:0;right:0}.card.small{height:300px}.card.medium{height:400px}.card.large{height:500px}.card.horizontal{display:-webkit-flex;display:-ms-flexbox;display:flex}.card.horizontal.large .card-image,.card.horizontal.medium .card-image,.card.horizontal.small .card-image{height:100%;max-height:none;overflow:visible}.card.horizontal.large .card-image img,.card.horizontal.medium .card-image img,.card.horizontal.small .card-image img{height:100%}.card.horizontal .card-image{max-width:50%}.card.horizontal .card-image img{border-radius:2px 0 0 2px;max-width:100%;width:auto}.card.horizontal .card-stacked{display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.card.horizontal .card-stacked .card-content{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.card.sticky-action .card-action{z-index:2}.card.sticky-action .card-reveal{z-index:1;padding-bottom:64px}.card .card-image{position:relative}.card .card-image img{display:block;border-radius:2px 2px 0 0;position:relative;left:0;right:0;top:0;bottom:0;width:100%}.card .card-image .card-title{color:#fff;position:absolute;bottom:0;left:0;max-width:100%;padding:24px}.card .card-content{padding:24px;border-radius:0 0 2px 2px}.card .card-content p{margin:0;color:inherit}.card .card-content .card-title{display:block;line-height:32px;margin-bottom:8px}.card .card-content .card-title i{line-height:32px}.card .card-action{position:relative;background-color:inherit;border-top:1px solid hsla(0,0%,63%,.2);padding:16px 24px}.card .card-action:last-child{border-radius:0 0 2px 2px}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating){color:#ffab40;margin-right:24px;transition:color .3s ease;text-transform:uppercase}.card .card-action a:not(.btn):not(.btn-large):not(.btn-large):not(.btn-floating):hover{color:#ffd8a6}.card .card-reveal{padding:24px;position:absolute;background-color:#fff;width:100%;overflow-y:auto;left:0;top:100%;height:100%;z-index:3;display:none}.card .card-reveal .card-title{cursor:pointer;display:block}#toast-container{display:block;position:fixed;z-index:10000}@media only screen and (max-width:600px){#toast-container{min-width:100%;bottom:0}}@media only screen and (min-width:601px) and (max-width:992px){#toast-container{left:5%;bottom:7%;max-width:90%}}@media only screen and (min-width:993px){#toast-container{top:10%;right:7%;max-width:86%}}.toast{border-radius:2px;top:35px;width:auto;clear:both;margin-top:10px;position:relative;max-width:100%;height:auto;min-height:48px;line-height:1.5em;word-break:break-all;background-color:#323232;padding:10px 25px;font-size:1.1rem;font-weight:300;color:#fff;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.toast .btn,.toast .btn-flat,.toast .btn-large{margin:0;margin-left:3rem}.toast.rounded{border-radius:24px}@media only screen and (max-width:600px){.toast{width:100%;border-radius:0}}@media only screen and (min-width:601px) and (max-width:992px){.toast{float:left}}@media only screen and (min-width:993px){.toast{float:right}}.tabs{position:relative;overflow-x:auto;overflow-y:hidden;height:48px;width:100%;background-color:#fff;margin:0 auto;white-space:nowrap}.tabs.tabs-transparent{background-color:transparent}.tabs.tabs-transparent .tab.disabled a,.tabs.tabs-transparent .tab.disabled a:hover,.tabs.tabs-transparent .tab a{color:hsla(0,0%,100%,.7)}.tabs.tabs-transparent .tab a.active,.tabs.tabs-transparent .tab a:hover{color:#fff}.tabs.tabs-transparent .indicator{background-color:#fff}.tabs.tabs-fixed-width{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs.tabs-fixed-width .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab{display:inline-block;text-align:center;line-height:48px;height:48px;padding:0;margin:0;text-transform:uppercase}.tabs .tab a{color:rgba(238,110,115,.7);display:block;width:100%;height:100%;padding:0 24px;font-size:14px;text-overflow:ellipsis;overflow:hidden;transition:color .28s ease}.tabs .tab a.active,.tabs .tab a:hover{background-color:transparent;color:#ee6e73}.tabs .tab.disabled a,.tabs .tab.disabled a:hover{color:rgba(238,110,115,.7);cursor:default}.tabs .indicator{position:absolute;bottom:0;height:2px;background-color:#f6b2b5;will-change:left,right}@media only screen and (max-width:992px){.tabs{display:-webkit-flex;display:-ms-flexbox;display:flex}.tabs .tab{-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.tabs .tab a{padding:0 12px}}.material-tooltip{padding:10px 8px;font-size:1rem;z-index:2000;background-color:transparent;border-radius:2px;color:#fff;min-height:36px;line-height:120%;text-align:center;max-width:calc(100% - 4px);overflow:hidden;left:0;top:0;pointer-events:none}.backdrop,.material-tooltip{opacity:0;position:absolute;visibility:hidden}.backdrop{height:7px;width:14px;border-radius:0 0 50% 50%;background-color:#323232;z-index:-1;-webkit-transform-origin:50% 0;transform-origin:50% 0}.btn,.btn-flat,.btn-large{border:none;border-radius:2px;display:inline-block;height:36px;line-height:36px;padding:0 2rem;text-transform:uppercase;vertical-align:middle;-webkit-tap-highlight-color:transparent}.btn-flat.disabled,.btn-flat:disabled,.btn-flat[disabled],.btn-floating.disabled,.btn-floating:disabled,.btn-floating[disabled],.btn-large.disabled,.btn-large:disabled,.btn-large[disabled],.btn.disabled,.btn:disabled,.btn[disabled],.disabled.btn-large,[disabled].btn-large{pointer-events:none;background-color:#dfdfdf!important;box-shadow:none;color:#9f9f9f!important;cursor:default}.btn-flat.disabled:hover,.btn-flat:disabled:hover,.btn-flat[disabled]:hover,.btn-floating.disabled:hover,.btn-floating:disabled:hover,.btn-floating[disabled]:hover,.btn-large.disabled:hover,.btn-large:disabled:hover,.btn-large[disabled]:hover,.btn.disabled:hover,.btn:disabled:hover,.btn[disabled]:hover,.disabled.btn-large:hover,[disabled].btn-large:hover{background-color:#dfdfdf!important;color:#9f9f9f!important}.btn,.btn-flat,.btn-floating,.btn-large{font-size:1rem;outline:0}.btn-flat i,.btn-floating i,.btn-large i,.btn i{font-size:1.3rem;line-height:inherit}.btn-floating:focus,.btn-large:focus,.btn:focus{background-color:#1d7d74}.btn,.btn-large{text-decoration:none;color:#fff;background-color:#26a69a;text-align:center;letter-spacing:.5px;transition:.2s ease-out;cursor:pointer}.btn-large:hover,.btn:hover{background-color:#2bbbad}.btn-floating{display:inline-block;color:#fff;position:relative;overflow:hidden;z-index:1;width:40px;height:40px;line-height:40px;padding:0;border-radius:50%;transition:.3s;cursor:pointer;vertical-align:middle}.btn-floating,.btn-floating:hover{background-color:#26a69a}.btn-floating:before{border-radius:0}.btn-floating.btn-large{width:56px;height:56px}.btn-floating.btn-large.halfway-fab{bottom:-28px}.btn-floating.btn-large i{line-height:56px}.btn-floating.halfway-fab{position:absolute;right:24px;bottom:-20px}.btn-floating.halfway-fab.left{right:auto;left:24px}.btn-floating i{width:inherit;display:inline-block;text-align:center;color:#fff;font-size:1.6rem;line-height:40px}button.btn-floating{border:none}.fixed-action-btn{position:fixed;right:23px;bottom:23px;padding-top:15px;margin-bottom:0;z-index:998}.fixed-action-btn.active ul{visibility:visible}.fixed-action-btn.horizontal{padding:0 0 0 15px}.fixed-action-btn.horizontal ul{text-align:right;right:64px;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);height:100%;left:auto;width:500px}.fixed-action-btn.horizontal ul li{display:inline-block;margin:15px 15px 0 0}.fixed-action-btn.toolbar{padding:0;height:56px}.fixed-action-btn.toolbar.active>a i{opacity:0}.fixed-action-btn.toolbar ul{display:-webkit-flex;display:-ms-flexbox;display:flex;top:0;bottom:0}.fixed-action-btn.toolbar ul li{-webkit-flex:1;-ms-flex:1;flex:1;display:inline-block;margin:0;height:100%;transition:none}.fixed-action-btn.toolbar ul li a{display:block;overflow:hidden;position:relative;width:100%;height:100%;background-color:transparent;box-shadow:none;color:#fff;line-height:56px;z-index:1}.fixed-action-btn.toolbar ul li a i{line-height:inherit}.fixed-action-btn ul{left:0;right:0;text-align:center;position:absolute;bottom:64px;margin:0;visibility:hidden}.fixed-action-btn ul li{margin-bottom:15px}.fixed-action-btn ul a.btn-floating{opacity:0}.fixed-action-btn .fab-backdrop{position:absolute;top:0;left:0;z-index:-1;width:40px;height:40px;background-color:#26a69a;border-radius:50%;-webkit-transform:scale(0);transform:scale(0)}.btn-flat{box-shadow:none;color:#343434;cursor:pointer;transition:background-color .2s}.btn-flat,.btn-flat:active,.btn-flat:focus{background-color:transparent}.btn-flat:focus,.btn-flat:hover{background-color:rgba(0,0,0,.1);box-shadow:none}.btn-flat:active{background-color:rgba(0,0,0,.2)}.btn-flat.disabled{background-color:transparent!important;color:#b3b3b3!important;cursor:default}.btn-large{height:54px;line-height:54px}.btn-large i{font-size:1.6rem}.btn-block{display:block}.dropdown-content{background-color:#fff;margin:0;display:none;min-width:100px;max-height:650px;overflow-y:auto;opacity:0;position:absolute;z-index:999;will-change:width,height}.dropdown-content li{clear:both;color:rgba(0,0,0,.87);cursor:pointer;min-height:50px;line-height:1.5rem;width:100%;text-align:left;text-transform:none}.dropdown-content li.active,.dropdown-content li.selected,.dropdown-content li:hover{background-color:#eee}.dropdown-content li.active.selected{background-color:#e1e1e1}.dropdown-content li.divider{min-height:0;height:1px}.dropdown-content li>a,.dropdown-content li>span{font-size:16px;color:#26a69a;display:block;line-height:22px;padding:14px 16px}.dropdown-content li>span>label{top:1px;left:0;height:18px}.dropdown-content li>a>i{height:inherit;line-height:inherit;float:left;margin:0 24px 0 0;width:24px}.input-field.col .dropdown-content [type=checkbox]+label{top:1px;left:0;height:18px}.waves-effect{position:relative;cursor:pointer;display:inline-block;overflow:hidden;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;vertical-align:middle;z-index:1;transition:.3s ease-out}.waves-effect .waves-ripple{position:absolute;border-radius:50%;width:20px;height:20px;margin-top:-10px;margin-left:-10px;opacity:0;background:rgba(0,0,0,.2);transition:all .7s ease-out;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:scale(0);transform:scale(0);pointer-events:none}.waves-effect.waves-light .waves-ripple{background-color:hsla(0,0%,100%,.45)}.waves-effect.waves-red .waves-ripple{background-color:rgba(244,67,54,.7)}.waves-effect.waves-yellow .waves-ripple{background-color:rgba(255,235,59,.7)}.waves-effect.waves-orange .waves-ripple{background-color:rgba(255,152,0,.7)}.waves-effect.waves-purple .waves-ripple{background-color:rgba(156,39,176,.7)}.waves-effect.waves-green .waves-ripple{background-color:rgba(76,175,80,.7)}.waves-effect.waves-teal .waves-ripple{background-color:rgba(0,150,136,.7)}.waves-effect input[type=button],.waves-effect input[type=reset],.waves-effect input[type=submit]{border:0;font-style:normal;font-size:inherit;text-transform:inherit;background:none}.waves-effect img{position:relative;z-index:-1}.waves-notransition{transition:none!important}.waves-circle{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-mask-image:-webkit-radial-gradient(circle,#fff 100%,#000 0)}.waves-input-wrapper{border-radius:.2em;vertical-align:bottom}.waves-input-wrapper .waves-button-input{position:relative;top:0;left:0;z-index:1}.waves-circle{text-align:center;width:2.5em;height:2.5em;line-height:2.5em;border-radius:50%;-webkit-mask-image:none}.waves-block{display:block}.waves-effect .waves-ripple{z-index:-1}.modal{display:none;position:fixed;left:0;right:0;background-color:#fafafa;padding:0;max-height:70%;width:55%;margin:auto;overflow-y:auto;border-radius:2px;will-change:top,opacity}@media only screen and (max-width:992px){.modal{width:80%}}.modal h1,.modal h2,.modal h3,.modal h4{margin-top:0}.modal .modal-content{padding:24px}.modal .modal-close{cursor:pointer}.modal .modal-footer{border-radius:0 0 2px 2px;background-color:#fafafa;padding:4px 6px;height:56px;width:100%}.modal .modal-footer .btn,.modal .modal-footer .btn-flat,.modal .modal-footer .btn-large{float:right;margin:6px 0}.modal-overlay{position:fixed;z-index:999;top:-100px;left:0;bottom:0;right:0;height:125%;width:100%;background:#000;display:none;will-change:opacity}.modal.modal-fixed-footer{padding:0;height:70%}.modal.modal-fixed-footer .modal-content{position:absolute;height:calc(100% - 56px);max-height:100%;width:100%;overflow-y:auto}.modal.modal-fixed-footer .modal-footer{border-top:1px solid rgba(0,0,0,.1);position:absolute;bottom:0}.modal.bottom-sheet{top:auto;bottom:-100%;margin:0;width:100%;max-height:45%;border-radius:0;will-change:bottom,opacity}.collapsible{border-top:1px solid #ddd;border-right:1px solid #ddd;border-left:1px solid #ddd;margin:.5rem 0 1rem}.collapsible-header{display:block;cursor:pointer;min-height:3rem;line-height:3rem;padding:0 1rem;background-color:#fff;border-bottom:1px solid #ddd}.collapsible-header i{width:2rem;font-size:1.6rem;line-height:3rem;display:block;float:left;text-align:center;margin-right:1rem}.collapsible-body{display:none;border-bottom:1px solid #ddd;box-sizing:border-box;padding:2rem}.side-nav .collapsible,.side-nav.fixed .collapsible{border:none;box-shadow:none}.side-nav .collapsible li,.side-nav.fixed .collapsible li{padding:0}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{background-color:transparent;border:none;line-height:inherit;height:inherit;padding:0 16px}.side-nav .collapsible-header:hover,.side-nav.fixed .collapsible-header:hover{background-color:rgba(0,0,0,.05)}.side-nav .collapsible-header i,.side-nav.fixed .collapsible-header i{line-height:inherit}.side-nav .collapsible-body,.side-nav.fixed .collapsible-body{border:0;background-color:#fff}.side-nav .collapsible-body li a,.side-nav.fixed .collapsible-body li a{padding:0 23.5px 0 31px}.collapsible.popout{border:none;box-shadow:none}.collapsible.popout>li{box-shadow:0 2px 5px 0 rgba(0,0,0,.16),0 2px 10px 0 rgba(0,0,0,.12);margin:0 24px;transition:margin .35s cubic-bezier(.25,.46,.45,.94)}.collapsible.popout>li.active{box-shadow:0 5px 11px 0 rgba(0,0,0,.18),0 4px 15px 0 rgba(0,0,0,.15);margin:16px 0}.chip{display:inline-block;height:32px;font-size:13px;font-weight:500;color:rgba(0,0,0,.6);line-height:32px;padding:0 12px;border-radius:16px;background-color:#e4e4e4;margin-bottom:5px;margin-right:5px}.chip>img{float:left;margin:0 8px 0 -12px;height:32px;width:32px;border-radius:50%}.chip .close{cursor:pointer;float:right;font-size:16px;line-height:32px;padding-left:8px}.chips{border:none;border-bottom:1px solid #9e9e9e;box-shadow:none;margin:0 0 20px;min-height:45px;outline:none;transition:all .3s}.chips.focus{border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}.chips:hover{cursor:text}.chips .chip.selected{background-color:#26a69a;color:#fff}.chips .input{background:none;border:0;color:rgba(0,0,0,.6);display:inline-block;font-size:1rem;height:3rem;line-height:32px;outline:0;margin:0;padding:0!important;width:120px!important}.chips .input:focus{border:0!important;box-shadow:none!important}.chips .autocomplete-content{margin-top:0}.prefix~.chips{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.chips:empty~label{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.materialboxed{display:block;cursor:-webkit-zoom-in;cursor:zoom-in;position:relative;transition:opacity .4s;-webkit-backface-visibility:hidden}.materialboxed:hover:not(.active){opacity:.8}.materialboxed.active{cursor:-webkit-zoom-out;cursor:zoom-out}#materialbox-overlay{top:0;right:0;background-color:#292929;will-change:opacity}#materialbox-overlay,.materialbox-caption{position:fixed;bottom:0;left:0;z-index:1000}.materialbox-caption{display:none;color:#fff;line-height:50px;width:100%;text-align:center;padding:0 15%;height:50px;-webkit-font-smoothing:antialiased}select:focus{outline:1px solid #c9f3ef}button:focus{outline:none;background-color:#2ab7a9}label{font-size:.8rem;color:#9e9e9e}::-webkit-input-placeholder{color:#d1d1d1}:-moz-placeholder,::-moz-placeholder{color:#d1d1d1}:-ms-input-placeholder{color:#d1d1d1}input:not([type]),input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],textarea.materialize-textarea{background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;border-radius:0;outline:none;height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;box-shadow:none;box-sizing:content-box;transition:all .3s}input:not([type]):disabled,input:not([type])[readonly=readonly],input[type=date]:disabled,input[type=date][readonly=readonly],input[type=datetime-local]:disabled,input[type=datetime-local][readonly=readonly],input[type=datetime]:disabled,input[type=datetime][readonly=readonly],input[type=email]:disabled,input[type=email][readonly=readonly],input[type=number]:disabled,input[type=number][readonly=readonly],input[type=password]:disabled,input[type=password][readonly=readonly],input[type=search]:disabled,input[type=search][readonly=readonly],input[type=tel]:disabled,input[type=tel][readonly=readonly],input[type=text]:disabled,input[type=text][readonly=readonly],input[type=time]:disabled,input[type=time][readonly=readonly],input[type=url]:disabled,input[type=url][readonly=readonly],textarea.materialize-textarea:disabled,textarea.materialize-textarea[readonly=readonly]{color:rgba(0,0,0,.26);border-bottom:1px dotted rgba(0,0,0,.26)}input:not([type]):disabled+label,input:not([type])[readonly=readonly]+label,input[type=date]:disabled+label,input[type=date][readonly=readonly]+label,input[type=datetime-local]:disabled+label,input[type=datetime-local][readonly=readonly]+label,input[type=datetime]:disabled+label,input[type=datetime][readonly=readonly]+label,input[type=email]:disabled+label,input[type=email][readonly=readonly]+label,input[type=number]:disabled+label,input[type=number][readonly=readonly]+label,input[type=password]:disabled+label,input[type=password][readonly=readonly]+label,input[type=search]:disabled+label,input[type=search][readonly=readonly]+label,input[type=tel]:disabled+label,input[type=tel][readonly=readonly]+label,input[type=text]:disabled+label,input[type=text][readonly=readonly]+label,input[type=time]:disabled+label,input[type=time][readonly=readonly]+label,input[type=url]:disabled+label,input[type=url][readonly=readonly]+label,textarea.materialize-textarea:disabled+label,textarea.materialize-textarea[readonly=readonly]+label{color:rgba(0,0,0,.26)}input:not([type]):focus:not([readonly]),input[type=date]:focus:not([readonly]),input[type=datetime-local]:focus:not([readonly]),input[type=datetime]:focus:not([readonly]),input[type=email]:focus:not([readonly]),input[type=number]:focus:not([readonly]),input[type=password]:focus:not([readonly]),input[type=search]:focus:not([readonly]),input[type=tel]:focus:not([readonly]),input[type=text]:focus:not([readonly]),input[type=time]:focus:not([readonly]),input[type=url]:focus:not([readonly]),textarea.materialize-textarea:focus:not([readonly]){border-bottom:1px solid #26a69a;box-shadow:0 1px 0 0 #26a69a}input:not([type]):focus:not([readonly])+label,input[type=date]:focus:not([readonly])+label,input[type=datetime-local]:focus:not([readonly])+label,input[type=datetime]:focus:not([readonly])+label,input[type=email]:focus:not([readonly])+label,input[type=number]:focus:not([readonly])+label,input[type=password]:focus:not([readonly])+label,input[type=search]:focus:not([readonly])+label,input[type=tel]:focus:not([readonly])+label,input[type=text]:focus:not([readonly])+label,input[type=time]:focus:not([readonly])+label,input[type=url]:focus:not([readonly])+label,textarea.materialize-textarea:focus:not([readonly])+label{color:#26a69a}input:not([type]).valid,input:not([type]):focus.valid,input[type=date].valid,input[type=date]:focus.valid,input[type=datetime-local].valid,input[type=datetime-local]:focus.valid,input[type=datetime].valid,input[type=datetime]:focus.valid,input[type=email].valid,input[type=email]:focus.valid,input[type=number].valid,input[type=number]:focus.valid,input[type=password].valid,input[type=password]:focus.valid,input[type=search].valid,input[type=search]:focus.valid,input[type=tel].valid,input[type=tel]:focus.valid,input[type=text].valid,input[type=text]:focus.valid,input[type=time].valid,input[type=time]:focus.valid,input[type=url].valid,input[type=url]:focus.valid,textarea.materialize-textarea.valid,textarea.materialize-textarea:focus.valid{border-bottom:1px solid #4caf50;box-shadow:0 1px 0 0 #4caf50}input:not([type]).valid+label:after,input:not([type]):focus.valid+label:after,input[type=date].valid+label:after,input[type=date]:focus.valid+label:after,input[type=datetime-local].valid+label:after,input[type=datetime-local]:focus.valid+label:after,input[type=datetime].valid+label:after,input[type=datetime]:focus.valid+label:after,input[type=email].valid+label:after,input[type=email]:focus.valid+label:after,input[type=number].valid+label:after,input[type=number]:focus.valid+label:after,input[type=password].valid+label:after,input[type=password]:focus.valid+label:after,input[type=search].valid+label:after,input[type=search]:focus.valid+label:after,input[type=tel].valid+label:after,input[type=tel]:focus.valid+label:after,input[type=text].valid+label:after,input[type=text]:focus.valid+label:after,input[type=time].valid+label:after,input[type=time]:focus.valid+label:after,input[type=url].valid+label:after,input[type=url]:focus.valid+label:after,textarea.materialize-textarea.valid+label:after,textarea.materialize-textarea:focus.valid+label:after{content:attr(data-success);color:#4caf50;opacity:1}input:not([type]).invalid,input:not([type]):focus.invalid,input[type=date].invalid,input[type=date]:focus.invalid,input[type=datetime-local].invalid,input[type=datetime-local]:focus.invalid,input[type=datetime].invalid,input[type=datetime]:focus.invalid,input[type=email].invalid,input[type=email]:focus.invalid,input[type=number].invalid,input[type=number]:focus.invalid,input[type=password].invalid,input[type=password]:focus.invalid,input[type=search].invalid,input[type=search]:focus.invalid,input[type=tel].invalid,input[type=tel]:focus.invalid,input[type=text].invalid,input[type=text]:focus.invalid,input[type=time].invalid,input[type=time]:focus.invalid,input[type=url].invalid,input[type=url]:focus.invalid,textarea.materialize-textarea.invalid,textarea.materialize-textarea:focus.invalid{border-bottom:1px solid #f44336;box-shadow:0 1px 0 0 #f44336}input:not([type]).invalid+label:after,input:not([type]):focus.invalid+label:after,input[type=date].invalid+label:after,input[type=date]:focus.invalid+label:after,input[type=datetime-local].invalid+label:after,input[type=datetime-local]:focus.invalid+label:after,input[type=datetime].invalid+label:after,input[type=datetime]:focus.invalid+label:after,input[type=email].invalid+label:after,input[type=email]:focus.invalid+label:after,input[type=number].invalid+label:after,input[type=number]:focus.invalid+label:after,input[type=password].invalid+label:after,input[type=password]:focus.invalid+label:after,input[type=search].invalid+label:after,input[type=search]:focus.invalid+label:after,input[type=tel].invalid+label:after,input[type=tel]:focus.invalid+label:after,input[type=text].invalid+label:after,input[type=text]:focus.invalid+label:after,input[type=time].invalid+label:after,input[type=time]:focus.invalid+label:after,input[type=url].invalid+label:after,input[type=url]:focus.invalid+label:after,textarea.materialize-textarea.invalid+label:after,textarea.materialize-textarea:focus.invalid+label:after{content:attr(data-error);color:#f44336;opacity:1}input:not([type]).validate+label,input[type=date].validate+label,input[type=datetime-local].validate+label,input[type=datetime].validate+label,input[type=email].validate+label,input[type=number].validate+label,input[type=password].validate+label,input[type=search].validate+label,input[type=tel].validate+label,input[type=text].validate+label,input[type=time].validate+label,input[type=url].validate+label,textarea.materialize-textarea.validate+label{width:100%;pointer-events:none}input:not([type])+label:after,input[type=date]+label:after,input[type=datetime-local]+label:after,input[type=datetime]+label:after,input[type=email]+label:after,input[type=number]+label:after,input[type=password]+label:after,input[type=search]+label:after,input[type=tel]+label:after,input[type=text]+label:after,input[type=time]+label:after,input[type=url]+label:after,textarea.materialize-textarea+label:after{display:block;content:"";position:absolute;top:60px;opacity:0;transition:opacity .2s ease-out,color .2s ease-out}.input-field{position:relative;margin-top:1rem}.input-field.inline{display:inline-block;vertical-align:middle;margin-left:5px}.input-field.inline .select-dropdown,.input-field.inline input{margin-bottom:1rem}.input-field.col label{left:.75rem}.input-field.col .prefix~.validate~label,.input-field.col .prefix~label{width:calc(100% - 3rem - 1.5rem)}.input-field label{color:#9e9e9e;position:absolute;top:.8rem;left:0;font-size:1rem;cursor:text;transition:.2s ease-out;text-align:initial}.input-field label:not(.label-icon).active{font-size:.8rem;-webkit-transform:translateY(-140%);transform:translateY(-140%)}.input-field .prefix{position:absolute;width:3rem;font-size:2rem;transition:color .2s}.input-field .prefix.active{color:#26a69a}.input-field .prefix~.autocomplete-content,.input-field .prefix~.validate~label,.input-field .prefix~input,.input-field .prefix~label,.input-field .prefix~textarea{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.input-field .prefix~label{margin-left:3rem}@media only screen and (max-width:992px){.input-field .prefix~input{width:86%;width:calc(100% - 3rem)}}@media only screen and (max-width:600px){.input-field .prefix~input{width:80%;width:calc(100% - 3rem)}}.input-field input[type=search]{display:block;line-height:inherit;padding-left:4rem;width:calc(100% - 4rem)}.input-field input[type=search]:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field input[type=search]:focus+label i,.input-field input[type=search]:focus~.material-icons,.input-field input[type=search]:focus~.mdi-navigation-close{color:#444}.input-field input[type=search]+label{left:1rem}.input-field input[type=search]~.material-icons,.input-field input[type=search]~.mdi-navigation-close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}textarea{width:100%;height:3rem;background-color:transparent}textarea.materialize-textarea{overflow-y:hidden;padding:.8rem 0 1.6rem;resize:none;min-height:3rem}.hiddendiv{display:none;white-space:pre-wrap;word-wrap:break-word;overflow-wrap:break-word;padding-top:1.2rem;position:absolute;top:0}.autocomplete-content{margin-top:-20px;display:block;opacity:1;position:static}.autocomplete-content li .highlight{color:#444}.autocomplete-content li img{height:40px;width:40px;margin:5px 15px}[type=radio]:checked,[type=radio]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=radio]:checked+label,[type=radio]:not(:checked)+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;transition:.28s ease;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}[type=radio]+label:after,[type=radio]+label:before{content:"";position:absolute;left:0;top:0;margin:4px;width:16px;height:16px;z-index:0;transition:.28s ease}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after,[type=radio]:checked+label:before,[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border-radius:50%}[type=radio]:not(:checked)+label:after,[type=radio]:not(:checked)+label:before{border:2px solid #5a5a5a}[type=radio]:not(:checked)+label:after{-webkit-transform:scale(0);transform:scale(0)}[type=radio]:checked+label:before{border:2px solid transparent}[type=radio].with-gap:checked+label:after,[type=radio].with-gap:checked+label:before,[type=radio]:checked+label:after{border:2px solid #26a69a}[type=radio].with-gap:checked+label:after,[type=radio]:checked+label:after{background-color:#26a69a}[type=radio]:checked+label:after{-webkit-transform:scale(1.02);transform:scale(1.02)}[type=radio].with-gap:checked+label:after{-webkit-transform:scale(.5);transform:scale(.5)}[type=radio].tabbed:focus+label:before{box-shadow:0 0 0 10px rgba(0,0,0,.1)}[type=radio].with-gap:disabled:checked+label:before{border:2px solid rgba(0,0,0,.26)}[type=radio].with-gap:disabled:checked+label:after{border:none;background-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:before,[type=radio]:disabled:not(:checked)+label:before{background-color:transparent;border-color:rgba(0,0,0,.26)}[type=radio]:disabled+label{color:rgba(0,0,0,.26)}[type=radio]:disabled:not(:checked)+label:before{border-color:rgba(0,0,0,.26)}[type=radio]:disabled:checked+label:after{background-color:rgba(0,0,0,.26);border-color:#bdbdbd}form p{margin-bottom:10px;text-align:left}form p:last-child{margin-bottom:0}[type=checkbox]:checked,[type=checkbox]:not(:checked){position:absolute;left:-9999px;opacity:0}[type=checkbox]+label{position:relative;padding-left:35px;cursor:pointer;display:inline-block;height:25px;line-height:25px;font-size:1rem;-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}[type=checkbox]+label:before,[type=checkbox]:not(.filled-in)+label:after{content:"";position:absolute;top:0;left:0;width:18px;height:18px;z-index:0;border:2px solid #5a5a5a;border-radius:1px;margin-top:2px;transition:.2s}[type=checkbox]:not(.filled-in)+label:after{border:0;-webkit-transform:scale(0);transform:scale(0)}[type=checkbox]:not(:checked):disabled+label:before{border:none;background-color:rgba(0,0,0,.26)}[type=checkbox].tabbed:focus+label:after{-webkit-transform:scale(1);transform:scale(1);border:0;border-radius:50%;box-shadow:0 0 0 10px rgba(0,0,0,.1);background-color:rgba(0,0,0,.1)}[type=checkbox]:checked+label:before{top:-4px;left:-5px;width:12px;height:22px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #26a69a;border-bottom:2px solid #26a69a;-webkit-transform:rotate(40deg);transform:rotate(40deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:checked:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);border-bottom:2px solid rgba(0,0,0,.26)}[type=checkbox]:indeterminate+label:before{top:-11px;left:-12px;width:10px;height:22px;border-top:none;border-left:none;border-right:2px solid #26a69a;border-bottom:none;-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox]:indeterminate:disabled+label:before{border-right:2px solid rgba(0,0,0,.26);background-color:transparent}[type=checkbox].filled-in+label:after{border-radius:2px}[type=checkbox].filled-in+label:after,[type=checkbox].filled-in+label:before{content:"";left:0;position:absolute;transition:border .25s,background-color .25s,width .2s .1s,height .2s .1s,top .2s .1s,left .2s .1s;z-index:1}[type=checkbox].filled-in:not(:checked)+label:before{width:0;height:0;border:3px solid transparent;left:6px;top:10px;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:20% 40%;transform-origin:100% 100%}[type=checkbox].filled-in:not(:checked)+label:after{height:20px;width:20px;background-color:transparent;border:2px solid #5a5a5a;top:0;z-index:0}[type=checkbox].filled-in:checked+label:before{top:0;left:1px;width:8px;height:13px;border-top:2px solid transparent;border-left:2px solid transparent;border-right:2px solid #fff;border-bottom:2px solid #fff;-webkit-transform:rotate(37deg);transform:rotate(37deg);-webkit-transform-origin:100% 100%;transform-origin:100% 100%}[type=checkbox].filled-in:checked+label:after{top:0;width:20px;height:20px;border:2px solid #26a69a;background-color:#26a69a;z-index:0}[type=checkbox].filled-in.tabbed:focus+label:after{border-radius:2px;border-color:#5a5a5a;background-color:rgba(0,0,0,.1)}[type=checkbox].filled-in.tabbed:checked:focus+label:after{border-radius:2px;background-color:#26a69a;border-color:#26a69a}[type=checkbox].filled-in:disabled:not(:checked)+label:before{background-color:transparent;border:2px solid transparent}[type=checkbox].filled-in:disabled:not(:checked)+label:after{border-color:transparent;background-color:#bdbdbd}[type=checkbox].filled-in:disabled:checked+label:before{background-color:transparent}[type=checkbox].filled-in:disabled:checked+label:after{background-color:#bdbdbd;border-color:#bdbdbd}.switch,.switch *{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.switch label{cursor:pointer}.switch label input[type=checkbox]{opacity:0;width:0;height:0}.switch label input[type=checkbox]:checked+.lever{background-color:#84c7c1}.switch label input[type=checkbox]:checked+.lever:after{background-color:#26a69a;left:24px}.switch label .lever{content:"";display:inline-block;position:relative;width:40px;height:15px;background-color:#818181;border-radius:15px;margin-right:10px;transition:background .3s ease;vertical-align:middle;margin:0 16px}.switch label .lever:after{content:"";position:absolute;display:inline-block;width:21px;height:21px;background-color:#f1f1f1;border-radius:21px;box-shadow:0 1px 3px 1px rgba(0,0,0,.4);left:-5px;top:-3px;transition:left .3s ease,background .3s ease,box-shadow .1s ease}input[type=checkbox]:checked:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:checked:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(38,166,154,.1)}input[type=checkbox]:not(:disabled).tabbed:focus~.lever:after,input[type=checkbox]:not(:disabled)~.lever:active:after{box-shadow:0 1px 3px 1px rgba(0,0,0,.4),0 0 0 15px rgba(0,0,0,.08)}.switch input[type=checkbox][disabled]+.lever{cursor:default}.switch label input[type=checkbox][disabled]+.lever:after,.switch label input[type=checkbox][disabled]:checked+.lever:after{background-color:#bdbdbd}select{display:none}select.browser-default{display:block}select{background-color:hsla(0,0%,100%,.9);width:100%;padding:5px;border:1px solid #f2f2f2;border-radius:2px;height:3rem}.select-label{position:absolute}.select-wrapper{position:relative}.select-wrapper input.select-dropdown{position:relative;cursor:pointer;background-color:transparent;border:none;border-bottom:1px solid #9e9e9e;outline:none;height:3rem;line-height:3rem;width:100%;font-size:1rem;margin:0 0 20px;padding:0;display:block}.select-wrapper span.caret{color:initial;position:absolute;right:0;top:0;bottom:0;height:10px;margin:auto 0;font-size:10px;line-height:10px}.select-wrapper span.caret.disabled{color:rgba(0,0,0,.26)}.select-wrapper+label{position:absolute;top:-14px;font-size:.8rem}select:disabled{color:rgba(0,0,0,.3)}.select-wrapper input.select-dropdown:disabled{color:rgba(0,0,0,.3);cursor:default;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;border-bottom:1px solid rgba(0,0,0,.3)}.select-wrapper i{color:rgba(0,0,0,.3)}.select-dropdown li.disabled,.select-dropdown li.disabled>span,.select-dropdown li.optgroup{color:rgba(0,0,0,.3);background-color:transparent}.prefix~.select-wrapper{margin-left:3rem;width:92%;width:calc(100% - 3rem)}.prefix~label{margin-left:3rem}.select-dropdown li img{height:40px;width:40px;margin:5px 15px;float:right}.select-dropdown li.optgroup{border-top:1px solid #eee}.select-dropdown li.optgroup.selected>span{color:rgba(0,0,0,.7)}.select-dropdown li.optgroup>span{color:rgba(0,0,0,.4)}.select-dropdown li.optgroup~li.optgroup-option{padding-left:1rem}.file-field{position:relative}.file-field .file-path-wrapper{overflow:hidden;padding-left:10px}.file-field input.file-path{width:100%}.file-field .btn,.file-field .btn-large{float:left;height:3rem;line-height:3rem}.file-field span{cursor:pointer}.file-field input[type=file]{position:absolute;top:0;right:0;left:0;bottom:0;width:100%;margin:0;padding:0;font-size:20px;cursor:pointer;opacity:0;filter:alpha(opacity=0)}.range-field{position:relative}input[type=range],input[type=range]+.thumb{cursor:pointer}input[type=range]{position:relative;background-color:transparent;border:none;outline:none;width:100%;margin:15px 0;padding:0}input[type=range]:focus{outline:none}input[type=range]+.thumb{position:absolute;top:10px;left:0;border:none;height:0;width:0;border-radius:50%;background-color:#26a69a;margin-left:7px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}input[type=range]+.thumb .value{display:block;width:30px;text-align:center;color:#26a69a;font-size:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}input[type=range]+.thumb.active{border-radius:50% 50% 50% 0}input[type=range]+.thumb.active .value{color:#fff;margin-left:-1px;margin-top:8px;font-size:10px}input[type=range]{-webkit-appearance:none}input[type=range]::-webkit-slider-runnable-track{height:3px;background:#c2c0c2;border:none}input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;border:none;height:14px;width:14px;border-radius:50%;background-color:#26a69a;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;margin:-5px 0 0;transition:.3s}input[type=range]:focus::-webkit-slider-runnable-track{background:#ccc}input[type=range]{border:1px solid #fff}input[type=range]::-moz-range-track{height:3px;background:#ddd;border:none}input[type=range]::-moz-range-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a;margin-top:-5px}input[type=range]:-moz-focusring{outline:1px solid #fff;outline-offset:-1px}input[type=range]:focus::-moz-range-track{background:#ccc}input[type=range]::-ms-track{height:3px;background:transparent;border-color:transparent;border-width:6px 0;color:transparent}input[type=range]::-ms-fill-lower{background:#777}input[type=range]::-ms-fill-upper{background:#ddd}input[type=range]::-ms-thumb{border:none;height:14px;width:14px;border-radius:50%;background:#26a69a}input[type=range]:focus::-ms-fill-lower{background:#888}input[type=range]:focus::-ms-fill-upper{background:#ccc}.table-of-contents.fixed{position:fixed}.table-of-contents li{padding:2px 0}.table-of-contents a{font-weight:300;color:#757575;padding-left:20px;height:1.5rem;line-height:1.5rem;letter-spacing:.4;display:inline-block}.table-of-contents a:hover{color:#a8a8a8;padding-left:19px;border-left:1px solid #ee6e73}.table-of-contents a.active{font-weight:500;padding-left:18px;border-left:2px solid #ee6e73}.side-nav{position:fixed;width:300px;left:0;top:0;margin:0;-webkit-transform:translateX(-100%);transform:translateX(-100%);height:calc(100% + 60px);height:100%;padding-bottom:60px;background-color:#fff;z-index:999;overflow-y:auto;will-change:transform;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.right-aligned{right:0;-webkit-transform:translateX(105%);transform:translateX(105%);left:auto;-webkit-transform:translateX(100%);transform:translateX(100%)}.side-nav .collapsible{margin:0}.side-nav li{float:none;line-height:48px}.side-nav li.active{background-color:rgba(0,0,0,.05)}.side-nav li>a{color:rgba(0,0,0,.87);display:block;font-size:14px;font-weight:500;height:48px;line-height:48px;padding:0 32px}.side-nav li>a:hover{background-color:rgba(0,0,0,.05)}.side-nav li>a.btn,.side-nav li>a.btn-flat,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{margin:10px 15px}.side-nav li>a.btn,.side-nav li>a.btn-floating,.side-nav li>a.btn-large{color:#fff}.side-nav li>a.btn-flat{color:#343434}.side-nav li>a.btn-large:hover,.side-nav li>a.btn:hover{background-color:#2bbbad}.side-nav li>a.btn-floating:hover{background-color:#26a69a}.side-nav li>a>[class^=mdi-],.side-nav li>a>i,.side-nav li>a>i.material-icons,.side-nav li>a li>a>[class*=mdi-]{float:left;height:48px;line-height:48px;margin:0 32px 0 0;width:24px;color:rgba(0,0,0,.54)}.side-nav .divider{margin:8px 0 0}.side-nav .subheader{cursor:auto;pointer-events:none;color:rgba(0,0,0,.54);font-size:14px;font-weight:500;line-height:48px}.side-nav .subheader:hover{background-color:transparent}.side-nav .userView{position:relative;padding:32px 32px 0;margin-bottom:8px}.side-nav .userView>a{height:auto;padding:0}.side-nav .userView>a:hover{background-color:transparent}.side-nav .userView .background{overflow:hidden;position:absolute;top:0;right:0;bottom:0;left:0;z-index:-1}.side-nav .userView .circle,.side-nav .userView .email,.side-nav .userView .name{display:block}.side-nav .userView .circle{height:64px;width:64px}.side-nav .userView .email,.side-nav .userView .name{font-size:14px;line-height:24px}.side-nav .userView .name{margin-top:16px;font-weight:500}.side-nav .userView .email{padding-bottom:16px;font-weight:400}.drag-target{height:100%;width:10px;position:fixed;top:0;z-index:998}.side-nav.fixed{left:0;-webkit-transform:translateX(0);transform:translateX(0);position:fixed}.side-nav.fixed.right-aligned{right:0;left:auto}@media only screen and (max-width:992px){.side-nav.fixed{-webkit-transform:translateX(-105%);transform:translateX(-105%)}.side-nav.fixed.right-aligned{-webkit-transform:translateX(105%);transform:translateX(105%)}.side-nav a{padding:0 16px}.side-nav .userView{padding:16px 16px 0}}.side-nav .collapsible-body>ul:not(.collapsible)>li.active,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active{background-color:#ee6e73}.side-nav .collapsible-body>ul:not(.collapsible)>li.active a,.side-nav.fixed .collapsible-body>ul:not(.collapsible)>li.active a{color:#fff}.side-nav .collapsible-body{padding:0}#sidenav-overlay{position:fixed;top:0;left:0;right:0;height:120vh;background-color:rgba(0,0,0,.5);z-index:997;will-change:opacity}.preloader-wrapper{display:inline-block;position:relative;width:50px;height:50px}.preloader-wrapper.small{width:36px;height:36px}.preloader-wrapper.big{width:64px;height:64px}.preloader-wrapper.active{-webkit-animation:container-rotate 1568ms linear infinite;animation:container-rotate 1568ms linear infinite}@-webkit-keyframes container-rotate{to{-webkit-transform:rotate(1turn)}}@keyframes container-rotate{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.spinner-layer{position:absolute;width:100%;height:100%;opacity:0;border-color:#26a69a}.spinner-blue,.spinner-blue-only{border-color:#4285f4}.spinner-red,.spinner-red-only{border-color:#db4437}.spinner-yellow,.spinner-yellow-only{border-color:#f4b400}.spinner-green,.spinner-green-only{border-color:#0f9d58}.active .spinner-layer.spinner-blue{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,blue-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-red{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,red-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-yellow{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,yellow-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer.spinner-green{-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both,green-fade-in-out 5332ms cubic-bezier(.4,0,.2,1) infinite both}.active .spinner-layer,.active .spinner-layer.spinner-blue-only,.active .spinner-layer.spinner-green-only,.active .spinner-layer.spinner-red-only,.active .spinner-layer.spinner-yellow-only{opacity:1;-webkit-animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both;animation:fill-unfill-rotate 5332ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg)}to{-webkit-transform:rotate(3turn)}}@keyframes fill-unfill-rotate{12.5%{-webkit-transform:rotate(135deg);transform:rotate(135deg)}25%{-webkit-transform:rotate(270deg);transform:rotate(270deg)}37.5%{-webkit-transform:rotate(405deg);transform:rotate(405deg)}50%{-webkit-transform:rotate(540deg);transform:rotate(540deg)}62.5%{-webkit-transform:rotate(675deg);transform:rotate(675deg)}75%{-webkit-transform:rotate(810deg);transform:rotate(810deg)}87.5%{-webkit-transform:rotate(945deg);transform:rotate(945deg)}to{-webkit-transform:rotate(3turn);transform:rotate(3turn)}}@-webkit-keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@keyframes blue-fade-in-out{0%{opacity:1}25%{opacity:1}26%{opacity:0}89%{opacity:0}90%{opacity:1}to{opacity:1}}@-webkit-keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@keyframes red-fade-in-out{0%{opacity:0}15%{opacity:0}25%{opacity:1}50%{opacity:1}51%{opacity:0}}@-webkit-keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@keyframes yellow-fade-in-out{0%{opacity:0}40%{opacity:0}50%{opacity:1}75%{opacity:1}76%{opacity:0}}@-webkit-keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}@keyframes green-fade-in-out{0%{opacity:0}65%{opacity:0}75%{opacity:1}90%{opacity:1}to{opacity:0}}.gap-patch{position:absolute;top:0;left:45%;width:10%;height:100%;overflow:hidden;border-color:inherit}.gap-patch .circle{width:1000%;left:-450%}.circle-clipper{display:inline-block;position:relative;width:50%;height:100%;overflow:hidden;border-color:inherit}.circle-clipper .circle{width:200%;height:100%;border-width:3px;border-style:solid;border-color:inherit;border-bottom-color:transparent!important;border-radius:50%;-webkit-animation:none;animation:none;position:absolute;top:0;right:0;bottom:0}.circle-clipper.left .circle{left:0;border-right-color:transparent!important;-webkit-transform:rotate(129deg);transform:rotate(129deg)}.circle-clipper.right .circle{left:-100%;border-left-color:transparent!important;-webkit-transform:rotate(-129deg);transform:rotate(-129deg)}.active .circle-clipper.left .circle{-webkit-animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:left-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}.active .circle-clipper.right .circle{-webkit-animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both;animation:right-spin 1333ms cubic-bezier(.4,0,.2,1) infinite both}@-webkit-keyframes left-spin{0%{-webkit-transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg)}}@keyframes left-spin{0%{-webkit-transform:rotate(130deg);transform:rotate(130deg)}50%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}to{-webkit-transform:rotate(130deg);transform:rotate(130deg)}}@-webkit-keyframes right-spin{0%{-webkit-transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg)}}@keyframes right-spin{0%{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}50%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}to{-webkit-transform:rotate(-130deg);transform:rotate(-130deg)}}#spinnerContainer.cooldown{-webkit-animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1);animation:container-rotate 1568ms linear infinite,fade-out .4s cubic-bezier(.4,0,.2,1)}@-webkit-keyframes fade-out{0%{opacity:1}to{opacity:0}}@keyframes fade-out{0%{opacity:1}to{opacity:0}}.slider{position:relative;height:400px;width:100%}.slider.fullscreen{height:100%;width:100%;position:absolute;top:0;left:0;right:0;bottom:0}.slider.fullscreen ul.slides{height:100%}.slider.fullscreen ul.indicators{z-index:2;bottom:30px}.slider .slides{background-color:#9e9e9e;margin:0;height:400px}.slider .slides li{opacity:0;position:absolute;top:0;left:0;z-index:1;width:100%;height:inherit;overflow:hidden}.slider .slides li img{height:100%;width:100%;background-size:cover;background-position:50%}.slider .slides li .caption{color:#fff;position:absolute;top:15%;left:15%;width:70%;opacity:0}.slider .slides li .caption p{color:#e0e0e0}.slider .slides li.active{z-index:2}.slider .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.slider .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:16px;width:16px;margin:0 12px;background-color:#e0e0e0;transition:background-color .3s;border-radius:50%}.slider .indicators .indicator-item.active{background-color:#4caf50}.carousel{overflow:hidden;position:relative;width:100%;height:400px;-webkit-perspective:500px;perspective:500px;-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-transform-origin:0 50%;transform-origin:0 50%}.carousel.carousel-slider{top:0;left:0;height:0}.carousel.carousel-slider .carousel-fixed-item{position:absolute;left:0;right:0;bottom:20px;z-index:1}.carousel.carousel-slider .carousel-fixed-item.with-indicators{bottom:68px}.carousel.carousel-slider .carousel-item{width:100%;height:100%;min-height:400px;position:absolute;top:0;left:0}.carousel.carousel-slider .carousel-item h2{font-size:24px;font-weight:500;line-height:32px}.carousel.carousel-slider .carousel-item p{font-size:15px}.carousel .carousel-item{display:none;width:200px;height:200px;position:absolute;top:0;left:0}.carousel .carousel-item>img{width:100%}.carousel .indicators{position:absolute;text-align:center;left:0;right:0;bottom:0;margin:0}.carousel .indicators .indicator-item{display:inline-block;position:relative;cursor:pointer;height:8px;width:8px;margin:24px 4px;background-color:hsla(0,0%,100%,.5);transition:background-color .3s;border-radius:50%}.carousel .indicators .indicator-item.active{background-color:#fff}.carousel .carousel-item:not(.active) .materialboxed,.carousel.scrolling .carousel-item .materialboxed{pointer-events:none}.tap-target-wrapper{width:800px;height:800px;position:fixed;z-index:1000;visibility:hidden;transition:visibility 0s .3s}.tap-target-wrapper.open{visibility:visible;transition:visibility 0s}.tap-target-wrapper.open .tap-target{opacity:.95;transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-wrapper.open .tap-target,.tap-target-wrapper.open .tap-target-wave:before{-webkit-transform:scale(1);transform:scale(1)}.tap-target-wrapper.open .tap-target-wave:after{visibility:visible;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;transition:opacity .3s,visibility 0s 1s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s 1s;transition:opacity .3s,transform .3s,visibility 0s 1s,-webkit-transform .3s}.tap-target{position:absolute;font-size:1rem;border-radius:50%;background-color:#ee6e73;box-shadow:0 20px 20px 0 rgba(0,0,0,.14),0 10px 50px 0 rgba(0,0,0,.12),0 30px 10px -20px rgba(0,0,0,.2);width:100%;height:100%;opacity:0;-webkit-transform:scale(0);transform:scale(0);transition:opacity .3s ease-in-out,-webkit-transform .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out;transition:transform .3s ease-in-out,opacity .3s ease-in-out,-webkit-transform .3s ease-in-out}.tap-target-content{position:relative;display:table-cell}.tap-target-wave{position:absolute;border-radius:50%;z-index:10001}.tap-target-wave:after,.tap-target-wave:before{content:"";display:block;position:absolute;width:100%;height:100%;border-radius:50%;background-color:#fff}.tap-target-wave:before{-webkit-transform:scale(0);transform:scale(0);transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.tap-target-wave:after{visibility:hidden;transition:opacity .3s,visibility 0s,-webkit-transform .3s;transition:opacity .3s,transform .3s,visibility 0s;transition:opacity .3s,transform .3s,visibility 0s,-webkit-transform .3s;z-index:-1}.tap-target-origin{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);z-index:10002;position:absolute!important}.tap-target-origin:not(.btn):not(.btn-large),.tap-target-origin:not(.btn):not(.btn-large):hover{background:none}@media only screen and (max-width:600px){.tap-target,.tap-target-wrapper{width:600px;height:600px}}.pulse{overflow:initial;position:relative}.pulse:before{content:"";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:inherit;border-radius:inherit;transition:opacity .3s,-webkit-transform .3s;transition:opacity .3s,transform .3s;transition:opacity .3s,transform .3s,-webkit-transform .3s;-webkit-animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;animation:pulse-animation 1s cubic-bezier(.24,0,.38,1) infinite;z-index:-1}@-webkit-keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}@keyframes pulse-animation{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}50%{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}to{opacity:0;-webkit-transform:scale(1.5);transform:scale(1.5)}}.picker{font-size:16px;text-align:left;line-height:1.2;color:#000;position:absolute;z-index:10000;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.picker__input{cursor:default}.picker__input.picker__input--active{border-color:#0089ec}.picker__holder{width:100%;overflow-y:auto;-webkit-overflow-scrolling:touch}.picker__frame,.picker__holder{bottom:0;left:0;right:0;top:100%}.picker__holder{position:fixed;transition:background .15s ease-out,top 0s .15s;-webkit-backface-visibility:hidden}.picker__frame{position:absolute;min-width:256px;width:300px;max-height:350px;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);-moz-opacity:0;opacity:0;transition:all .15s ease-out}@media (min-height:28.875em){.picker__frame{overflow:visible;top:auto;bottom:-100%;max-height:80%}}@media (min-height:40.125em){.picker__frame{margin-bottom:7.5%}}.picker__wrap{display:table;width:100%;height:100%}@media (min-height:28.875em){.picker__wrap{display:block}}.picker__box{background:#fff;display:table-cell;vertical-align:middle}@media (min-height:28.875em){.picker__box{display:block;border:1px solid #777;border-top-color:#898989;border-bottom-width:0;border-radius:5px 5px 0 0;box-shadow:0 12px 36px 16px rgba(0,0,0,.24)}}.picker--opened .picker__holder{top:0;background:transparent;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#1E000000,endColorstr=#1E000000)";zoom:1;background:rgba(0,0,0,.32);transition:background .15s ease-out}.picker--opened .picker__frame{top:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);-moz-opacity:1;opacity:1}@media (min-height:35.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__input.picker__input--active{border-color:#e3f2fd}.picker__frame{margin:0 auto;max-width:325px}@media (min-height:38.875em){.picker--opened .picker__frame{top:10%;bottom:auto}}.picker__box{padding:0 1em}.picker__header{text-align:center;position:relative;margin-top:.75em}.picker__month,.picker__year{display:inline-block;margin-left:.25em;margin-right:.25em}.picker__select--month,.picker__select--year{height:2em;padding:0;margin-left:.25em;margin-right:.25em}.picker__select--month.browser-default{display:inline;background-color:#fff;width:40%}.picker__select--year.browser-default{display:inline;background-color:#fff;width:26%}.picker__select--month:focus,.picker__select--year:focus{border-color:rgba(0,0,0,.05)}.picker__nav--next,.picker__nav--prev{position:absolute;padding:.5em 1.25em;width:1em;height:1em;box-sizing:content-box;top:-.25em}.picker__nav--prev{left:-1em;padding-right:1.25em}.picker__nav--next{right:-1em;padding-left:1.25em}.picker__nav--disabled,.picker__nav--disabled:before,.picker__nav--disabled:before:hover,.picker__nav--disabled:hover{cursor:default;background:none;border-right-color:#f5f5f5;border-left-color:#f5f5f5}.picker__table{border-collapse:collapse;border-spacing:0;table-layout:fixed;font-size:1rem;width:100%;margin-top:.75em}.picker__table,.picker__table td,.picker__table th{text-align:center}.picker__table td{margin:0;padding:0}.picker__weekday{width:14.285714286%;font-size:.75em;padding-bottom:.25em;color:#999;font-weight:500}@media (min-height:33.875em){.picker__weekday{padding-bottom:.5em}}.picker__day--today{position:relative;color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day--disabled:before{border-top-color:#aaa}.picker__day--infocus:hover{cursor:pointer;color:#000;font-weight:500}.picker__day--outfocus{display:none;padding:.75rem 0;color:#fff}.picker__day--outfocus:hover{cursor:pointer;color:#ddd;font-weight:500}.picker--focused .picker__day--highlighted,.picker__day--highlighted:hover{cursor:pointer}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{-webkit-transform:scale(.75);transform:scale(.75);background:#0089ec}.picker--focused .picker__day--disabled,.picker__day--disabled,.picker__day--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__day--highlighted.picker__day--disabled,.picker__day--highlighted.picker__day--disabled:hover{background:#bbb}.picker__footer{text-align:center;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.picker__button--clear,.picker__button--close,.picker__button--today{border:1px solid #fff;background:#fff;font-size:.8em;padding:.66em 0;font-weight:700;width:33%;display:inline-block;vertical-align:bottom}.picker__button--clear:hover,.picker__button--close:hover,.picker__button--today:hover{cursor:pointer;color:#000;background:#b1dcfb;border-bottom-color:#b1dcfb}.picker__button--clear:focus,.picker__button--close:focus,.picker__button--today:focus{background:#b1dcfb;border-color:rgba(0,0,0,.05);outline:none}.picker__button--clear:before,.picker__button--close:before,.picker__button--today:before{position:relative;display:inline-block;height:0}.picker__button--clear:before,.picker__button--today:before{content:" ";margin-right:.45em}.picker__button--today:before{top:-.05em;width:0;border-top:.66em solid #0059bc;border-left:.66em solid transparent}.picker__button--clear:before{top:-.25em;width:.66em;border-top:3px solid #e20}.picker__button--close:before{content:"\D7";top:-.1em;vertical-align:top;font-size:1.1em;margin-right:.35em;color:#777}.picker__button--today[disabled],.picker__button--today[disabled]:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default}.picker__button--today[disabled]:before{border-top-color:#aaa}.picker__box{border-radius:2px;overflow:hidden}.picker__date-display{text-align:center;background-color:#26a69a;color:#fff;padding-bottom:15px;font-weight:300}.picker__nav--next:hover,.picker__nav--prev:hover{cursor:pointer;color:#000;background:#a1ded8}.picker__weekday-display{background-color:#1f897f;padding:10px;font-weight:200;letter-spacing:.5;font-size:1rem;margin-bottom:15px}.picker__month-display{text-transform:uppercase;font-size:2rem}.picker__day-display{font-size:4.5rem;font-weight:400}.picker__year-display{font-size:1.8rem;color:hsla(0,0%,100%,.4)}.picker__box{padding:0}.picker__calendar-container{padding:0 1rem}.picker__calendar-container thead{border:none}.picker__table{margin-top:0;margin-bottom:.5em}.picker__day--infocus{color:#595959;letter-spacing:-.3;padding:.75rem 0;font-weight:400;border:1px solid transparent}.picker__day.picker__day--today{color:#26a69a}.picker__day.picker__day--today.picker__day--selected{color:#fff}.picker__weekday{font-size:.9rem}.picker--focused .picker__day--selected,.picker__day--selected,.picker__day--selected:hover{border-radius:50%;-webkit-transform:scale(.9);transform:scale(.9);background-color:#26a69a;color:#fff}.picker--focused .picker__day--selected.picker__day--outfocus,.picker__day--selected.picker__day--outfocus,.picker__day--selected:hover.picker__day--outfocus{background-color:#a1ded8}.picker__footer{text-align:right;padding:5px 10px}.picker__close,.picker__today{font-size:1.1rem;padding:0 1rem;color:#26a69a}.picker__nav--next:before,.picker__nav--prev:before{content:" ";border-top:.5em solid transparent;border-bottom:.5em solid transparent;border-right:.75em solid #676767;width:0;height:0;display:block;margin:0 auto}.picker__nav--next:before{border-right:0;border-left:.75em solid #676767}button.picker__clear:focus,button.picker__close:focus,button.picker__today:focus{background-color:#a1ded8}.picker__list{list-style:none;padding:.75em 0 4.2em;margin:0}.picker__list-item{border-bottom:1px solid #ddd;border-top:1px solid #ddd;margin-bottom:-1px;position:relative;background:#fff;padding:.75em 1.25em}@media (min-height:46.75em){.picker__list-item{padding:.5em 1em}}.picker__list-item:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker__list-item--highlighted,.picker__list-item:hover{border-color:#0089ec;z-index:10}.picker--focused .picker__list-item--highlighted,.picker__list-item--highlighted:hover{cursor:pointer;color:#000;background:#b1dcfb}.picker--focused .picker__list-item--selected,.picker__list-item--selected,.picker__list-item--selected:hover{background:#0089ec;color:#fff;z-index:10}.picker--focused .picker__list-item--disabled,.picker__list-item--disabled,.picker__list-item--disabled:hover{background:#f5f5f5;border-color:#f5f5f5;color:#ddd;cursor:default;border-color:#ddd;z-index:auto}.picker--time .picker__button--clear{display:block;width:80%;margin:1em auto 0;padding:1em 1.25em;background:none;border:0;font-weight:500;font-size:.67em;text-align:center;text-transform:uppercase;color:#666}.picker--time .picker__button--clear:focus,.picker--time .picker__button--clear:hover{color:#000;background:#b1dcfb;background:#e20;border-color:#e20;cursor:pointer;color:#fff;outline:none}.picker--time .picker__button--clear:before{top:-.25em;color:#666;font-size:1.25em;font-weight:700}.picker--time .picker__button--clear:focus:before,.picker--time .picker__button--clear:hover:before{color:#fff}.picker--time .picker__frame{min-width:256px;max-width:320px}.picker--time .picker__box{font-size:1em;background:#f2f2f2;padding:0}@media (min-height:40.125em){.picker--time .picker__box{margin-bottom:5em}}.annotator-filter *,.annotator-notice,.annotator-widget *{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-weight:400;text-align:left;margin:0;padding:0;background:none;-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;-moz-box-shadow:none;-webkit-box-shadow:none;-o-box-shadow:none;box-shadow:none;color:#909090}.annotator-adder{background-image:url(/bundles/wallabagcore/img/annotator-icon-sprite.png);background-repeat:no-repeat}.annotator-editor a:after,.annotator-filter .annotator-filter-navigation button:after,.annotator-filter .annotator-filter-property .annotator-filter-clear,.annotator-resize,.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button,.annotator-widget:after{background-image:url(/bundles/wallabagcore/img/annotator-glyph-sprite.png);background-repeat:no-repeat}.annotator-hl{background:#ffff0a;background:rgba(255,255,10,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4DFFFF0A, endColorstr=#4DFFFF0A)"}.annotator-hl-temporary{background:#007cff;background:rgba(0,124,255,.3);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#4D007CFF, endColorstr=#4D007CFF)"}.annotator-wrapper{position:relative}.annotator-adder,.annotator-notice,.annotator-outer{z-index:1020}.annotator-filter{z-index:1010}.annotator-adder,.annotator-notice,.annotator-outer,.annotator-widget{position:absolute;font-size:10px;line-height:1}.annotator-hide{display:none;visibility:hidden}.annotator-adder{margin-top:-48px;margin-left:-24px;width:48px;height:48px;background-position:0 0}.annotator-adder:hover{background-position:top}.annotator-adder:active{background-position:100%}.annotator-adder button{display:block;width:36px;height:41px;margin:0 auto;border:none;background:none;text-indent:-999em;cursor:pointer}.annotator-outer{width:0;height:0}.annotator-widget{margin:0;padding:0;bottom:15px;left:-18px;min-width:265px;background-color:#fbfbfb;background-color:hsla(0,0%,98%,.98);border:1px solid #7a7a7a;border:1px solid hsla(0,0%,48%,.6);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;-webkit-box-shadow:0 5px 15px rgba(0,0,0,.2);-moz-box-shadow:0 5px 15px rgba(0,0,0,.2);-o-box-shadow:0 5px 15px rgba(0,0,0,.2);box-shadow:0 5px 15px rgba(0,0,0,.2)}.annotator-invert-x .annotator-widget{left:auto;right:-18px}.annotator-invert-y .annotator-widget{bottom:auto;top:8px}.annotator-widget strong{font-weight:700}.annotator-widget .annotator-item,.annotator-widget .annotator-listing{padding:0;margin:0;list-style:none}.annotator-widget:after{content:"";display:block;width:18px;height:10px;background-position:0 0;position:absolute;bottom:-10px;left:8px}.annotator-invert-x .annotator-widget:after{left:auto;right:8px}.annotator-invert-y .annotator-widget:after{background-position:0 -15px;bottom:auto;top:-9px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea,.annotator-widget .annotator-item{position:relative;font-size:12px}.annotator-viewer .annotator-item{border-top:2px solid #7a7a7a;border-top:2px solid hsla(0,0%,48%,.2)}.annotator-widget .annotator-item:first-child{border-top:none}.annotator-editor .annotator-item,.annotator-viewer div{border-top:1px solid #858585;border-top:1px solid hsla(0,0%,52%,.11)}.annotator-viewer div{padding:6px}.annotator-viewer .annotator-item ol,.annotator-viewer .annotator-item ul{padding:4px 16px}.annotator-editor .annotator-item:first-child textarea,.annotator-viewer div:first-of-type{padding-top:12px;padding-bottom:12px;color:#3c3c3c;font-size:13px;font-style:italic;line-height:1.3;border-top:none}.annotator-viewer .annotator-controls{position:relative;top:5px;right:5px;padding-left:5px;opacity:0;-webkit-transition:opacity .2s ease-in;-moz-transition:opacity .2s ease-in;-o-transition:opacity .2s ease-in;transition:opacity .2s ease-in;float:right}.annotator-viewer li .annotator-controls.annotator-visible,.annotator-viewer li:hover .annotator-controls{opacity:1}.annotator-viewer .annotator-controls a,.annotator-viewer .annotator-controls button{cursor:pointer;display:inline-block;width:13px;height:13px;margin-left:2px;border:none;opacity:.2;text-indent:-900em;background-color:transparent;outline:none}.annotator-viewer .annotator-controls a:focus,.annotator-viewer .annotator-controls a:hover,.annotator-viewer .annotator-controls button:focus,.annotator-viewer .annotator-controls button:hover{opacity:.9}.annotator-viewer .annotator-controls a:active,.annotator-viewer .annotator-controls button:active{opacity:1}.annotator-viewer .annotator-controls button[disabled]{display:none}.annotator-viewer .annotator-controls .annotator-edit{background-position:0 -60px}.annotator-viewer .annotator-controls .annotator-delete{background-position:0 -75px}.annotator-viewer .annotator-controls .annotator-link{background-position:0 -270px}.annotator-editor .annotator-item{position:relative}.annotator-editor .annotator-item label{top:0;display:inline;cursor:pointer;font-size:12px}.annotator-editor .annotator-item input,.annotator-editor .annotator-item textarea{display:block;min-width:100%;padding:10px 8px;border:none;margin:0;color:#3c3c3c;background:none;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;resize:none}.annotator-editor .annotator-item textarea::-webkit-scrollbar{height:8px;width:8px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-track-piece{margin:13px 0 3px;background-color:#e5e5e5;-webkit-border-radius:4px}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:vertical{height:25px;background-color:#ccc;-webkit-border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1)}.annotator-editor .annotator-item textarea::-webkit-scrollbar-thumb:horizontal{width:25px;background-color:#ccc;-webkit-border-radius:4px}.annotator-editor .annotator-item:first-child textarea{min-height:5.5em;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor .annotator-item input:focus,.annotator-editor .annotator-item textarea:focus{background-color:#f3f3f3;outline:none}.annotator-editor .annotator-item input[type=checkbox],.annotator-editor .annotator-item input[type=radio]{width:auto;min-width:0;padding:0;display:inline;margin:0 4px 0 0;cursor:pointer}.annotator-editor .annotator-checkbox{padding:8px 6px}.annotator-editor .annotator-controls,.annotator-filter,.annotator-filter .annotator-filter-navigation button{text-align:right;padding:3px;border-top:1px solid #d4d4d4;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.6,#dcdcdc),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#dcdcdc 60%,#d2d2d2);-webkit-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-moz-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-o-box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);box-shadow:inset 1px 0 0 hsla(0,0%,100%,.7),inset -1px 0 0 hsla(0,0%,100%,.7),inset 0 1px 0 hsla(0,0%,100%,.7);-webkit-border-radius:0 0 5px 5px;-moz-border-radius:0 0 5px 5px;-o-border-radius:0 0 5px 5px;border-radius:0 0 5px 5px}.annotator-editor.annotator-invert-y .annotator-controls{border-top:none;border-bottom:1px solid #b4b4b4;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;-o-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0}.annotator-editor a,.annotator-filter .annotator-filter-property label{position:relative;display:inline-block;padding:0 6px 0 22px;color:#363636;text-shadow:0 1px 0 hsla(0,0%,100%,.75);text-decoration:none;line-height:24px;font-size:12px;font-weight:700;border:1px solid #a2a2a2;background-color:#d4d4d4;background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),color-stop(.5,#d2d2d2),color-stop(.5,#bebebe),to(#d2d2d2));background-image:-moz-linear-gradient(to bottom,#f5f5f5,#d2d2d2 50%,#bebebe 50%,#d2d2d2);background-image:-webkit-linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);background-image:linear-gradient(180deg,#f5f5f5,#d2d2d2 50%,#bebebe 0,#d2d2d2);-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-webkit-border-radius:5px;-moz-border-radius:5px;-o-border-radius:5px;border-radius:5px}.annotator-editor a:after{position:absolute;top:50%;left:5px;display:block;content:"";width:15px;height:15px;margin-top:-7px;background-position:0 -90px}.annotator-editor a.annotator-focus,.annotator-editor a:focus,.annotator-editor a:hover,.annotator-filter .annotator-filter-active label,.annotator-filter .annotator-filter-navigation button:hover{outline:none;border-color:#435aa0;background-color:#3865f9;background-image:-webkit-gradient(linear,left top,left bottom,from(#7691fb),color-stop(.5,#5075fb),color-stop(.5,#3865f9),to(#3665fa));background-image:-moz-linear-gradient(to bottom,#7691fb,#5075fb 50%,#3865f9 50%,#3665fa);background-image:-webkit-linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);background-image:linear-gradient(180deg,#7691fb,#5075fb 50%,#3865f9 0,#3665fa);color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,.42)}.annotator-editor a:focus:after,.annotator-editor a:hover:after{margin-top:-8px;background-position:0 -105px}.annotator-editor a:active,.annotator-filter .annotator-filter-navigation button:active{border-color:#700c49;background-color:#d12e8e;background-image:-webkit-gradient(linear,left top,left bottom,from(#fc7cca),color-stop(.5,#e85db2),color-stop(.5,#d12e8e),to(#ff009c));background-image:-moz-linear-gradient(to bottom,#fc7cca,#e85db2 50%,#d12e8e 50%,#ff009c);background-image:-webkit-linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c);background-image:linear-gradient(180deg,#fc7cca,#e85db2 50%,#d12e8e 0,#ff009c)}.annotator-editor a.annotator-save:after{background-position:0 -120px}.annotator-editor a.annotator-save.annotator-focus:after,.annotator-editor a.annotator-save:focus:after,.annotator-editor a.annotator-save:hover:after{margin-top:-8px;background-position:0 -135px}.annotator-editor .annotator-widget:after{background-position:0 -30px}.annotator-editor.annotator-invert-y .annotator-widget .annotator-controls{background-color:#f2f2f2}.annotator-editor.annotator-invert-y .annotator-widget:after{background-position:0 -45px;height:11px}.annotator-resize{position:absolute;top:0;right:0;width:12px;height:12px;background-position:2px -150px}.annotator-invert-x .annotator-resize{right:auto;left:0;background-position:0 -195px}.annotator-invert-y .annotator-resize{top:auto;bottom:0;background-position:2px -165px}.annotator-invert-y.annotator-invert-x .annotator-resize{background-position:0 -180px}.annotator-notice{color:#fff;position:fixed;top:-54px;left:0;width:100%;font-size:14px;line-height:50px;text-align:center;background:#000;background:rgba(0,0,0,.9);border-bottom:4px solid #d4d4d4;-webkit-transition:top .4s ease-out;-moz-transition:top .4s ease-out;-o-transition:top .4s ease-out;transition:top .4s ease-out}.annotator-notice-success{border-color:#3665f9}.annotator-notice-error{border-color:#ff7e00}.annotator-notice p{margin:0}.annotator-notice a{color:#fff}.annotator-notice-show{top:0}.annotator-tags{margin-bottom:-2px}.annotator-tags .annotator-tag{display:inline-block;padding:0 8px;margin-bottom:2px;line-height:1.6;font-weight:700;background-color:#e6e6e6;-webkit-border-radius:8px;-moz-border-radius:8px;-o-border-radius:8px;border-radius:8px}.annotator-filter{position:fixed;top:0;right:0;left:0;text-align:left;line-height:0;border:none;border-bottom:1px solid #878787;padding-left:10px;padding-right:10px;-webkit-border-radius:0;-moz-border-radius:0;-o-border-radius:0;border-radius:0;-webkit-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-moz-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);-o-box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3);box-shadow:inset 0 -1px 0 hsla(0,0%,100%,.3)}.annotator-filter strong{font-size:12px;font-weight:700;color:#3c3c3c;text-shadow:0 1px 0 hsla(0,0%,100%,.7);position:relative;top:-9px}.annotator-filter .annotator-filter-navigation,.annotator-filter .annotator-filter-property{position:relative;display:inline-block;overflow:hidden;line-height:10px;padding:2px 0;margin-right:8px}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-property label{text-align:left;display:block;float:left;line-height:20px;-webkit-border-radius:10px 0 0 10px;-moz-border-radius:10px 0 0 10px;-o-border-radius:10px 0 0 10px;border-radius:10px 0 0 10px}.annotator-filter .annotator-filter-property label{padding-left:8px}.annotator-filter .annotator-filter-property input{display:block;float:right;-webkit-appearance:none;background-color:#fff;border:1px solid #878787;border-left:none;padding:2px 4px;line-height:16px;min-height:16px;font-size:12px;width:150px;color:#333;background-color:#f8f8f8;-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);-o-box-shadow:inset 0 1px 1px rgba(0,0,0,.2);box-shadow:inset 0 1px 1px rgba(0,0,0,.2)}.annotator-filter .annotator-filter-property input:focus{outline:none;background-color:#fff}.annotator-filter .annotator-filter-clear{position:absolute;right:3px;top:6px;border:none;text-indent:-900em;width:15px;height:15px;background-position:0 -90px;opacity:.4}.annotator-filter .annotator-filter-clear:focus,.annotator-filter .annotator-filter-clear:hover{opacity:.8}.annotator-filter .annotator-filter-clear:active{opacity:1}.annotator-filter .annotator-filter-navigation button{border:1px solid #a2a2a2;padding:0;text-indent:-900px;width:20px;min-height:22px;-webkit-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-moz-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);-o-box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8);box-shadow:inset 0 0 5px hsla(0,0%,100%,.2),inset 0 0 1px hsla(0,0%,100%,.8)}.annotator-filter .annotator-filter-navigation button,.annotator-filter .annotator-filter-navigation button:focus,.annotator-filter .annotator-filter-navigation button:hover{color:transparent}.annotator-filter .annotator-filter-navigation button:after{position:absolute;top:8px;left:8px;content:"";display:block;width:9px;height:9px;background-position:0 -210px}.annotator-filter .annotator-filter-navigation button:hover:after{background-position:0 -225px}.annotator-filter .annotator-filter-navigation .annotator-filter-next{-webkit-border-radius:0 10px 10px 0;-moz-border-radius:0 10px 10px 0;-o-border-radius:0 10px 10px 0;border-radius:0 10px 10px 0;border-left:none}.annotator-filter .annotator-filter-navigation .annotator-filter-next:after{left:auto;right:7px;background-position:0 -240px}.annotator-filter .annotator-filter-navigation .annotator-filter-next:hover:after{background-position:0 -255px}.annotator-hl-active{background:#ffff0a;background:rgba(255,255,10,.8);-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#CCFFFF0A, endColorstr=#CCFFFF0A)"}.annotator-hl-filtered{background-color:transparent}@font-face{font-family:Material Icons;font-style:normal;font-weight:400;src:url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.eot);src:local("Material Icons"),local("MaterialIcons-Regular"),url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.woff) format("woff"),url(/bundles/wallabagcore/fonts/MaterialIcons-Regular.ttf) format("truetype")}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}@font-face{font-family:Lato;font-weight:100;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-hairline.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-hairline.woff) format("woff")}@font-face{font-family:Lato;font-weight:100;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-hairline-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-hairline-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-thin.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-thin.woff) format("woff")}@font-face{font-family:Lato;font-weight:200;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-thin-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-thin-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-light.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-light.woff) format("woff")}@font-face{font-family:Lato;font-weight:300;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-light-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-light-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-normal.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-normal.woff) format("woff")}@font-face{font-family:Lato;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-normal-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-normal-italic.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-medium.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-medium.woff) format("woff")}@font-face{font-family:Lato Medium;font-weight:400;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-medium-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-medium-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-semibold.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-semibold.woff) format("woff")}@font-face{font-family:Lato;font-weight:500;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-semibold-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-semibold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-bold.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-bold.woff) format("woff")}@font-face{font-family:Lato;font-weight:600;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-bold-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-bold-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-heavy.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-heavy.woff) format("woff")}@font-face{font-family:Lato;font-weight:800;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-heavy-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-heavy-italic.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:normal;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-black.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-black.woff) format("woff")}@font-face{font-family:Lato;font-weight:900;font-style:italic;text-rendering:optimizeLegibility;src:url(/bundles/wallabagcore/fonts/lato-black-italic.woff2) format("woff2"),url(/bundles/wallabagcore/fonts/lato-black-italic.woff) format("woff")}.material-icons.md-18{font-size:18px}.material-icons.md-24{font-size:24px}.material-icons.md-36{font-size:36px}.material-icons.md-48{font-size:48px}.material-icons.md-dark{color:rgba(0,0,0,.54)}.material-icons.md-dark.md-inactive{color:rgba(0,0,0,.26)}.material-icons.md-light{color:#fff}.material-icons.md-light.md-inactive{color:hsla(0,0%,100%,.3)}#article{font-size:20px;margin:0 auto;max-width:45em}#article article{color:#424242;font-size:18px;line-height:1.7em}#article article h1,#article article h2,#article article h3,#article article h4,#article article h5,#article article h6{color:#212121}#article article h1 strong,#article article h2 strong,#article article h3 strong,#article article h4 strong,#article article h5 strong,#article article h6 strong{font-weight:500}#article article h6{font-size:1.2rem}#article article h5{font-size:1.6rem}#article article h4{font-size:1.9rem}#article article h3{font-size:2.2rem}#article article h2{font-size:2.5rem}#article article h1{font-size:2.7rem}#article article a{border-bottom:1px dotted #03a9f4;text-decoration:none}#article article a:hover{border-bottom-style:solid}#article article ul{padding-left:30px}#article article ul,#article article ul li{list-style-type:disc}#article article blockquote{font-style:italic}#article article strong{font-weight:700}#article figure,#article img{max-width:100%;height:auto}#article pre{box-sizing:border-box;margin:0 0 1.75em;border:1px solid #e3f2fd;width:100%;padding:10px;font-family:monospace;font-size:.8em;white-space:pre;overflow:auto;background:#f5f5f5;border-radius:3px}#article>header>h1{font-size:2em;margin:2.1rem 0 .68rem}#article aside .tools{display:flex;flex-flow:row wrap}#article aside .tools .stats{font-size:.8em;margin:8px 15px 5px}#article aside .tools .stats li{display:inline-flex;vertical-align:middle;margin:0 5px}#article aside .tools .stats a{color:#000;text-decoration:none}#article aside .tools .tags{float:right;margin:5px 15px 10px}#article aside .chip{background-color:rgba(0,151,167,.85);padding:0 15px 0 10px;margin:auto 2px}#article aside .chip a,#article aside .chip i{color:#fff}#article aside .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.reader-mode{width:70px!important;transition:width .2s ease}.reader-mode .collapsible-body{height:0;overflow:hidden}.reader-mode span{opacity:0;transition:opacity .2s ease}.reader-mode:hover{width:260px!important}.reader-mode:hover .collapsible-body{height:auto}.reader-mode:hover .collapsible-body li a i.material-icons{margin:auto 5px auto -8px}.reader-mode:hover span{opacity:1}.progress{position:fixed;top:0;width:100%;height:3px;margin:0;z-index:9999}main #content{padding:0 .5rem}main ul.row{padding:0 .75rem}.data .card .card-body{height:19em;overflow:hidden}.card .card-content .card-title,.card .card-reveal .card-title{line-height:22.8px;max-height:80px;font-size:19px;font-family:roberto,Helvetica Neue,Helvetica,Arial,sans-serif;color:#313131}.card .card-stacked .card-content .card-title{display:inline-block}.card .card-content .activator,.card .card-reveal .activator{cursor:pointer;font-family:Material Icons}.card .card-content i.right,.card .card-reveal i.right{margin-left:0}.card .card-content .original{line-height:24px;font-size:15px}.card .card-entry-labels{position:absolute;top:10px;z-index:90;max-width:50%}.card .card-entry-labels-hidden{margin:2.5px auto}.card .card-entry-labels-hidden li{display:inline-block;background-color:rgba(0,151,167,.85);margin:0 5px;padding:5px 12px;border-radius:3px;color:#fff;max-height:2em;max-width:calc(100% - 15px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.card .card-content .estimatedTime{margin-bottom:10px}.card .card-action{padding:10px 5px 10px 15px}.card .card-action ul.links{margin:0;font-size:24px;line-height:24px}.card .card-action a{color:#fff;margin:0}.card .card-action a:hover{color:#fff}.card .card-action ul.tools li a.tool{margin-right:5px!important}.card .card-action .reading-time{display:inline-flex;vertical-align:middle}.card .card-action .reading-time span{margin-right:5px}.card .card-image{height:10em}.card .card-fullimage{height:13.5em}.card .card-fullimage .preview,.card .card-image .preview{height:14em;background:no-repeat 50%/cover}.card.sw{max-width:370px;margin-left:auto;margin-right:auto}a.original:not(.waves-effect){text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.card-entry-labels li,.card-tag-labels li{margin:10px 10px 10px auto;padding:5px 12px 5px 16px!important;background-color:rgba(0,151,167,.85);border-radius:0 3px 3px 0;color:#fff;cursor:default;max-height:2em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}#list .chip a,.card-entry-labels-hidden a,.card-entry-labels a,.card-entry-tags a,.card-tag-labels a{text-decoration:none;font-weight:400;color:#fff}.card-stacked{display:flex;flex-flow:row wrap}.card-stacked:hover ul.tools-list{display:inline;text-align:right}.card-stacked .preview{max-width:100px;height:auto;margin-right:10px;flex:1}.card-stacked .preview img{max-width:100%;max-height:100%}.card-stacked div.metadata .chip{background-color:rgba(0,151,167,.85);padding:0 15px 0 10px;margin:auto 2px}.card-stacked div.metadata .chip a,.card-stacked div.metadata .chip i{color:#fff}.card-stacked div.metadata .chip i.material-icons{float:right;font-size:20px;line-height:32px;padding-left:8px}.card-stacked div.card-content{flex:4}.card-stacked ul.tools-list{flex:1;display:none;flex-basis:5em;align-self:flex-end;float:right;max-width:6em}#content .collection .collection-item{min-height:65px;height:auto}.quickstart .card .card-action a,.quickstart .card .card-action a:hover{color:#fff!important}.settings .div_tabs{padding-bottom:15px}.collection{margin:15px 15px 0}.collection .collection-item{padding:7px;height:65px}.results{height:1em}.results .nb-results,.results .pagination{margin:15px 15px 0}.results .nb-results{display:inline-flex}.results a{color:#444}.pagination{float:right}.pagination ul{margin:0!important}.pagination ul .next.disabled,.pagination ul .prev.disabled{display:none}.pagination li{padding:0}.pagination a{padding:0 10px;height:30px;display:block}.pagination .disabled{margin-right:10px;margin-left:10px}.pagination li.active span{padding:0 10px;height:30px;display:block;color:#fff}.page-footer .footer-copyright{min-width:50px;height:auto!important;line-height:1em!important}.page-footer .footer-copyright p{text-overflow:ellipsis;white-space:nowrap;overflow:hidden;display:block}.hidden,.picker__date-display{display:none}footer.page-footer{margin-top:10px;padding-top:0}footer .row{margin-bottom:10px}#filters button{padding:0;width:100%}#filters div.with-checkbox{height:3rem;margin-top:0}body{display:flex;min-height:100vh;flex-direction:column;background:#fafafa}body.login main{padding:0;min-height:100vh}.border-bottom{border-bottom:1px solid #ddd}footer,main,nav{padding-left:240px}#content,.valign-wrapper,main{height:100%}#main{flex:1 0 auto}#main .logo a{height:100pt}#main .logo img{height:100pt;width:100pt}#main .logo:hover{background:transparent}nav{height:auto}nav input{color:#aaa}nav ul a:hover{background-color:initial}.nav-wrapper{display:flex;flex-wrap:wrap;justify-content:space-between;min-height:64px}.nav-wrapper .button-collapse{padding:0 15px}.nav-input{display:none}.nav-panel-buttom{display:flex;flex-grow:1;justify-content:flex-end}.nav-panel-buttom li{max-height:64px}.nav-panel-add .add,.nav-panel-search .search,.nav-panels .close{color:#444!important}.nav-panels{transition:background .2s ease}.nav-panels .action{padding-left:.75rem;font-size:2.1rem;white-space:nowrap}.nav-panels .input-field input{display:block;line-height:inherit;padding-left:4rem!important;width:calc(100% - 8rem);height:4.1rem}.nav-panels .input-field input:focus{background-color:#fff;border:0;box-shadow:none;color:#444}.input-field.nav-panel-add label,.input-field.nav-panel-search label{left:1rem}.input-field.nav-panel-add .close,.input-field.nav-panel-search .close{position:absolute;top:0;right:1rem;color:transparent;cursor:pointer;font-size:2rem;transition:color .3s}.input-field.nav-panel-add,.input-field.nav-panel-add form,.input-field.nav-panel-search,.input-field.nav-panel-search form{display:flex;flex:1}#button_export,#button_filters{display:none}.side-nav{width:240px}.side-nav li{padding:0}.side-nav li.logo>a:hover{background:initial}.side-nav a{margin:0}.side-nav.fixed a{font-size:13px;line-height:44px;height:44px}.side-nav .collapsible-header,.side-nav.fixed .collapsible-header{height:45px;line-height:44px;padding:0 20px}.side-nav>li.logo{line-height:0;text-align:center}.bold>a{font-weight:700}span.numberItems{float:right}div.settings div.file-field div,div.settings div.file-field ul{margin-top:40px}div.settings div.file-field div{margin-top:inherit}.input-field label.active{font-size:1rem}nav .input-field input{margin:0}.tabs{display:flex}.tab{flex:1}@font-face{font-family:icomoon;src:url(/bundles/wallabagcore/fonts/IcoMoon-Free.ttf);font-weight:400;font-style:normal}.material-icons{font-family:Material Icons;font-weight:400;font-style:normal;font-size:24px;width:1em;height:1em;display:inline-block;line-height:1;text-transform:none;letter-spacing:normal;word-wrap:normal;white-space:nowrap;direction:ltr;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;-moz-osx-font-smoothing:grayscale;font-feature-settings:"liga"}.material-icons .md-18{font-size:18px}.material-icons .md-24{font-size:24px}.material-icons .md-36{font-size:36px}.material-icons .md-48{font-size:48px}.material-icons .md-dark{color:rgba(0,0,0,.54)}.material-icons .md-dark .md-inactive{color:rgba(0,0,0,.26)}.material-icons .md-light{color:#fff}.material-icons .md-light .md-inactive{color:hsla(0,0%,100%,.3)}[class*=" icon-"]:before,[class^=icon-]:before{font-family:icomoon;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;background-size:24px;letter-spacing:0;font-feature-settings:"liga"}.icon-eye:before{content:"\E9CE"}.icon-no-eye:before{content:"\E9D1"}.icon-calendar:before{content:"\E953"}.icon-mail:before{content:"\EA86"}.icon-time:before{content:"\E952"}a.icon-image{background-repeat:no-repeat;padding-right:.4em!important;padding-left:0!important;margin-left:25px}a.icon-image:before{content:"";display:block;width:24px;height:24px;float:left;margin:7px 1.5px 0 0}a.icon-image.carrot:before{background:url(/bundles/wallabagcore/img/carrot-icon--black.png) no-repeat 50%/90%}a.icon-image.diaspora:before{background:url(/bundles/wallabagcore/img/diaspora-icon--black.png) no-repeat 50%/80%}a.icon-image.unmark:before{background:url(/bundles/wallabagcore/img/unmark-icon--black.png) no-repeat 50%/80%}a.icon-image.shaarli:before{background:url(/bundles/wallabagcore/img/shaarli.png) no-repeat 50%/80%}a.icon-image.scuttle:before{background:url(/bundles/wallabagcore/img/scuttle.png) no-repeat 50%/80%}.icon-google-plus2:before{content:"\EA89"}.icon-facebook2:before{content:"\EA8D"}.icon-twitter:before{content:"\EA96"}.icon-apple:before{content:"\EABF"}.icon-android:before{content:"\EAC1"}.icon-chrome:before{content:"\EAE5"}.icon-firefox:before{content:"\EAE6"}.icon-link:before{content:"\E9CB"}footer [class*=" icon-"],footer [class^=icon-]{font-size:2em;transition:text-shadow .2s ease;padding-right:10px}footer [class*=" icon-"]:hover,footer [class^=icon-]:hover{text-shadow:0 0 10px rgba(0,0,0,.3)}@media print{body{font-family:Serif;background-color:#fff}@page{margin:1cm}img{max-width:100%!important}#article .mbm a,#article>aside,#article_toolbar,#links,#slide-out,#sort,.entry+.results,.hide-on-large-only,.messages,.progress,.top_link,body>footer,body>header,div.tools,header div{display:none!important}main{padding-left:0!important}#article{margin:inherit!important}article{border:none!important}.vieworiginal a:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.pagination span.current{border-style:dashed}#main{margin:0;padding:0}#article,#main{width:100%}}@media only screen and (max-width:992px){footer,header,main,nav{padding-left:0}.pagination{width:auto}.nav-panels .action{padding-right:.75rem}.nav-panel-buttom{justify-content:space-around}#article{max-width:35em;margin-left:auto;margin-right:auto;font-size:18px}#article>header>h1{font-size:1.33em}.reader-mode{width:240px!important}.reader-mode span{opacity:1}.tabs{display:inline-block;height:auto}.tab{min-width:100%}.indicator{display:none}.pagination li.next,.pagination li.prev{width:auto}.drag-target+.drag-target{height:50%}.drag-target+.drag-target+.drag-target{top:50%}}@media only screen and (min-width:1200px) and (max-width:1650px){.row .col.l3{width:33.33333%;margin-left:0}}@media only screen and (min-width:993px) and (max-width:1200px){.row .col.l1{width:25%;margin-left:0}.row .col.l2{width:33.33333%;margin-left:0}.row .col.l3{width:41.66667%;margin-left:0}.row .col.l4{width:50%;margin-left:0}.row .col.l5{width:58.33333%;margin-left:0}.row .col.l6{width:66.66667%;margin-left:0}.row .col.l7{width:75%;margin-left:0}.row .col.l8{width:83.33333%;margin-left:0}.row .col.l9{width:91.66667%;margin-left:0}.row .col.l10{width:100%;margin-left:0}}@media only screen and (max-width:350px){.nb-results{display:none}.row .col,main ul.row{padding:0}}
 /*# sourceMappingURL=material.css.map*/
\ No newline at end of file