From 34fbce61781f1522806107c18ca44ed9d3b8b7c7 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Wed, 15 Dec 2021 15:06:58 +0000 Subject: [PATCH 01/22] Start adding support for Django 4.0 and python 3.10 It *should* probably all work once django-taggit releases a version that supports Django 4.0 and python 3.10. See https://github.com/jazzband/django-taggit/issues/776 For #223 --- CHANGELOG.md | 9 ++++++- ditto/__init__.py | 2 +- ditto/core/views.py | 6 ++--- ditto/flickr/views.py | 2 +- ditto/lastfm/views.py | 2 +- ditto/pinboard/fetch.py | 2 +- ditto/pinboard/views.py | 2 +- setup.py | 10 +++---- tests/core/test_views.py | 12 ++++----- tests/pinboard/test_fetch.py | 2 +- tests/pinboard/test_models.py | 30 ++++++++++----------- tests/pinboard/test_templatetags.py | 14 +++++----- tests/pinboard/test_views.py | 42 ++++++++++++++--------------- tox.ini | 18 +++++++------ 14 files changed, 81 insertions(+), 72 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d496cef..8ff1c75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,14 @@ Changelog (Django Ditto) Unreleased ---------- -- None. +- **Backwards incompatible:** Drop support for Django 2.2. + +- **Backwards incompatible:** Requires django-taggit >= v2.0.0 + (It changed how `TaggableManager` sets tags: https://github.com/jazzband/django-taggit/blob/master/CHANGELOG.rst#200-2021-11-14 ) + +- Add support for Django 4.0 [WAITING ON django-taggit] + +- Add support for Python 3.10 [WAITING ON django-taggit] 1.4.2 - 2021-10-22 diff --git a/ditto/__init__.py b/ditto/__init__.py index 6056b16..2bec2a8 100644 --- a/ditto/__init__.py +++ b/ditto/__init__.py @@ -1,5 +1,5 @@ __title__ = "Django Ditto" -__version__ = "1.4.2" +__version__ = "2.0.0" __author__ = "Phil Gyford" __author_email__ = "phil@gyford.com" __license__ = "MIT" diff --git a/ditto/core/views.py b/ditto/core/views.py index 9c8a161..80786bf 100644 --- a/ditto/core/views.py +++ b/ditto/core/views.py @@ -7,8 +7,8 @@ from django.urls import reverse from django.http import Http404 from django.shortcuts import redirect -from django.utils.encoding import force_str, force_text -from django.utils.translation import ugettext as _ +from django.utils.encoding import force_str +from django.utils.translation import gettext as _ from django.views.generic import ListView, TemplateView from django.views.generic import DayArchiveView as DjangoDayArchiveView @@ -574,7 +574,7 @@ def get_variety_counts(self): raise Http404( _("No %(verbose_name_plural)s available") % { - "verbose_name_plural": force_text( + "verbose_name_plural": force_str( qs.model._meta.verbose_name_plural ) } diff --git a/ditto/flickr/views.py b/ditto/flickr/views.py index 2211071..83bd5d1 100644 --- a/ditto/flickr/views.py +++ b/ditto/flickr/views.py @@ -1,5 +1,5 @@ from django.http import Http404 -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic import DetailView, ListView from django.views.generic.detail import SingleObjectMixin diff --git a/ditto/lastfm/views.py b/ditto/lastfm/views.py index af1ff68..1499018 100644 --- a/ditto/lastfm/views.py +++ b/ditto/lastfm/views.py @@ -1,7 +1,7 @@ from datetime import timedelta from django.http import Http404 -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic import DetailView, TemplateView from django.views.generic.detail import SingleObjectMixin diff --git a/ditto/pinboard/fetch.py b/ditto/pinboard/fetch.py index 59353f8..5cd1a27 100644 --- a/ditto/pinboard/fetch.py +++ b/ditto/pinboard/fetch.py @@ -225,7 +225,7 @@ def _save_bookmark(self, bookmark, fetch_time, account): }, ) - bookmark_obj.tags.set(*bookmark["tags"]) + bookmark_obj.tags.set(bookmark["tags"]) class AllBookmarksFetcher(BookmarksFetcher): diff --git a/ditto/pinboard/views.py b/ditto/pinboard/views.py index bb1751b..3b9ede6 100644 --- a/ditto/pinboard/views.py +++ b/ditto/pinboard/views.py @@ -1,5 +1,5 @@ from django.http import Http404 -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.views.generic import DetailView, ListView from django.views.generic.detail import SingleObjectMixin diff --git a/setup.py b/setup.py index 8be7a0f..dd8a4bb 100644 --- a/setup.py +++ b/setup.py @@ -80,9 +80,9 @@ def get_author_email(): version=get_version(), packages=["ditto"], install_requires=[ - "django-imagekit>=4.0,<4.1", - "django-sortedm2m>=3.0.0,<3.1", - "django-taggit>=1.2.0,<1.6", + "django-imagekit>=4.0,<4.2", + "django-sortedm2m>=3.0.0,<3.2", + "django-taggit>=2.0.0,<2.1", "flickrapi>=2.4,<2.5", "pillow>=7.0.0,<9.0", "pytz", @@ -91,7 +91,7 @@ def get_author_email(): ], dependency_links=[], tests_require=tests_require, - extras_require={"dev": dev_require + ["Django>=3.1,<3.3"], "test": tests_require}, + extras_require={"dev": dev_require + ["Django>=4.0,<4.3"], "test": tests_require}, include_package_data=True, license=get_license(), description=( @@ -107,9 +107,9 @@ def get_author_email(): "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", - "Framework :: Django :: 2.2", "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", + "Framework :: Django :: 4.0", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", diff --git a/tests/core/test_views.py b/tests/core/test_views.py index 8099165..d9d502b 100644 --- a/tests/core/test_views.py +++ b/tests/core/test_views.py @@ -159,7 +159,7 @@ def test_home_no_twitter(self): # def test_tag_detail_templates(self): # "Uses the correct templates" # bookmark = pinboardfactories.BookmarkFactory.create() - # bookmark.tags.set('fish') + # bookmark.tags.set(['fish']) # response = self.client.get(reverse('ditto:tag_detail', # kwargs={'slug': 'fish'})) # self.assertEquals(response.status_code, 200) @@ -169,11 +169,11 @@ def test_home_no_twitter(self): # def test_tag_detail_context(self): # "Sends correct data to templates" # bookmark_1 = pinboardfactories.BookmarkFactory.create(title='Carp') - # bookmark_1.tags.set('Fish', 'carp') + # bookmark_1.tags.set(['Fish', 'carp']) # bookmark_2 = pinboardfactories.BookmarkFactory.create(title='Cod') - # bookmark_2.tags.set('Fish', 'cod') + # bookmark_2.tags.set(['Fish', 'cod']) # bookmark_3 = pinboardfactories.BookmarkFactory.create(title='Dog') - # bookmark_3.tags.set('mammals', 'dog') + # bookmark_3.tags.set(['mammals', 'dog']) # response = self.client.get(reverse('ditto:tag_detail', # kwargs={'slug': 'fish'})) # self.assertTrue('tag' in response.context) @@ -186,9 +186,9 @@ def test_home_no_twitter(self): # def test_tag_detail_privacy(self): # "Does not display private bookmarks" # bookmark_1 = pinboardfactories.BookmarkFactory.create(is_private=True) - # bookmark_1.tags.set('fish') + # bookmark_1.tags.set(['fish']) # bookmark_2 = pinboardfactories.BookmarkFactory.create(is_private=False) - # bookmark_2.tags.set('fish') + # bookmark_2.tags.set(['fish']) # response = self.client.get(reverse('ditto:tag_detail', # kwargs={'slug': 'fish'})) # self.assertTrue('bookmark_list' in response.context) diff --git a/tests/pinboard/test_fetch.py b/tests/pinboard/test_fetch.py index f4763f2..ce9e27f 100644 --- a/tests/pinboard/test_fetch.py +++ b/tests/pinboard/test_fetch.py @@ -387,7 +387,7 @@ def test_update_bookmarks(self): description="My initial description", url="http://fontello.com/", ) - bookmark.tags.set("initial", "tags") + bookmark.tags.set(["initial", "tags"]) bookmarks_from_json = self.get_bookmarks_from_json() bookmarks_data = bookmarks_from_json["bookmarks"] diff --git a/tests/pinboard/test_models.py b/tests/pinboard/test_models.py index 57bb202..5670f5b 100644 --- a/tests/pinboard/test_models.py +++ b/tests/pinboard/test_models.py @@ -124,7 +124,7 @@ def test_ordering(self): def test_tags(self): "Can save and recall tags" bookmark = BookmarkFactory() - bookmark.tags.set("banana", "cherry", "apple") + bookmark.tags.set(["banana", "cherry", "apple"]) bookmark_reloaded = Bookmark.objects.get(pk=bookmark.pk) self.assertEqual(len(bookmark_reloaded.tags.all()), 3) self.assertIsInstance(bookmark_reloaded.tags.first(), BookmarkTag) @@ -135,7 +135,7 @@ def test_tags(self): def test_tags_private(self): "Doesn't fetch private tags" bookmark = BookmarkFactory() - bookmark.tags.set("ispublic", ".isprivate", "alsopublic") + bookmark.tags.set(["ispublic", ".isprivate", "alsopublic"]) bookmark_reloaded = Bookmark.objects.get(pk=bookmark.pk) self.assertEqual(len(bookmark_reloaded.tags.all()), 2) self.assertEqual(bookmark_reloaded.tags.names().first(), "alsopublic") @@ -145,13 +145,13 @@ def test_tags_private(self): def test_slugs_match_tags_true(self): "Returns true if a list of slugs is the same to bookmark's tags" bookmark = BookmarkFactory() - bookmark.tags.set("banana", "cherry") + bookmark.tags.set(["banana", "cherry"]) self.assertTrue(bookmark.slugs_match_tags(["cherry", "banana"])) def test_slugs_match_tags_false(self): "Returns false if a list of slugs is different to bookmark's tags" bookmark = BookmarkFactory() - bookmark.tags.set("banana", "cherry") + bookmark.tags.set(["banana", "cherry"]) self.assertFalse(bookmark.slugs_match_tags(["banana", "apple"])) def test_default_manager(self): @@ -255,39 +255,39 @@ class PinboardBookmarkTagSlugsTestCase(TestCase): def test_standard(self): bookmark = BookmarkFactory() - bookmark.tags.set("normal") + bookmark.tags.set(["normal"]) self.assertEqual(bookmark.tags.first().slug, "normal") def test_hyphens(self): bookmark = BookmarkFactory() - bookmark.tags.set("one-tag") + bookmark.tags.set(["one-tag"]) self.assertEqual(bookmark.tags.first().slug, "one-tag") def test_underscores(self): bookmark = BookmarkFactory() - bookmark.tags.set("one_tag") + bookmark.tags.set(["one_tag"]) self.assertEqual(bookmark.tags.first().slug, "one_tag") def test_private(self): bookmark = BookmarkFactory() - bookmark.tags.set(".private") + bookmark.tags.set([".private"]) self.assertEqual(bookmark.tags.first().slug, ".private") def test_capitals(self): bookmark = BookmarkFactory() - bookmark.tags.set("CAPITALtags") + bookmark.tags.set(["CAPITALtags"]) self.assertEqual(bookmark.tags.first().slug, "capitaltags") def test_special_characters_1(self): "Characters that don't change" bookmark = BookmarkFactory() - bookmark.tags.set("!$()*:;=@[]-.^_`{|}") + bookmark.tags.set(["!$()*:;=@[]-.^_`{|}"]) self.assertEqual(bookmark.tags.first().slug, "!$()*:;=@[]-.^_`{|}") def test_special_characters_2(self): "Characters that do change" bookmark = BookmarkFactory() - bookmark.tags.set("#-&-'-+-/-?-\"-%-<->-\\") + bookmark.tags.set(["#-&-'-+-/-?-\"-%-<->-\\"]) self.assertEqual( bookmark.tags.first().slug, "%23-%2526-%27-%252B-%252f-%3f-%22-%25-%3C-%3E-%5c", @@ -295,26 +295,26 @@ def test_special_characters_2(self): def test_accents(self): bookmark = BookmarkFactory() - bookmark.tags.set("Àddîñg-áçćèńtš-tô-Éñgłïśh-íš-śīłłÿ!") + bookmark.tags.set(["Àddîñg-áçćèńtš-tô-Éñgłïśh-íš-śīłłÿ!"]) self.assertEqual( bookmark.tags.first().slug, "àddîñg-áçćèńtš-tô-éñgłïśh-íš-śīłłÿ!" ) def test_musical_notes(self): bookmark = BookmarkFactory() - bookmark.tags.set("♬♫♪♩") + bookmark.tags.set(["♬♫♪♩"]) self.assertEqual(bookmark.tags.first().slug, "♬♫♪♩") def test_chinese(self): bookmark = BookmarkFactory() - bookmark.tags.set("美国") + bookmark.tags.set(["美国"]) self.assertEqual(bookmark.tags.first().slug, "美国") @override_settings(TAGGIT_CASE_INSENSITIVE=True) def test_case_insensitive_tags(self): "Creating tags named 'dog' and 'DOG' should not create different slugs." bookmark = BookmarkFactory() - bookmark.tags.set("dog", "cat", "DOG") + bookmark.tags.set(["dog", "cat", "DOG"]) self.assertEqual( sorted([tag.slug for tag in bookmark.tags.all()]), ["cat", "dog"] ) diff --git a/tests/pinboard/test_templatetags.py b/tests/pinboard/test_templatetags.py index 288207c..b7c2cfe 100644 --- a/tests/pinboard/test_templatetags.py +++ b/tests/pinboard/test_templatetags.py @@ -127,9 +127,9 @@ class PopularBookmarkTagsTestCase(TestCase): def test_tags(self): "Contains the correct data" bookmark_1 = BookmarkFactory() - bookmark_1.tags.set("fish", "carp") + bookmark_1.tags.set(["fish", "carp"]) bookmark_2 = BookmarkFactory() - bookmark_2.tags.set("fish", "cod") + bookmark_2.tags.set(["fish", "cod"]) tags = ditto_pinboard.popular_bookmark_tags() self.assertEqual(len(tags), 3) self.assertEqual(tags[0].name, "fish") @@ -142,9 +142,9 @@ def test_tags(self): def test_tags_privacy_bookmarks(self): "Doesn't display tags from private bookmarks" bookmark_1 = BookmarkFactory(is_private=True) - bookmark_1.tags.set("fish", "carp") + bookmark_1.tags.set(["fish", "carp"]) bookmark_2 = BookmarkFactory(is_private=False) - bookmark_2.tags.set("fish", "cod") + bookmark_2.tags.set(["fish", "cod"]) tags = ditto_pinboard.popular_bookmark_tags() self.assertEqual(len(tags), 2) self.assertEqual(tags[0].name, "fish") @@ -155,7 +155,7 @@ def test_tags_privacy_bookmarks(self): def test_tags_privacy_tags(self): "Doesn't display private .tags" bookmark = BookmarkFactory() - bookmark.tags.set("ispublic", ".notpublic", "alsopublic") + bookmark.tags.set(["ispublic", ".notpublic", "alsopublic"]) tags = ditto_pinboard.popular_bookmark_tags() self.assertEqual(len(tags), 2) # Tags are ordered by popularity, so can't be sure @@ -167,13 +167,13 @@ def test_tags_privacy_tags(self): def test_tags_limit_default(self): "It should return 10 tags by default" bookmark = BookmarkFactory() - bookmark.tags.set("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11") + bookmark.tags.set(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"]) tags = ditto_pinboard.popular_bookmark_tags() self.assertEqual(len(tags), 10) def test_tags_limit_custom(self): "It should return `limit` tags" bookmark = BookmarkFactory() - bookmark.tags.set("1", "2", "3", "4", "5") + bookmark.tags.set(["1", "2", "3", "4", "5"]) tags = ditto_pinboard.popular_bookmark_tags(limit=3) self.assertEqual(len(tags), 3) diff --git a/tests/pinboard/test_views.py b/tests/pinboard/test_views.py index 2528204..50a3dd3 100644 --- a/tests/pinboard/test_views.py +++ b/tests/pinboard/test_views.py @@ -215,7 +215,7 @@ def test_bookmark_detail_privacy(self): def test_bookmark_detail_tag_privacy(self): "Does not display private tags" bookmark = BookmarkFactory() - bookmark.tags.set("publictag", ".notpublic", "alsopublic") + bookmark.tags.set(["publictag", ".notpublic", "alsopublic"]) response = self.client.get( reverse( "pinboard:bookmark_detail", @@ -255,9 +255,9 @@ def test_tag_list_templates(self): def test_tag_list_context(self): "Sends the correct data to templates" bookmark_1 = BookmarkFactory() - bookmark_1.tags.set("fish", "carp") + bookmark_1.tags.set(["fish", "carp"]) bookmark_2 = BookmarkFactory() - bookmark_2.tags.set("fish", "cod") + bookmark_2.tags.set(["fish", "cod"]) response = self.client.get(reverse("pinboard:tag_list")) self.assertIn("account_list", response.context) self.assertIn("tag_list", response.context) @@ -266,9 +266,9 @@ def test_tag_list_context(self): def test_tag_list_privacy_bookmarks(self): "Doesn't display tags from private bookmarks" bookmark_1 = BookmarkFactory(is_private=True) - bookmark_1.tags.set("fish", "carp") + bookmark_1.tags.set(["fish", "carp"]) bookmark_2 = BookmarkFactory(is_private=False) - bookmark_2.tags.set("fish", "cod") + bookmark_2.tags.set(["fish", "cod"]) response = self.client.get(reverse("pinboard:tag_list")) self.assertEqual(len(response.context["tag_list"]), 2) self.assertEqual(response.context["tag_list"][0].name, "fish") @@ -277,7 +277,7 @@ def test_tag_list_privacy_bookmarks(self): def test_tag_list_privacy_tags(self): "Doesn't display private .tags" bookmark = BookmarkFactory() - bookmark.tags.set("ispublic", ".notpublic", "alsopublic") + bookmark.tags.set(["ispublic", ".notpublic", "alsopublic"]) response = self.client.get(reverse("pinboard:tag_list")) self.assertEqual(len(response.context["tag_list"]), 2) # Tags on this page are ordered by popularity, so can't be sure @@ -291,7 +291,7 @@ def test_tag_list_privacy_tags(self): def test_tag_detail_templates(self): "Uses the correct templates" bookmark = BookmarkFactory() - bookmark.tags.set("fish") + bookmark.tags.set(["fish"]) response = self.client.get( reverse("pinboard:tag_detail", kwargs={"slug": "fish"}) ) @@ -303,11 +303,11 @@ def test_tag_detail_templates(self): def test_tag_detail_context(self): "Sends the correct data to the templates" bookmark_1 = BookmarkFactory(title="Carp") - bookmark_1.tags.set("Fish", "carp") + bookmark_1.tags.set(["Fish", "carp"]) bookmark_2 = BookmarkFactory(title="Cod") - bookmark_2.tags.set("Fish", "cod") + bookmark_2.tags.set(["Fish", "cod"]) bookmark_3 = BookmarkFactory(title="Dog") - bookmark_3.tags.set("mammals", "dog") + bookmark_3.tags.set(["mammals", "dog"]) response = self.client.get( reverse("pinboard:tag_detail", kwargs={"slug": "fish"}) ) @@ -326,7 +326,7 @@ def test_tag_detail_context(self): def test_tag_detail_privacy(self): "Does not display private bookmarks" bookmark = BookmarkFactory(is_private=True) - bookmark.tags.set("fish") + bookmark.tags.set(["fish"]) response = self.client.get( reverse("pinboard:tag_detail", kwargs={"slug": "fish"}) ) @@ -345,7 +345,7 @@ def test_account_tag_detail_templates(self): "Uses the correct templates" account = AccountFactory() bookmark = BookmarkFactory(account=account, title="Carp") - bookmark.tags.set("fish", "carp") + bookmark.tags.set(["fish", "carp"]) response = self.client.get( reverse( "pinboard:account_tag_detail", @@ -362,13 +362,13 @@ def test_account_tag_detail_context(self): account_1 = AccountFactory() account_2 = AccountFactory() bookmarks_1 = BookmarkFactory.create_batch(3, account=account_1) - bookmarks_1[0].tags.set("Fish", "carp") - bookmarks_1[1].tags.set("Fish", "cod") - bookmarks_1[2].tags.set("mammals", "dog") + bookmarks_1[0].tags.set(["Fish", "carp"]) + bookmarks_1[1].tags.set(["Fish", "cod"]) + bookmarks_1[2].tags.set(["mammals", "dog"]) bookmarks_2 = BookmarkFactory.create_batch(3, account=account_2) - bookmarks_2[0].tags.set("Fish", "carp") - bookmarks_2[1].tags.set("Fish", "cod") - bookmarks_2[2].tags.set("mammals", "dog") + bookmarks_2[0].tags.set(["Fish", "carp"]) + bookmarks_2[1].tags.set(["Fish", "cod"]) + bookmarks_2[2].tags.set(["mammals", "dog"]) response = self.client.get( reverse( "pinboard:account_tag_detail", @@ -389,7 +389,7 @@ def test_account_tag_detail_context(self): def test_account_tag_detail_privacy(self): "Does not display private bookmarks" bookmark = BookmarkFactory(is_private=True) - bookmark.tags.set("fish") + bookmark.tags.set(["fish"]) response = self.client.get( reverse( "pinboard:account_tag_detail", @@ -401,7 +401,7 @@ def test_account_tag_detail_privacy(self): def test_account_tag_detail_fails_1(self): "Returns a 404 if a non-existent account is requested" bookmark = BookmarkFactory() - bookmark.tags.set("fish") + bookmark.tags.set(["fish"]) response = self.client.get( reverse( @@ -415,7 +415,7 @@ def test_account_tag_detail_fails_2(self): "Returns a 404 if a non-existent tag is requested" account = AccountFactory() bookmark = BookmarkFactory(account=account) - bookmark.tags.set("fish") + bookmark.tags.set(["fish"]) response = self.client.get( reverse( diff --git a/tox.ini b/tox.ini index 93c6356..987975a 100644 --- a/tox.ini +++ b/tox.ini @@ -3,10 +3,11 @@ minversion = 1.8 envlist = - py36-django{22,31,32} - py37-django{22,31,32} - py38-django{22,31,32} - py39-django{22,31,32} + py36-django{31,32} + py37-django{31,32} + py38-django{31,32,40} + py39-django{31,32,40} + py310-django{32,40} flake8 [gh-actions] @@ -16,13 +17,14 @@ python = 3.7: py37 3.8: py38 3.9: py39 + 3.10: py310 [gh-actions:env] ; Maps GitHub Actions DJANGO version env var to tox env vars: DJANGO = - 2.2: django22 3.1: django31 - 3.0: django32 + 3.2: django32 + 4.0: django40 ; Dependencies and ENV things we need for all environments: [base] @@ -34,9 +36,9 @@ setenv = [testenv] deps = - django22: Django >= 2.2, < 2.3 django31: Django >= 3.1, < 3.2 - django32: Django >= 3.1, < 3.3 + django32: Django >= 3.2, < 3.3 + django40: Django >= 4.0, < 4.1 extras = {[base]extras} setenv = From a4a71555b550dfbbec7427d651eba6aa971d5af4 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Fri, 11 Feb 2022 14:27:44 +0000 Subject: [PATCH 02/22] Update python dependencies --- setup.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index dd8a4bb..0efb5f0 100644 --- a/setup.py +++ b/setup.py @@ -67,7 +67,7 @@ def get_author_email(): # os.system("python setup.py bdist_wheel upload") sys.exit() -dev_require = ["django-debug-toolbar>=2.0,<4.0", "flake8>=3.8,<4.0", "black==21.7b0"] +dev_require = ["django-debug-toolbar>=2.0,<4.0", "flake8>=3.8,<5.0", "black==22.1.0"] tests_require = dev_require + [ "factory-boy>=2.12.0,<4.0", "freezegun>=0.3.12,<2.0", @@ -82,9 +82,9 @@ def get_author_email(): install_requires=[ "django-imagekit>=4.0,<4.2", "django-sortedm2m>=3.0.0,<3.2", - "django-taggit>=2.0.0,<2.1", + "django-taggit>=2.0.0,<2.2", "flickrapi>=2.4,<2.5", - "pillow>=7.0.0,<9.0", + "pillow>=8.0.0,<10.0", "pytz", "twitter-text-python>=1.1.1,<1.2", "twython>=3.7.0,<3.10", @@ -107,6 +107,7 @@ def get_author_email(): "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", + "Framework :: Django :: 2.2", "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", "Framework :: Django :: 4.0", @@ -118,6 +119,7 @@ def get_author_email(): "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", "Topic :: Internet :: WWW/HTTP", "Topic :: Internet :: WWW/HTTP :: Dynamic Content", ], From 4184b5591cbddc9a2028d2af8829117fd5432b92 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Fri, 11 Feb 2022 14:28:16 +0000 Subject: [PATCH 03/22] Add Django 2.2 back into supported versions for a while --- README.md | 2 +- tox.ini | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9fa014a..d393c54 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Django Ditto [![image](https://coveralls.io/repos/github/philgyford/django-ditto/badge.svg?branch=main)](https://coveralls.io/github/philgyford/django-ditto?branch=main "Test coverage") [![image](https://readthedocs.org/projects/django-ditto/badge/?version=stable)](https://django-ditto.readthedocs.io/en/stable/?badge=stable "Documentation status") -A collection of Django apps for copying things from third-party sites and services. Requires Python 3.6 to 3.9, and Django 2.2 to 3.2. +A collection of Django apps for copying things from third-party sites and services. Requires Python 3.6 to 3.9, and Django 2.2 to 4.0. [Read the documentation.](http://django-ditto.readthedocs.io/en/latest/) diff --git a/tox.ini b/tox.ini index 987975a..d05080f 100644 --- a/tox.ini +++ b/tox.ini @@ -3,10 +3,10 @@ minversion = 1.8 envlist = - py36-django{31,32} - py37-django{31,32} - py38-django{31,32,40} - py39-django{31,32,40} + py36-django{22,31,32} + py37-django{22,31,32} + py38-django{22,31,32,40} + py39-django{22,31,32,40} py310-django{32,40} flake8 @@ -22,6 +22,7 @@ python = [gh-actions:env] ; Maps GitHub Actions DJANGO version env var to tox env vars: DJANGO = + 2.2: django22 3.1: django31 3.2: django32 4.0: django40 @@ -36,6 +37,7 @@ setenv = [testenv] deps = + django22: Django >= 2.2, < 2.3 django31: Django >= 3.1, < 3.2 django32: Django >= 3.2, < 3.3 django40: Django >= 4.0, < 4.1 From 64526cfb60675142f369487dc308768f30df7598 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Fri, 11 Feb 2022 14:36:20 +0000 Subject: [PATCH 04/22] Remove Django 2.2 again. Remembered that I removed it because it won't work with django-taggit 2.0 that is needed for Django 4.0. --- README.md | 2 +- tox.ini | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index d393c54..7b59232 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Django Ditto [![image](https://coveralls.io/repos/github/philgyford/django-ditto/badge.svg?branch=main)](https://coveralls.io/github/philgyford/django-ditto?branch=main "Test coverage") [![image](https://readthedocs.org/projects/django-ditto/badge/?version=stable)](https://django-ditto.readthedocs.io/en/stable/?badge=stable "Documentation status") -A collection of Django apps for copying things from third-party sites and services. Requires Python 3.6 to 3.9, and Django 2.2 to 4.0. +A collection of Django apps for copying things from third-party sites and services. Requires Python 3.6 to 3.9, and Django 3.1 to 4.0. [Read the documentation.](http://django-ditto.readthedocs.io/en/latest/) diff --git a/tox.ini b/tox.ini index d05080f..987975a 100644 --- a/tox.ini +++ b/tox.ini @@ -3,10 +3,10 @@ minversion = 1.8 envlist = - py36-django{22,31,32} - py37-django{22,31,32} - py38-django{22,31,32,40} - py39-django{22,31,32,40} + py36-django{31,32} + py37-django{31,32} + py38-django{31,32,40} + py39-django{31,32,40} py310-django{32,40} flake8 @@ -22,7 +22,6 @@ python = [gh-actions:env] ; Maps GitHub Actions DJANGO version env var to tox env vars: DJANGO = - 2.2: django22 3.1: django31 3.2: django32 4.0: django40 @@ -37,7 +36,6 @@ setenv = [testenv] deps = - django22: Django >= 2.2, < 2.3 django31: Django >= 3.1, < 3.2 django32: Django >= 3.2, < 3.3 django40: Django >= 4.0, < 4.1 From ce88835db0317a9bf8cdc1e989c4cadfcb1775e0 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Fri, 11 Feb 2022 14:37:25 +0000 Subject: [PATCH 05/22] Update devproject's dependencies --- devproject/Pipfile | 2 +- devproject/Pipfile.lock | 273 ++++++++++++++++++---------------------- 2 files changed, 125 insertions(+), 150 deletions(-) diff --git a/devproject/Pipfile b/devproject/Pipfile index 5cab740..4ba1f1a 100644 --- a/devproject/Pipfile +++ b/devproject/Pipfile @@ -9,4 +9,4 @@ name = "pypi" [dev-packages] [requires] -python_version = "3.8" +python_version = "3.10" diff --git a/devproject/Pipfile.lock b/devproject/Pipfile.lock index 30c79a8..0b35802 100644 --- a/devproject/Pipfile.lock +++ b/devproject/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "a4312a937566652422be4831bed9a0ee49896bb5a4e6f7c259425612d32d0f99" + "sha256": "aac7c54ec53fc5d8affc83358e9e3d1e054339e4e522d1621fed76230c61ef16" }, "pipfile-spec": 6, "requires": { - "python_version": "3.8" + "python_version": "3.10" }, "sources": [ { @@ -16,28 +16,42 @@ ] }, "default": { - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, "asgiref": { "hashes": [ - "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9", - "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214" + "sha256:2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0", + "sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9" ], - "markers": "python_version >= '3.6'", - "version": "==3.4.1" + "markers": "python_version >= '3.7'", + "version": "==3.5.0" }, "black": { "hashes": [ - "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116", - "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219" + "sha256:07e5c049442d7ca1a2fc273c79d1aecbbf1bc858f62e8184abe1ad175c4f7cc2", + "sha256:0e21e1f1efa65a50e3960edd068b6ae6d64ad6235bd8bfea116a03b21836af71", + "sha256:1297c63b9e1b96a3d0da2d85d11cd9bf8664251fd69ddac068b98dc4f34f73b6", + "sha256:228b5ae2c8e3d6227e4bde5920d2fc66cc3400fde7bcc74f480cb07ef0b570d5", + "sha256:2d6f331c02f0f40aa51a22e479c8209d37fcd520c77721c034517d44eecf5912", + "sha256:2ff96450d3ad9ea499fc4c60e425a1439c2120cbbc1ab959ff20f7c76ec7e866", + "sha256:3524739d76b6b3ed1132422bf9d82123cd1705086723bc3e235ca39fd21c667d", + "sha256:35944b7100af4a985abfcaa860b06af15590deb1f392f06c8683b4381e8eeaf0", + "sha256:373922fc66676133ddc3e754e4509196a8c392fec3f5ca4486673e685a421321", + "sha256:5fa1db02410b1924b6749c245ab38d30621564e658297484952f3d8a39fce7e8", + "sha256:6f2f01381f91c1efb1451998bd65a129b3ed6f64f79663a55fe0e9b74a5f81fd", + "sha256:742ce9af3086e5bd07e58c8feb09dbb2b047b7f566eb5f5bc63fd455814979f3", + "sha256:7835fee5238fc0a0baf6c9268fb816b5f5cd9b8793423a75e8cd663c48d073ba", + "sha256:8871fcb4b447206904932b54b567923e5be802b9b19b744fdff092bd2f3118d0", + "sha256:a7c0192d35635f6fc1174be575cb7915e92e5dd629ee79fdaf0dcfa41a80afb5", + "sha256:b1a5ed73ab4c482208d20434f700d514f66ffe2840f63a6252ecc43a9bc77e8a", + "sha256:c8226f50b8c34a14608b848dc23a46e5d08397d009446353dad45e04af0c8e28", + "sha256:ccad888050f5393f0d6029deea2a33e5ae371fd182a697313bdbd835d3edaf9c", + "sha256:dae63f2dbf82882fa3b2a3c49c32bffe144970a573cd68d247af6560fc493ae1", + "sha256:e2f69158a7d120fd641d1fa9a921d898e20d52e44a74a6fbbcc570a62a6bc8ab", + "sha256:efbadd9b52c060a8fc3b9658744091cb33c31f830b3f074422ed27bad2b18e8f", + "sha256:f5660feab44c2e3cb24b2419b998846cbb01c23c7fe645fee45087efa3da2d61", + "sha256:fdb8754b453fb15fad3f72cd9cad3e16776f0964d67cf30ebcbf10327a3777a3" ], "markers": "python_full_version >= '3.6.2'", - "version": "==21.7b0" + "version": "==22.1.0" }, "certifi": { "hashes": [ @@ -48,11 +62,11 @@ }, "charset-normalizer": { "hashes": [ - "sha256:e019de665e2bcf9c2b64e2e5aa025fa991da8720daa3c1138cadd2fd1856aed0", - "sha256:f7af805c321bfa1ce6714c51f254e0d5bb5e5834039bc17db7ebe3a4cec9492b" + "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45", + "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c" ], "markers": "python_version >= '3'", - "version": "==2.0.7" + "version": "==2.0.11" }, "click": { "hashes": [ @@ -64,27 +78,27 @@ }, "django": { "hashes": [ - "sha256:42573831292029639b798fe4d3812996bfe4ff3275f04566da90764daec011a5", - "sha256:f6d2c4069c9b9bfac03bedff927ea1f9e0d29e34525cec8a68fd28eb2a8df7af" + "sha256:110fb58fb12eca59e072ad59fc42d771cd642dd7a2f2416582aa9da7a8ef954a", + "sha256:996495c58bff749232426c88726d8cd38d24c94d7c1d80835aafffa9bc52985a" ], - "markers": "python_version >= '3.6'", - "version": "==3.2.8" + "markers": "python_version >= '3.8'", + "version": "==4.0.2" }, "django-appconf": { "hashes": [ "sha256:ae9f864ee1958c815a965ed63b3fba4874eec13de10236ba063a788f9a17389d", "sha256:be3db0be6c81fa84742000b89a81c016d70ae66a7ccb620cdef592b1f1a6aaa4" ], - "markers": "python_version >= '3.6'", + "markers": "python_version >= '3.1'", "version": "==1.0.5" }, "django-debug-toolbar": { "hashes": [ - "sha256:8c5b13795d4040008ee69ba82dcdd259c49db346cf7d0de6e561a49d191f0860", - "sha256:d7bab7573fab35b0fd029163371b7182f5826c13da69734beb675c761d06a4d3" + "sha256:644bbd5c428d3283aa9115722471769cac1bec189edf3a0c855fd8ff870375a9", + "sha256:6b633b6cfee24f232d73569870f19aa86c819d750e7f3e833f2344a9eb4b4409" ], "markers": "python_version >= '3.6'", - "version": "==3.2.2" + "version": "==3.2.4" }, "django-ditto": { "editable": true, @@ -95,33 +109,33 @@ }, "django-imagekit": { "hashes": [ - "sha256:304c3379f6a5cac387e47ace11195a603ad3cb01e3e951b45489824d25b00359", - "sha256:6ec0afb77cdf52cd453c9fc2c10ef350d111edfd6ce53c5977aa8a0e22cee00c" + "sha256:87e36f8dc1d8745647881f4366ef4965225f048042dacebbee0dcb87425defef", + "sha256:e559aeaae43a33b34f87631a9fa5696455e4451ffa738a42635fde442fedac5c" ], - "version": "==4.0.2" + "version": "==4.1.0" }, "django-sortedm2m": { "hashes": [ - "sha256:091e00e12b399ffd8fc74ebf4cc0f14d0bc0e28961c4ac714ca88ae24bd96aa3", - "sha256:8acc3638b7a2587533c7776deaa2c6c035220c8f9fff85ed67858a9c6bf51e7c" + "sha256:136f3d4e0820b351608a7141d88ac3ba7fafcd37a9b8361ad00ffe616a790be5", + "sha256:c67ae0757e8e60ded15a9ba04d0862fe39fba3d5b865899c2472166ff0050f2c" ], - "version": "==3.0.2" + "version": "==3.1.1" }, "django-taggit": { "hashes": [ - "sha256:dfe9e9c10b5929132041de0c00093ef0072c73c2a97d0f74a818ae50fa77149a", - "sha256:e5bb62891f458d55332e36a32e19c08d20142c43f74bc5656c803f8af25c084a" + "sha256:61547a23fc99967c9304107414a09e662b459f4163dbbae32e60b8ba40c34d05", + "sha256:a9f41e4ad58efe4b28d86f274728ee87eb98eeae90c9eb4b4efad39e5068184e" ], "markers": "python_version >= '3.6'", - "version": "==1.5.1" + "version": "==2.1.0" }, "flake8": { "hashes": [ - "sha256:07528381786f2a6237b061f6e96610a4167b226cb926e2aa2b6b1d78057c576b", - "sha256:bf8fd333346d844f616e8d47905ef3a3384edae6b4e9beb0c5101e25e3110907" + "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d", + "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==3.9.2" + "markers": "python_version >= '3.6'", + "version": "==4.0.1" }, "flickrapi": { "hashes": [ @@ -154,11 +168,11 @@ }, "oauthlib": { "hashes": [ - "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc", - "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3" + "sha256:23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2", + "sha256:6db33440354787f9b7f3a6dbd4febf5d0f93758354060e802f6c06cb493022fe" ], "markers": "python_version >= '3.6'", - "version": "==3.1.1" + "version": "==3.2.0" }, "pathspec": { "hashes": [ @@ -175,66 +189,68 @@ }, "pillow": { "hashes": [ - "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76", - "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585", - "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b", - "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8", - "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55", - "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc", - "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645", - "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff", - "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc", - "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b", - "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6", - "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20", - "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e", - "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a", - "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779", - "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02", - "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39", - "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f", - "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a", - "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409", - "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c", - "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488", - "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b", - "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d", - "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09", - "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b", - "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153", - "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9", - "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad", - "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df", - "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df", - "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed", - "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed", - "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698", - "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29", - "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649", - "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49", - "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b", - "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2", - "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a", - "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78" - ], - "markers": "python_version >= '3.6'", - "version": "==8.4.0" + "sha256:011233e0c42a4a7836498e98c1acf5e744c96a67dd5032a6f666cc1fb97eab97", + "sha256:0f29d831e2151e0b7b39981756d201f7108d3d215896212ffe2e992d06bfe049", + "sha256:12875d118f21cf35604176872447cdb57b07126750a33748bac15e77f90f1f9c", + "sha256:14d4b1341ac07ae07eb2cc682f459bec932a380c3b122f5540432d8977e64eae", + "sha256:1c3c33ac69cf059bbb9d1a71eeaba76781b450bc307e2291f8a4764d779a6b28", + "sha256:1d19397351f73a88904ad1aee421e800fe4bbcd1aeee6435fb62d0a05ccd1030", + "sha256:253e8a302a96df6927310a9d44e6103055e8fb96a6822f8b7f514bb7ef77de56", + "sha256:2632d0f846b7c7600edf53c48f8f9f1e13e62f66a6dbc15191029d950bfed976", + "sha256:335ace1a22325395c4ea88e00ba3dc89ca029bd66bd5a3c382d53e44f0ccd77e", + "sha256:413ce0bbf9fc6278b2d63309dfeefe452835e1c78398efb431bab0672fe9274e", + "sha256:5100b45a4638e3c00e4d2320d3193bdabb2d75e79793af7c3eb139e4f569f16f", + "sha256:514ceac913076feefbeaf89771fd6febde78b0c4c1b23aaeab082c41c694e81b", + "sha256:528a2a692c65dd5cafc130de286030af251d2ee0483a5bf50c9348aefe834e8a", + "sha256:6295f6763749b89c994fcb6d8a7f7ce03c3992e695f89f00b741b4580b199b7e", + "sha256:6c8bc8238a7dfdaf7a75f5ec5a663f4173f8c367e5a39f87e720495e1eed75fa", + "sha256:718856856ba31f14f13ba885ff13874be7fefc53984d2832458f12c38205f7f7", + "sha256:7f7609a718b177bf171ac93cea9fd2ddc0e03e84d8fa4e887bdfc39671d46b00", + "sha256:80ca33961ced9c63358056bd08403ff866512038883e74f3a4bf88ad3eb66838", + "sha256:80fe64a6deb6fcfdf7b8386f2cf216d329be6f2781f7d90304351811fb591360", + "sha256:81c4b81611e3a3cb30e59b0cf05b888c675f97e3adb2c8672c3154047980726b", + "sha256:855c583f268edde09474b081e3ddcd5cf3b20c12f26e0d434e1386cc5d318e7a", + "sha256:9bfdb82cdfeccec50aad441afc332faf8606dfa5e8efd18a6692b5d6e79f00fd", + "sha256:a5d24e1d674dd9d72c66ad3ea9131322819ff86250b30dc5821cbafcfa0b96b4", + "sha256:a9f44cd7e162ac6191491d7249cceb02b8116b0f7e847ee33f739d7cb1ea1f70", + "sha256:b5b3f092fe345c03bca1e0b687dfbb39364b21ebb8ba90e3fa707374b7915204", + "sha256:b9618823bd237c0d2575283f2939655f54d51b4527ec3972907a927acbcc5bfc", + "sha256:cef9c85ccbe9bee00909758936ea841ef12035296c748aaceee535969e27d31b", + "sha256:d21237d0cd37acded35154e29aec853e945950321dd2ffd1a7d86fe686814669", + "sha256:d3c5c79ab7dfce6d88f1ba639b77e77a17ea33a01b07b99840d6ed08031cb2a7", + "sha256:d9d7942b624b04b895cb95af03a23407f17646815495ce4547f0e60e0b06f58e", + "sha256:db6d9fac65bd08cea7f3540b899977c6dee9edad959fa4eaf305940d9cbd861c", + "sha256:ede5af4a2702444a832a800b8eb7f0a7a1c0eed55b644642e049c98d589e5092", + "sha256:effb7749713d5317478bb3acb3f81d9d7c7f86726d41c1facca068a04cf5bb4c", + "sha256:f154d173286a5d1863637a7dcd8c3437bb557520b01bddb0be0258dcb72696b5", + "sha256:f25ed6e28ddf50de7e7ea99d7a976d6a9c415f03adcaac9c41ff6ff41b6d86ac" + ], + "markers": "python_version >= '3.7'", + "version": "==9.0.1" + }, + "platformdirs": { + "hashes": [ + "sha256:30671902352e97b1eafd74ade8e4a694782bd3471685e78c32d0fdfd3aa7e7bb", + "sha256:8ec11dfba28ecc0715eb5fb0147a87b1bf325f349f3da9aab2cd6b50b96b692b" + ], + "markers": "python_version >= '3.7'", + "version": "==2.5.0" }, "pycodestyle": { "hashes": [ - "sha256:514f76d918fcc0b55c6680472f0a37970994e07bbb80725808c17089be302068", - "sha256:c389c1d06bf7904078ca03399a4816f974a1d590090fecea0c63ec26ebaf1cef" + "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20", + "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.7.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==2.8.0" }, "pyflakes": { "hashes": [ - "sha256:7893783d01b8a89811dd72d7dfd4d84ff098e5eed95cfa8905b22bbffe52efc3", - "sha256:f5bc8ecabc05bb9d291eb5203d6810b49040f6ff446a756326104746cc00c1db" + "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c", + "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.3.1" + "version": "==2.4.0" }, "python-dateutil": { "editable": true, @@ -250,62 +266,21 @@ ], "version": "==2021.3" }, - "regex": { - "hashes": [ - "sha256:0f82de529d7595011a40573cc0f27422e59cafa94943b64a4d17d966d75f2c01", - "sha256:130a002fa386c976615a2f6d6dff0fcc25da24858994a36b14d2e3129dce7de2", - "sha256:164e51ace4d00f07c519f85ec2209e8faaeab18bc77be6b35685c18d4ac1c22a", - "sha256:19c4fd59747236423016ccd89b9a6485d958bf1aa7a8a902a6ba28029107a87f", - "sha256:201890fdc8a65396cfb6aa4493201353b2a6378e27d2de65234446f8329233cb", - "sha256:2044174af237bb9c56ecc07294cf38623ee379e8dca14b01e970f8b015c71917", - "sha256:2ff91696888755e96230138355cbe8ce2965d930d967d6cff7c636082d038c78", - "sha256:3b5a0660a63b0703380758a7141b96cc1c1a13dee2b8e9c280a2522962fd12af", - "sha256:468de52dd3f20187ab5ca4fd265c1bea61a5346baef01ad0333a5e89fa9fad29", - "sha256:4832736b3f24617e63dc919ce8c4215680ba94250a5d9e710fcc0c5f457b5028", - "sha256:5b75a3db3aab0bfa51b6af3f820760779d360eb79f59e32c88c7fba648990b4f", - "sha256:678d9a4ce79e1eaa4ebe88bc9769df52919eb30c597576a0deba1f3cf2360e65", - "sha256:72a0b98d41c4508ed23a96eef41090f78630b44ba746e28cd621ecbe961e0a16", - "sha256:740a28580520b099b804776db1e919360fcbf30a734a14c5985d5e39a39e7237", - "sha256:74d03c256cf0aed81997e87be8e24297b5792c9718f3a735f5055ddfad392f06", - "sha256:8bd83d9b8ee125350cd666b55294f4bc9993c4f0d9b1be9344a318d0762e94cc", - "sha256:98743a2d827a135bf3390452be18d95839b947a099734d53c17e09a64fc09480", - "sha256:98fe0e1b07a314f0a86dc58af4e717c379d48a403eddd8d966ab9b8bf91ce164", - "sha256:9c613d797a3790f6b12e78a61e1cd29df7fc88135218467cf8b0891353292b9c", - "sha256:9cd14f22425beecf727f6dbdf5c893e46ecbc5ff16197c16a6f38a9066f2d4d5", - "sha256:ad1fedca001fefc3030d1e9022b038af429e58dc06a7e9c55e40bd1f834582ec", - "sha256:b9dfba513eae785e3d868803f5a7e21a032cb2b038fa4a1ea7ec691037426ad3", - "sha256:bc4637390235f1e3e2fcdd3e904ca0b42aa655ae28a78072248b2992b4ad4c08", - "sha256:c0f49f1f03be3e4a5faaadc35db7afa2b83a871943b889f9f7bba56e0e2e8bd5", - "sha256:c5a2ac760f2fc13a1c58131ec217779911890899ce1a0a63c9409bd23fecde6f", - "sha256:d6432daf42f2c487b357e1aa0bdc43193f050ff53a3188bfab20b88202b53027", - "sha256:dc1a9bedf389bf3d3627a4d2b21cbdc5fe5e0f029d1f465972f4437833dcc946", - "sha256:de7dbf72ae80f06e79444ff9614fb5e3a7956645d513b0e12d1bbe6f3ccebd11", - "sha256:ded4748c7be6f31fb207387ee83a3a0f625e700defe32f268cb1d350ed6e4a66", - "sha256:e39eafa854e469d7225066c806c76b9a0acba5ff5ce36c82c0224b75e24888f2", - "sha256:edff4e31d159672a7b9d70164b21289e4b53b239ce1dc945bf9643d266537573", - "sha256:f1b23304855303bd97b5954edab63b8ddd56c91c41c6d4eba408228c0bae95f3", - "sha256:f3da121de36a9ead0f32b44ea720ee8c87edbb59dca6bb980d18377d84ad58a3", - "sha256:f68c71aabb10b1352a06515e25a425a703ba85660ae04cf074da5eb91c0af5e5", - "sha256:f82d3adde46ac9188db3aa7e6e1690865ebb6448d245df5a3ea22284f70d9e46", - "sha256:fd1bfc6b7347de9f0ae1fb6f9080426bed6a9ca55b5766fa4fdf7b3a29ccae9c" - ], - "version": "==2021.10.21" - }, "requests": { "hashes": [ - "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", - "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" + "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61", + "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==2.26.0" + "version": "==2.27.1" }, "requests-oauthlib": { "hashes": [ - "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", - "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a", - "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc" + "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5", + "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a" ], - "version": "==1.3.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.3.1" }, "requests-toolbelt": { "hashes": [ @@ -332,11 +307,11 @@ }, "tomli": { "hashes": [ - "sha256:8dd0e9524d6f386271a36b41dbf6c57d8e32fd96fd22b6584679dc569d20899f", - "sha256:a5b75cb6f3968abb47af1b40c1819dc519ea82bcc065776a866e8d74c5ca9442" + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '3.6'", - "version": "==1.2.1" + "markers": "python_version >= '3.7'", + "version": "==2.0.1" }, "twitter-text-python": { "hashes": [ @@ -354,11 +329,11 @@ }, "urllib3": { "hashes": [ - "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", - "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" + "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed", + "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.7" + "version": "==1.26.8" } }, "develop": {} From 7cb72d3f83dfda5439e55290ee913b5d6347d249 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Fri, 11 Feb 2022 15:39:12 +0000 Subject: [PATCH 06/22] OK, dropping support for Django 2.2 and 3.1. Really this time. --- .github/workflows/tests.yml | 14 ++++++++------ CHANGELOG.md | 6 +++--- README.md | 2 +- setup.py | 2 -- tox.ini | 10 ++++------ 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 656a239..9e7e9c6 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,12 +17,14 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.6", "3.7", "3.8", "3.9"] - django-version: ["2.2", "3.1", "3.2"] - # If we wanted to exclude combinations, we could add them here: - # exclude: - # - python-version: "3.5" - # django-version: "3.0" + python-version: ["3.6", "3.7", "3.8", "3.9", "4.0"] + django-version: ["3.2", "4.0"] + exclude: + # Django 4.0 isn't compatible with python 3.6 and 3.7: + - python-version: "3.6" + django-version: "4.0" + - python-version: "3.7" + django-version: "4.0" steps: - name: Git clone diff --git a/CHANGELOG.md b/CHANGELOG.md index 8ff1c75..614fd2b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,14 +4,14 @@ Changelog (Django Ditto) Unreleased ---------- -- **Backwards incompatible:** Drop support for Django 2.2. +- **Backwards incompatible:** Drop support for Django 2.2 and 3.1. - **Backwards incompatible:** Requires django-taggit >= v2.0.0 (It changed how `TaggableManager` sets tags: https://github.com/jazzband/django-taggit/blob/master/CHANGELOG.rst#200-2021-11-14 ) -- Add support for Django 4.0 [WAITING ON django-taggit] +- Add support for Django 4.0 -- Add support for Python 3.10 [WAITING ON django-taggit] +- Add support for Python 3.10 1.4.2 - 2021-10-22 diff --git a/README.md b/README.md index 7b59232..0acc5da 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Django Ditto [![image](https://coveralls.io/repos/github/philgyford/django-ditto/badge.svg?branch=main)](https://coveralls.io/github/philgyford/django-ditto?branch=main "Test coverage") [![image](https://readthedocs.org/projects/django-ditto/badge/?version=stable)](https://django-ditto.readthedocs.io/en/stable/?badge=stable "Documentation status") -A collection of Django apps for copying things from third-party sites and services. Requires Python 3.6 to 3.9, and Django 3.1 to 4.0. +A collection of Django apps for copying things from third-party sites and services. Requires Python 3.6, 3.7, 3.8, 3.9 and 3.10, and Django 3.2 and 4.0. [Read the documentation.](http://django-ditto.readthedocs.io/en/latest/) diff --git a/setup.py b/setup.py index 0efb5f0..cb7e408 100644 --- a/setup.py +++ b/setup.py @@ -107,8 +107,6 @@ def get_author_email(): "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", - "Framework :: Django :: 2.2", - "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", "Framework :: Django :: 4.0", "Intended Audience :: Developers", diff --git a/tox.ini b/tox.ini index 987975a..e02a39a 100644 --- a/tox.ini +++ b/tox.ini @@ -3,10 +3,10 @@ minversion = 1.8 envlist = - py36-django{31,32} - py37-django{31,32} - py38-django{31,32,40} - py39-django{31,32,40} + py36-django{32} + py37-django{32} + py38-django{32,40} + py39-django{32,40} py310-django{32,40} flake8 @@ -22,7 +22,6 @@ python = [gh-actions:env] ; Maps GitHub Actions DJANGO version env var to tox env vars: DJANGO = - 3.1: django31 3.2: django32 4.0: django40 @@ -36,7 +35,6 @@ setenv = [testenv] deps = - django31: Django >= 3.1, < 3.2 django32: Django >= 3.2, < 3.3 django40: Django >= 4.0, < 4.1 extras = From d21e586dbe4f90b59484e85ff1c3f9647e03f399 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Fri, 11 Feb 2022 15:44:28 +0000 Subject: [PATCH 07/22] Fix python version in GitHub Action test workflow No, the sequence doesn't go 3.8, 3.9, 4.0... --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9e7e9c6..c8953c8 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.6", "3.7", "3.8", "3.9", "4.0"] + python-version: ["3.6", "3.7", "3.8", "3.9", "3.10"] django-version: ["3.2", "4.0"] exclude: # Django 4.0 isn't compatible with python 3.6 and 3.7: From 1eb5445e97f6b9112d35ae95229e18416a9b607a Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Sat, 12 Feb 2022 11:46:26 +0000 Subject: [PATCH 08/22] Move test_ingest.py to test_ingest_v1.py In preparation for importing the "new" 2019 format of Twitter archives. For #229 --- tests/twitter/{test_ingest.py => test_ingest_v1.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tests/twitter/{test_ingest.py => test_ingest_v1.py} (100%) diff --git a/tests/twitter/test_ingest.py b/tests/twitter/test_ingest_v1.py similarity index 100% rename from tests/twitter/test_ingest.py rename to tests/twitter/test_ingest_v1.py From 81d3c0a555b0db721ffa3c4026cdf1da776ad032 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Sat, 12 Feb 2022 11:49:51 +0000 Subject: [PATCH 09/22] Make existing TweetIngester Version1TweetIngester So that we can keep it working, for those with older existing Twitter Archive downloads, while adding a newer ingester for those with 2019+ downloads. For #229 --- ditto/twitter/ingest.py | 57 +++++++++++-------- .../commands/import_twitter_tweets.py | 34 +++++++---- .../fixtures/ingest/{ => v1}/2015_08.js | 0 tests/twitter/test_ingest_v1.py | 22 +++---- tests/twitter/test_management_commands.py | 40 ++++++++++--- 5 files changed, 100 insertions(+), 53 deletions(-) rename tests/twitter/fixtures/ingest/{ => v1}/2015_08.js (100%) diff --git a/ditto/twitter/ingest.py b/ditto/twitter/ingest.py index eb07d7b..5074c81 100644 --- a/ditto/twitter/ingest.py +++ b/ditto/twitter/ingest.py @@ -62,30 +62,10 @@ def ingest(self, directory): } def _load_data(self, directory): - """Goes through all the *.js files in `directory` and puts the tweet - data inside into self.tweets_data. - - No data is saved to the database until we've successfully loaded JSON - from all of the files. - - Keyword arguments: - directory -- The directory to load the files from. - - Raises: - FetchError -- If the directory is invalid, or there are no .js files, - or we can't load JSON from one of the files. - """ - try: - for file in os.listdir(directory): - if file.endswith(".js"): - filepath = "%s/%s" % (directory, file) - self._get_data_from_file(filepath) - self.file_count += 1 - except OSError as e: - raise IngestError(e) - - if self.file_count == 0: - raise IngestError("No .js files found in %s" % directory) + raise NotImplementedError( + "Child classes of TweetImporter must implement their own " + "_load_data() method." + ) def _get_data_from_file(self, filepath): """Looks in a file, parses its JSON, and adds a dict of data about @@ -116,3 +96,32 @@ def _save_tweets(self): for tweet in self.tweets_data: TweetSaver().save_tweet(tweet, self.fetch_time) self.tweet_count += 1 + + +class Version1TweetIngester(TweetIngester): + + def _load_data(self, directory): + """Goes through all the *.js files in `directory` and puts the tweet + data inside into self.tweets_data. + + No data is saved to the database until we've successfully loaded JSON + from all of the files. + + Keyword arguments: + directory -- The directory to load the files from. + + Raises: + FetchError -- If the directory is invalid, or there are no .js files, + or we can't load JSON from one of the files. + """ + try: + for file in os.listdir(directory): + if file.endswith(".js"): + filepath = "%s/%s" % (directory, file) + self._get_data_from_file(filepath) + self.file_count += 1 + except OSError as e: + raise IngestError(e) + + if self.file_count == 0: + raise IngestError("No .js files found in %s" % directory) \ No newline at end of file diff --git a/ditto/twitter/management/commands/import_twitter_tweets.py b/ditto/twitter/management/commands/import_twitter_tweets.py index e7c183b..38e175d 100644 --- a/ditto/twitter/management/commands/import_twitter_tweets.py +++ b/ditto/twitter/management/commands/import_twitter_tweets.py @@ -3,7 +3,7 @@ from django.core.management.base import BaseCommand, CommandError -from ...ingest import TweetIngester +from ...ingest import Version1TweetIngester class Command(BaseCommand): @@ -24,23 +24,39 @@ def add_arguments(self, parser): help="Path to the directory that is the archive", ) + parser.add_argument( + "--archive-version", + action="store", + default=None, + help="v1 or v2 (default). Which format of archives to import from.", + ) + def handle(self, *args, **options): # Location of the directory holding the tweet JSON files within the # archive: subpath = "/data/js/tweets" + ingester_class = None + + if options["archive_version"]: + if options["archive_version"] == "v1": + ingester_class = Version1TweetIngester + else: + raise CommandError( + f"version should be v1 or v2, not '{options['archive_version']}" + ) if options["path"]: if os.path.isdir(options["path"]): tweets_dir = "%s%s" % (options["path"], subpath) if os.path.isdir(tweets_dir): - result = TweetIngester().ingest(directory=tweets_dir) + result = ingester_class().ingest(directory=tweets_dir) else: raise CommandError( - "Expected to find a directory at '%s' containing JSON files" - % tweets_dir + f"Expected to find a directory at '{tweets_dir}' " + "containing JSON files" ) else: - raise CommandError("Can't find a directory at '%s'" % options["path"]) + raise CommandError(f"Can't find a directory at '{options['path']}'") else: raise CommandError( ( @@ -55,11 +71,9 @@ def handle(self, *args, **options): filenoun = "file" if result["files"] == 1 else "files" self.stdout.write( - "Imported %s %s from %s %s" - % (result["tweets"], tweetnoun, result["files"], filenoun) + f"Imported {result['tweets']} {tweetnoun} from " + f"{result['files']} {filenoun}" ) else: - self.stderr.write( - "Failed to import tweets: %s" % (result["messages"][0]) - ) + self.stderr.write(f"Failed to import tweets: {result['messages'][0]}") diff --git a/tests/twitter/fixtures/ingest/2015_08.js b/tests/twitter/fixtures/ingest/v1/2015_08.js similarity index 100% rename from tests/twitter/fixtures/ingest/2015_08.js rename to tests/twitter/fixtures/ingest/v1/2015_08.js diff --git a/tests/twitter/test_ingest_v1.py b/tests/twitter/test_ingest_v1.py index 2e31cb5..55d645f 100644 --- a/tests/twitter/test_ingest_v1.py +++ b/tests/twitter/test_ingest_v1.py @@ -4,14 +4,14 @@ from django.test import TestCase from ditto.twitter import factories -from ditto.twitter.ingest import IngestError, TweetIngester +from ditto.twitter.ingest import IngestError, Version1TweetIngester from ditto.twitter.models import Tweet -class TweetIngesterTestCase(TestCase): +class Version1TweetIngesterTestCase(TestCase): # A sample file of the format we'd get in a Twitter archive. - ingest_fixture = "tests/twitter/fixtures/ingest/2015_08.js" + ingest_fixture = "tests/twitter/fixtures/ingest/v1/2015_08.js" def get_tweet_data(self): "Returns the JSON tweet data, as text, from the fixture." @@ -23,14 +23,14 @@ def get_tweet_data(self): def test_raises_error_with_invalid_dir(self): with patch("os.path.isdir", return_value=False): with self.assertRaises(IngestError): - TweetIngester().ingest(directory="/bad/dir") + Version1TweetIngester().ingest(directory="/bad/dir") def test_raises_error_with_empty_dir(self): "If no .js files are found, raises IngestError" with patch("os.path.isdir", return_value=True): - with patch("ditto.twitter.ingest.TweetIngester", file_count=0): + with patch("ditto.twitter.ingest.Version1TweetIngester", file_count=0): with self.assertRaises(IngestError): - TweetIngester().ingest(directory="/bad/dir") + Version1TweetIngester().ingest(directory="/bad/dir") # All the below have a similar structure to mock out file-related functions. # Here's what's happening: @@ -56,7 +56,7 @@ def test_raises_error_with_empty_dir(self): # Ingest! This will save Tweets using our fixture data, and imagine it's # loaded data from our fake files: - # result = TweetIngester().ingest(directory='/good/dir') + # result = Version1TweetIngester().ingest(directory='/good/dir') def test_opens_all_files(self): "All the .js files in the directory are opened." @@ -71,7 +71,7 @@ def test_opens_all_files(self): m = mock_open(read_data=file_content) with patch("builtins.open", m): m.return_value.readlines.return_value = file_content.splitlines() - ingester = TweetIngester() + ingester = Version1TweetIngester() ingester.ingest(directory="/good/dir") m.assert_has_calls( [ @@ -91,7 +91,7 @@ def test_saves_all_tweets(self): m = mock_open(read_data=file_content) with patch("builtins.open", m): m.return_value.readlines.return_value = file_content.splitlines() - TweetIngester().ingest(directory="/good/dir") + Version1TweetIngester().ingest(directory="/good/dir") # We load three dummy files; our results have three tweets in each: self.assertEqual(Tweet.objects.count(), 3) @@ -103,7 +103,7 @@ def test_returns_correctly_on_success(self): m = mock_open(read_data=file_content) with patch("builtins.open", m): m.return_value.readlines.return_value = file_content.splitlines() - result = TweetIngester().ingest(directory="/good/dir") + result = Version1TweetIngester().ingest(directory="/good/dir") self.assertTrue(result["success"]) self.assertEqual(result["tweets"], 3) self.assertEqual(result["files"], 1) @@ -116,7 +116,7 @@ def test_returns_correctly_on_success_no_tweets(self): m = mock_open(read_data=file_content) with patch("builtins.open", m): m.return_value.readlines.return_value = file_content.splitlines() - result = TweetIngester().ingest(directory="/good/dir") + result = Version1TweetIngester().ingest(directory="/good/dir") self.assertFalse(result["success"]) self.assertEqual(result["tweets"], 0) self.assertEqual(result["files"], 1) diff --git a/tests/twitter/test_management_commands.py b/tests/twitter/test_management_commands.py index 1391fa3..86a5506 100644 --- a/tests/twitter/test_management_commands.py +++ b/tests/twitter/test_management_commands.py @@ -216,10 +216,12 @@ def test_error_output(self): self.assertIn("Could not fetch @philgyford: It broke", self.out_err.getvalue()) -class ImportTweets(TestCase): +class ImportTweetsVersion1(TestCase): + "Only testing using archive-version=v1 argument" + def setUp(self): self.patcher = patch( - "ditto.twitter.management.commands.import_twitter_tweets.TweetIngester.ingest" # noqa: E501 + "ditto.twitter.management.commands.import_twitter_tweets.Version1TweetIngester.ingest" # noqa: E501 ) self.ingest_mock = self.patcher.start() self.out = StringIO() @@ -233,39 +235,60 @@ def test_fails_with_no_args(self): with self.assertRaises(CommandError): call_command("import_twitter_tweets") + def test_fails_with_invalid_version(self): + with self.assertRaises(CommandError): + call_command( + "import_twitter_tweets", path="/right/path", archive_version="nope" + ) + def test_fails_with_invalid_directory(self): + "Test fails with invalid directory" with patch("os.path.isdir", return_value=False): with self.assertRaises(CommandError): - call_command("import_twitter_tweets", path="/wrong/path") + call_command( + "import_twitter_tweets", path="/wrong/path", archive_version="v1" + ) def test_calls_ingest_method(self): + "Calls correct class and method" with patch("os.path.isdir", return_value=True): - call_command("import_twitter_tweets", path="/right/path", stdout=self.out) + call_command( + "import_twitter_tweets", + path="/right/path", + archive_version="v1", + stdout=self.out, + ) self.ingest_mock.assert_called_once_with( directory="/right/path/data/js/tweets" ) def test_success_output(self): - """Outputs the correct response if ingesting succeeds.""" + """Outputs the correct response if ingesting succeeds""" self.ingest_mock.return_value = {"success": True, "tweets": 12345, "files": 21} with patch("os.path.isdir", return_value=True): - call_command("import_twitter_tweets", path="/right/path", stdout=self.out) + call_command( + "import_twitter_tweets", + path="/right/path", + archive_version="v1", + stdout=self.out, + ) self.assertIn("Imported 12345 tweets from 21 files", self.out.getvalue()) def test_success_output_verbosity_0(self): - """Outputs nothing if ingesting succeeds.""" + """Outputs nothing if ingesting succeeds""" self.ingest_mock.return_value = {"success": True, "tweets": 12345, "files": 21} with patch("os.path.isdir", return_value=True): call_command( "import_twitter_tweets", path="/right/path", + archive_version="v1", verbosity=0, stdout=self.out, ) self.assertEqual("", self.out.getvalue()) def test_error_output(self): - """Outputs the correct error if ingesting fails.""" + """Outputs the correct error if ingesting fails""" self.ingest_mock.return_value = { "success": False, "messages": ["Something went wrong"], @@ -274,6 +297,7 @@ def test_error_output(self): call_command( "import_twitter_tweets", path="/right/path", + archive_version="v1", stdout=self.out, stderr=self.out_err, ) From 4948f07d5202ec96e76b8e68fc26826eb2bc9c0c Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Sat, 12 Feb 2022 18:07:31 +0000 Subject: [PATCH 10/22] Make htmlify_tweet() more robust when encountering strs not ints Some tweet JSON have the `display_text_range` set as strings not ints, e.g. `["0", "140"]` rather than `[0, 140]`. Particularly when the JSON has come from the downloaded Twitter archive. And Some tweet JSON have the `["entities"][]["indices"]` set as strings not ints, e.g. `["0", "9"]` rather than `[0, 9]`. Particularly when the JSON has come from the downloaded Twitter archive. For #229 --- ditto/twitter/utils.py | 15 +++++++ .../tweet_with_display_text_range_str.json | 20 +++++++++ .../api/tweet_with_entities_indices_str.json | 40 +++++++++++++++++ tests/twitter/test_utils.py | 44 +++++++++++++++++++ 4 files changed, 119 insertions(+) create mode 100644 tests/twitter/fixtures/api/tweet_with_display_text_range_str.json create mode 100644 tests/twitter/fixtures/api/tweet_with_entities_indices_str.json diff --git a/ditto/twitter/utils.py b/ditto/twitter/utils.py index f8d6956..8e2eaa1 100644 --- a/ditto/twitter/utils.py +++ b/ditto/twitter/utils.py @@ -74,6 +74,21 @@ def htmlify_tweet(json_data): if "entities" in json_data and "symbols" not in json_data["entities"]: json_data["entities"]["symbols"] = [] + # Some Tweets (eg from a downloaded archive) have strings instead of ints + # to define text ranges. ["0", "140"] rather than [0, 140]. + # We fix those here so that Twython doesn't complain. + if "display_text_range" in json_data: + json_data["display_text_range"] = [ + int(n) for n in json_data["display_text_range"] + ] + if "entities" in json_data: + for key, value in json_data["entities"].items(): + for count, entity in enumerate(value): + if "indices" in entity: + json_data["entities"][key][count]["indices"] = [ + int(n) for n in entity["indices"] + ] + # This does most of the work for us: # https://twython.readthedocs.org/en/latest/usage/special_functions.html#html-for-tweet html = Twython.html_for_tweet( diff --git a/tests/twitter/fixtures/api/tweet_with_display_text_range_str.json b/tests/twitter/fixtures/api/tweet_with_display_text_range_str.json new file mode 100644 index 0000000..8e87021 --- /dev/null +++ b/tests/twitter/fixtures/api/tweet_with_display_text_range_str.json @@ -0,0 +1,20 @@ +{ + "retweeted": false, + "source": "Tweetbot for iΟS", + "entities": { + "hashtags": [], + "symbols": [], + "user_mentions": [], + "urls": [] + }, + "display_text_range": ["0", "140"], + "favorite_count": "6", + "id_str": "915152022273449987", + "truncated": false, + "retweet_count": "0", + "id": "915152022273449987", + "created_at": "Tue Oct 03 09:50:19 +0000 2017", + "favorited": false, + "full_text": "Open iPad Slack, scroll to bottom. Close Slack. Open Slack; it’s scrolled back up. Every time. Maddening. Not biggest problem in world, BUT.", + "lang": "en" +} diff --git a/tests/twitter/fixtures/api/tweet_with_entities_indices_str.json b/tests/twitter/fixtures/api/tweet_with_entities_indices_str.json new file mode 100644 index 0000000..79e8287 --- /dev/null +++ b/tests/twitter/fixtures/api/tweet_with_entities_indices_str.json @@ -0,0 +1,40 @@ +{ + "retweeted": false, + "source": "Tweetbot for Mac", + "entities": { + "hashtags": [], + "symbols": [], + "user_mentions": [ + { + "name": "Terry Collier", + "screen_name": "terrycol", + "indices": ["0", "9"], + "id_str": "123", + "id": "123" + }, + { + "name": "Bob Ferris", + "screen_name": "bobferris", + "indices": ["10", "20"], + "id_str": "234", + "id": "234" + } + ], + "urls": [] + }, + "display_text_range": [0, 142], + "favorite_count": "0", + "in_reply_to_status_id_str": "914906397061664768", + "id_str": "914908752482111488", + "in_reply_to_user_id": "123", + "truncated": false, + "retweet_count": "0", + "id": "914908752482111488", + "in_reply_to_status_id": "914906397061664768", + "created_at": "Mon Oct 02 17:43:39 +0000 2017", + "favorited": false, + "full_text": "@terrycol @bobferris I liked it and only thought some of it was a bit silly. But analysis beyond that is probably beyond the scope of Twitter.", + "lang": "en", + "in_reply_to_screen_name": "terrycol", + "in_reply_to_user_id_str": "123" +} diff --git a/tests/twitter/test_utils.py b/tests/twitter/test_utils.py index 05b37e4..01f40aa 100644 --- a/tests/twitter/test_utils.py +++ b/tests/twitter/test_utils.py @@ -35,6 +35,7 @@ def test_htmlify_description(self): ) + class HtmlifyTweetEntitiesTestCase(HtmlifyTestCase): "Linkify URLs from entities: urls, screen_names, hashtags." @@ -160,6 +161,49 @@ def test_strip(self): self.assertEqual("Y", tweet_html[-1]) +class HtmlifyTweetStrsNotIntsTestCase(HtmlifyTestCase): + + def test_handles_display_text_range_str(self): + """Cope correctly if display_text_range is strings, not ints. + + Some tweet JSON have the display_text_range set as strings not ints, + e.g. ["0", "140"] rather than [0, 140]. Particularly when the + JSON has come from the downloaded Twitter archive. + It should be able to cope with that. + """ + api_fixture = "tweet_with_display_text_range_str.json" + tweet_html = htmlify_tweet(self.getJson(api_fixture)) + self.assertEqual( + tweet_html, + ( + "Open iPad Slack, scroll to bottom. Close Slack. Open Slack; it’s " + "scrolled back up. Every time. Maddening. Not biggest problem in " + "world, BUT." + ) + ) + + def test_handles_entities_indicies_str(self): + """Cope correctly if entities' indicies are strings, not ints. + + Some tweet JSON have the ["entities"][]["indices"] set as + strings not ints, e.g. ["0", "9"] rather than [0, 9]. + Particularly when the JSON has come from the downloaded Twitter + archive. + It should be able to cope with that. + """ + api_fixture = "tweet_with_entities_indices_str.json" + tweet_html = htmlify_tweet(self.getJson(api_fixture)) + self.assertEqual( + tweet_html, + ( + '@terrycol ' + '@bobferris ' + 'I liked it and only thought some of it was a bit silly. But analysis ' + 'beyond that is probably beyond the scope of Twitter.' + ) + ) + + class HtmlifyTweetUrlsTestCase(HtmlifyTestCase): "Further tests for specific problems with URLs." From ba96bc534dee90c66b1ef24404a264e0836b9c60 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Sat, 12 Feb 2022 18:09:27 +0000 Subject: [PATCH 11/22] Formatting --- tests/twitter/test_utils.py | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/tests/twitter/test_utils.py b/tests/twitter/test_utils.py index 01f40aa..dee7701 100644 --- a/tests/twitter/test_utils.py +++ b/tests/twitter/test_utils.py @@ -31,11 +31,10 @@ def test_htmlify_description(self): '#testing ' 'gyford.com $IBM ' '#test @philgyford' - ) + ), ) - class HtmlifyTweetEntitiesTestCase(HtmlifyTestCase): "Linkify URLs from entities: urls, screen_names, hashtags." @@ -54,7 +53,7 @@ def test_links_urls(self): ( 'and wired.com/2015/10/' - 'meet-w…' + "meet-w…" ) in tweet_html ) @@ -85,7 +84,7 @@ def test_links_users_with_entities(self): self.assertEqual( ( '' - '@genmon lovely, on my way.' + "@genmon lovely, on my way." ), tweet_html, ) @@ -115,7 +114,7 @@ def test_links_substringed_hashtags(self): tweet_html = htmlify_tweet(self.getJson(api_fixture)) self.assertTrue( ( - '@denisewilton ' + "@denisewilton " '#LOVEWHATYOUDO ' '' - '$AAPL and ' + "$AAPL and " '' - '$PEP and $ANOTHER and ' + "$PEP and $ANOTHER and " '$A.' - ) + ), ) @@ -162,7 +161,6 @@ def test_strip(self): class HtmlifyTweetStrsNotIntsTestCase(HtmlifyTestCase): - def test_handles_display_text_range_str(self): """Cope correctly if display_text_range is strings, not ints. @@ -179,7 +177,7 @@ def test_handles_display_text_range_str(self): "Open iPad Slack, scroll to bottom. Close Slack. Open Slack; it’s " "scrolled back up. Every time. Maddening. Not biggest problem in " "world, BUT." - ) + ), ) def test_handles_entities_indicies_str(self): @@ -198,9 +196,9 @@ def test_handles_entities_indicies_str(self): ( '@terrycol ' '@bobferris ' - 'I liked it and only thought some of it was a bit silly. But analysis ' - 'beyond that is probably beyond the scope of Twitter.' - ) + "I liked it and only thought some of it was a bit silly. But analysis " + "beyond that is probably beyond the scope of Twitter." + ), ) @@ -217,11 +215,11 @@ def test_urls_in_archived_tweets(self): self.assertEqual( tweet_html, ( - 'Made a little Twitter thing: ' + "Made a little Twitter thing: " '' - 'http://www.gyford.com/phil/writing/2006/12/02/quick_twitter.php' - ) + "http://www.gyford.com/phil/writing/2006/12/02/quick_twitter.php" + ), ) def test_urls_with_no_media(self): From 203797a51764858a2ae159f7354adc6eda1285bf Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Sun, 13 Feb 2022 12:15:48 +0000 Subject: [PATCH 12/22] Add Version2TweetIngester for 2019-onwards format twitter archives * Added the `Version2TweetIngester` class which collates the twitter user data from three separate archive files, and the tweet data from the single large `tweet.js` file, and passes all that to the saver. We add a note to the user data to make it clear - when it's saved to the database as "raw" data - that it was compiled by this code, and doesn't come directly from the API/archive. * Adjusted the `TweetSaver` class so that it can be passed data about a twitter user separately - the API, and the previous twitter archive, included the user data within each tweet's data. But now, presumably to save space, the individual tweets' JSON don't include the user data. So we now pass the `TweetSaver` the user data as a separate object. * Added tests for the `Version2TwetIngester`. Still to do: * Waiting for an archive of a private twitter account, in order to see what the structure of the `protected-history.js` file is like, so that we can correctly set the privacy status of the account. * Given the 2019+ archive includes media files for the tweets, we may as well import all those in the Ingester as `Media` objects. For #229 --- ditto/twitter/fetch/savers.py | 14 +- ditto/twitter/ingest.py | 157 +++++++++++++++--- .../commands/import_twitter_tweets.py | 22 ++- .../templates/twitter/includes/tweet.html | 1 - tests/twitter/fixtures/ingest/v2/account.js | 12 ++ tests/twitter/fixtures/ingest/v2/profile.js | 13 ++ tests/twitter/fixtures/ingest/v2/tweet.js | 68 ++++++++ tests/twitter/fixtures/ingest/v2/verified.js | 8 + .../fixtures/ingest/v2_no_tweets/account.js | 12 ++ .../fixtures/ingest/v2_no_tweets/profile.js | 13 ++ .../fixtures/ingest/v2_no_tweets/tweet.js | 2 + .../fixtures/ingest/v2_no_tweets/verified.js | 8 + tests/twitter/test_ingest_v1.py | 1 - tests/twitter/test_ingest_v2.py | 89 ++++++++++ tests/twitter/test_management_commands.py | 69 ++++++-- 15 files changed, 440 insertions(+), 49 deletions(-) create mode 100644 tests/twitter/fixtures/ingest/v2/account.js create mode 100644 tests/twitter/fixtures/ingest/v2/profile.js create mode 100644 tests/twitter/fixtures/ingest/v2/tweet.js create mode 100644 tests/twitter/fixtures/ingest/v2/verified.js create mode 100644 tests/twitter/fixtures/ingest/v2_no_tweets/account.js create mode 100644 tests/twitter/fixtures/ingest/v2_no_tweets/profile.js create mode 100644 tests/twitter/fixtures/ingest/v2_no_tweets/tweet.js create mode 100644 tests/twitter/fixtures/ingest/v2_no_tweets/verified.js create mode 100644 tests/twitter/test_ingest_v2.py diff --git a/ditto/twitter/fetch/savers.py b/ditto/twitter/fetch/savers.py index b2775f8..d18a19c 100644 --- a/ditto/twitter/fetch/savers.py +++ b/ditto/twitter/fetch/savers.py @@ -265,7 +265,7 @@ def save_media(self, tweet): return media_count - def save_tweet(self, tweet, fetch_time): + def save_tweet(self, tweet, fetch_time, user_data=None): """Takes a dict of tweet data from the API and creates or updates a Tweet object and its associated User object. @@ -286,15 +286,21 @@ def save_tweet(self, tweet, fetch_time): tweet["created_at"], time_format="%Y-%m-%d %H:%M:%S +0000" ) - user = UserSaver().save_user(tweet["user"], fetch_time) + if user_data is None: + if "user" in tweet: + user_data = tweet["user"] + else: + raise ValueError("No user data found to save tweets with") + + user = UserSaver().save_user(user_data, fetch_time) if "full_text" in tweet: # For new (2016) 'extended' format tweet data. # https://dev.twitter.com/overview/api/upcoming-changes-to-tweets text = tweet["full_text"] # Cuts off any @usernames at the start and a trailing URL at the end: - frm = tweet["display_text_range"][0] - to = tweet["display_text_range"][1] + frm = int(tweet["display_text_range"][0]) + to = int(tweet["display_text_range"][1]) title = text[frm:to] else: # Older 'classic' format tweet data. diff --git a/ditto/twitter/ingest.py b/ditto/twitter/ingest.py index 5074c81..f266aef 100644 --- a/ditto/twitter/ingest.py +++ b/ditto/twitter/ingest.py @@ -46,7 +46,9 @@ def ingest(self, directory): """Import all the tweet data and create/update the tweets.""" self._load_data(directory) + self._save_tweets() + if self.tweet_count > 0: return { "success": True, @@ -62,30 +64,20 @@ def ingest(self, directory): } def _load_data(self, directory): + """ + Child classes must implement their own _load_data() method. + + It should populate self.tweets_data with a list of dicts, each + one being data about a single tweet. + + And it should set self.file_count to be the number of JS files + we import the data from. + """ raise NotImplementedError( "Child classes of TweetImporter must implement their own " "_load_data() method." ) - def _get_data_from_file(self, filepath): - """Looks in a file, parses its JSON, and adds a dict of data about - each tweet found to self.tweets_data. - - Arguments: - filespath -- Absolute path to the file. - """ - f = open(filepath, "r") - lines = f.readlines() - # Remove first line, that contains JavaScript: - lines = lines[1:] - try: - tweets_data = json.loads("".join(lines)) - except ValueError: - raise IngestError("Could not load JSON from %s" % filepath) - else: - self.tweets_data.extend(tweets_data) - f.close() - def _save_tweets(self): """Go through the list of dicts that is self.tweets_data and create/update each tweet in the DB. @@ -99,6 +91,15 @@ def _save_tweets(self): class Version1TweetIngester(TweetIngester): + """ + Used for the old (original?) format of twitter archives, which contained + three files and five folders, including data/js/tweets/ which contained + a .js file for every month, like 2016_02.js. This is what we import + the tweet data from. + + Sometime in 2019, between January and May, the format changed to + what we call version 2. + """ def _load_data(self, directory): """Goes through all the *.js files in `directory` and puts the tweet @@ -111,7 +112,7 @@ def _load_data(self, directory): directory -- The directory to load the files from. Raises: - FetchError -- If the directory is invalid, or there are no .js files, + IngestError -- If the directory is invalid, or there are no .js files, or we can't load JSON from one of the files. """ try: @@ -124,4 +125,118 @@ def _load_data(self, directory): raise IngestError(e) if self.file_count == 0: - raise IngestError("No .js files found in %s" % directory) \ No newline at end of file + raise IngestError("No .js files found in %s" % directory) + + def _get_data_from_file(self, filepath): + """Looks in a file, parses its JSON, and adds a dict of data about + each tweet found to self.tweets_data. + + Arguments: + filespath -- Absolute path to the file. + """ + f = open(filepath, "r") + lines = f.readlines() + # Remove first line, that contains JavaScript: + lines = lines[1:] + try: + tweets_data = json.loads("".join(lines)) + except ValueError as e: + raise IngestError(f"Could not load JSON from {filepath}: {e}") + else: + self.tweets_data.extend(tweets_data) + f.close() + + +class Version2TweetIngester(TweetIngester): + """ + Used for what we call the version 2 format of twitter archive, which + was introduced sometime between January and May of 2019. + + It contains two directories - assets and data - and a "Your archive.html" file. + """ + + def __init__(self): + super().__init__() + + # Tweets in this format don't contain data about the user. + # So we create and store that once, in this separate field. + self.user_data = {} + + def _load_data(self, directory): + """ + Generate the user data and load all the tweets' data + In this archive format, the tweets contain no data about the user. + So we create a user data dict to use when saving the tweets. + """ + + self.user_data = self._construct_user_data(directory) + + self.tweets_data = self._get_json_from_file(os.path.join(directory, "tweet.js")) + + self.file_count = 1 + + def _save_tweets(self): + """ + Save the tweets with our constructed user data. + """ + if len(self.tweets_data) == 0: + return + + for tweet in self.tweets_data: + # Here we pass in our user_data too, so save_tweet() can use + # that in lieu of the data that is usually within each tweet's data. + TweetSaver().save_tweet(tweet["tweet"], self.fetch_time, self.user_data) + self.tweet_count += 1 + + def _construct_user_data(self, directory): + """ + Make a single dict of data about a user like we'd get from the API. + This data is in several separate files in the download so we need to + piece it together from those. + """ + + account_data = self._get_json_from_file(os.path.join(directory, "account.js")) + + profile_data = self._get_json_from_file(os.path.join(directory, "profile.js")) + + verified_data = self._get_json_from_file(os.path.join(directory, "verified.js")) + + try: + user_data = { + "id": int(account_data[0]["account"]["accountId"]), + "id_str": account_data[0]["account"]["accountId"], + "screen_name": account_data[0]["account"]["username"], + "name": account_data[0]["account"]["accountDisplayName"], + "profile_image_url_https": profile_data[0]["profile"]["avatarMediaUrl"], + "verified": verified_data[0]["verified"]["verified"], + # TODO: + "protected": False, + # So that we don't mistake this for coming from the API when + # we save the JSON: + "ditto_note": ( + "This user data was compiled from separate parts of a " + "downloaded twitter archive by Django Ditto" + ), + } + except KeyError as e: + raise ImportError(f"Error creating user data: {e}") + + return user_data + + def _get_json_from_file(self, filepath): + try: + f = open(filepath) + except OSError as e: + raise ImportError(e) + + lines = f.readlines() + # Remove first line, that contains JavaScript: + lines = ["["] + lines[1:] + + try: + data = json.loads("".join(lines)) + except ValueError as e: + raise IngestError(f"Could not load JSON from {filepath}: {e}") + else: + f.close() + return data diff --git a/ditto/twitter/management/commands/import_twitter_tweets.py b/ditto/twitter/management/commands/import_twitter_tweets.py index 38e175d..e70fa07 100644 --- a/ditto/twitter/management/commands/import_twitter_tweets.py +++ b/ditto/twitter/management/commands/import_twitter_tweets.py @@ -3,7 +3,7 @@ from django.core.management.base import BaseCommand, CommandError -from ...ingest import Version1TweetIngester +from ...ingest import Version1TweetIngester, Version2TweetIngester class Command(BaseCommand): @@ -34,26 +34,34 @@ def add_arguments(self, parser): def handle(self, *args, **options): # Location of the directory holding the tweet JSON files within the # archive: - subpath = "/data/js/tweets" ingester_class = None if options["archive_version"]: if options["archive_version"] == "v1": + # Where the JS files are: + subpath = "/data/js/tweets" ingester_class = Version1TweetIngester + + elif options["archive_version"] in ("v2", None): + # Where the JS files are: + subpath = "/data" + ingester_class = Version2TweetIngester + else: raise CommandError( f"version should be v1 or v2, not '{options['archive_version']}" ) + if options["path"]: if os.path.isdir(options["path"]): - tweets_dir = "%s%s" % (options["path"], subpath) - if os.path.isdir(tweets_dir): - result = ingester_class().ingest(directory=tweets_dir) + js_dir = "%s%s" % (options["path"], subpath) + if os.path.isdir(js_dir): + result = ingester_class().ingest(directory=js_dir) else: raise CommandError( - f"Expected to find a directory at '{tweets_dir}' " - "containing JSON files" + f"Expected to find a directory at '{js_dir}' " + "containing .js file(s)" ) else: raise CommandError(f"Can't find a directory at '{options['path']}'") diff --git a/ditto/twitter/templates/twitter/includes/tweet.html b/ditto/twitter/templates/twitter/includes/tweet.html index c852a51..ac6b68e 100644 --- a/ditto/twitter/templates/twitter/includes/tweet.html +++ b/ditto/twitter/templates/twitter/includes/tweet.html @@ -92,4 +92,3 @@ {% endif %} - diff --git a/tests/twitter/fixtures/ingest/v2/account.js b/tests/twitter/fixtures/ingest/v2/account.js new file mode 100644 index 0000000..ed9567e --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2/account.js @@ -0,0 +1,12 @@ +window.YTD.account.part0 = [ + { + "account" : { + "email" : "phil@gyford.com", + "createdVia" : "web", + "username" : "philgyford", + "accountId" : "12552", + "createdAt" : "2006-11-15T16:55:59.000Z", + "accountDisplayName" : "Phil Gyford" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2/profile.js b/tests/twitter/fixtures/ingest/v2/profile.js new file mode 100644 index 0000000..c3f486c --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2/profile.js @@ -0,0 +1,13 @@ +window.YTD.profile.part0 = [ + { + "profile" : { + "description" : { + "bio" : "Creator of the Bishop of Manchester’s favourite meme // Also @samuelpepys and @todaysguardian", + "website" : "https://t.co/FsYzXrATit", + "location" : "Herefordshire, UK" + }, + "avatarMediaUrl" : "https://pbs.twimg.com/profile_images/1167616130/james_200208_300x300.jpg", + "headerMediaUrl" : "https://pbs.twimg.com/profile_banners/12552/1603038696" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2/tweet.js b/tests/twitter/fixtures/ingest/v2/tweet.js new file mode 100644 index 0000000..954fb1d --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2/tweet.js @@ -0,0 +1,68 @@ +window.YTD.tweet.part0 = [ + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter SMS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "35" + ], + "favorite_count" : "0", + "id_str" : "71534", + "truncated" : false, + "retweet_count" : "0", + "id" : "71534", + "created_at" : "Fri Nov 17 16:47:58 +0000 2006", + "favorited" : false, + "full_text" : "Supermarket so bright hurt my eyes.", + "lang" : "en" + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for iΟS", + "entities" : { + "hashtags" : [ ], + "symbols" : [ ], + "user_mentions" : [ + { + "name" : "Matthew Cobb", + "screen_name" : "matthewcobb", + "indices" : [ + "0", + "12" + ], + "id_str" : "1524781", + "id" : "1524781" + } + ], + "urls" : [ ] + }, + "display_text_range" : [ + "0", + "130" + ], + "favorite_count" : "2", + "in_reply_to_status_id_str" : "1003248782706991104", + "id_str" : "1003256881891168256", + "in_reply_to_user_id" : "1524781", + "truncated" : false, + "retweet_count" : "0", + "id" : "1003256881891168256", + "in_reply_to_status_id" : "1003248782706991104", + "created_at" : "Sun Jun 03 12:47:34 +0000 2018", + "favorited" : false, + "full_text" : "@matthewcobb No, he had not been kept from the office all morning for some years. He does have a roundabout way of putting things.", + "lang" : "en", + "in_reply_to_screen_name" : "matthewcobb", + "in_reply_to_user_id_str" : "1524781" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2/verified.js b/tests/twitter/fixtures/ingest/v2/verified.js new file mode 100644 index 0000000..2b0d9bd --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2/verified.js @@ -0,0 +1,8 @@ +window.YTD.verified.part0 = [ + { + "verified" : { + "accountId" : "12552", + "verified" : false + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_no_tweets/account.js b/tests/twitter/fixtures/ingest/v2_no_tweets/account.js new file mode 100644 index 0000000..ed9567e --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_no_tweets/account.js @@ -0,0 +1,12 @@ +window.YTD.account.part0 = [ + { + "account" : { + "email" : "phil@gyford.com", + "createdVia" : "web", + "username" : "philgyford", + "accountId" : "12552", + "createdAt" : "2006-11-15T16:55:59.000Z", + "accountDisplayName" : "Phil Gyford" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_no_tweets/profile.js b/tests/twitter/fixtures/ingest/v2_no_tweets/profile.js new file mode 100644 index 0000000..c3f486c --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_no_tweets/profile.js @@ -0,0 +1,13 @@ +window.YTD.profile.part0 = [ + { + "profile" : { + "description" : { + "bio" : "Creator of the Bishop of Manchester’s favourite meme // Also @samuelpepys and @todaysguardian", + "website" : "https://t.co/FsYzXrATit", + "location" : "Herefordshire, UK" + }, + "avatarMediaUrl" : "https://pbs.twimg.com/profile_images/1167616130/james_200208_300x300.jpg", + "headerMediaUrl" : "https://pbs.twimg.com/profile_banners/12552/1603038696" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_no_tweets/tweet.js b/tests/twitter/fixtures/ingest/v2_no_tweets/tweet.js new file mode 100644 index 0000000..0e92333 --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_no_tweets/tweet.js @@ -0,0 +1,2 @@ +window.YTD.tweet.part0 = [ +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_no_tweets/verified.js b/tests/twitter/fixtures/ingest/v2_no_tweets/verified.js new file mode 100644 index 0000000..2b0d9bd --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_no_tweets/verified.js @@ -0,0 +1,8 @@ +window.YTD.verified.part0 = [ + { + "verified" : { + "accountId" : "12552", + "verified" : false + } + } +] \ No newline at end of file diff --git a/tests/twitter/test_ingest_v1.py b/tests/twitter/test_ingest_v1.py index 55d645f..6302dbb 100644 --- a/tests/twitter/test_ingest_v1.py +++ b/tests/twitter/test_ingest_v1.py @@ -1,4 +1,3 @@ -# coding: utf-8 from unittest.mock import call, mock_open, patch from django.test import TestCase diff --git a/tests/twitter/test_ingest_v2.py b/tests/twitter/test_ingest_v2.py new file mode 100644 index 0000000..ce6fc28 --- /dev/null +++ b/tests/twitter/test_ingest_v2.py @@ -0,0 +1,89 @@ +import json +import os +from unittest.mock import call, mock_open, patch + +from django.test import TestCase + +from ditto.twitter import factories +from ditto.twitter.ingest import IngestError, Version2TweetIngester +from ditto.twitter.models import Tweet, User + + +# e.g. /path/to/django-ditto/tests/twitter/fixtures/ingest/v2/ +FIXTURES_DIR = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "fixtures", "ingest", "v2" +) +FIXTURES_DIR_NO_TWEETS = os.path.join( + os.path.dirname(os.path.abspath(__file__)), "fixtures", "ingest", "v2_no_tweets" +) + + +class Version2TweetIngesterTestCase(TestCase): + def test_saves_all_tweets(self): + "Saves the tweets to the DB" + ingester = Version2TweetIngester() + ingester.ingest(directory=FIXTURES_DIR) + self.assertEqual(Tweet.objects.count(), 2) + + def test_associates_tweets_with_user(self): + """The tweets should be associated with the user data + We should check, given it's all got from separate files. + """ + ingester = Version2TweetIngester() + ingester.ingest(directory=FIXTURES_DIR) + + tweet = Tweet.objects.first() + user = User.objects.first() + + self.assertEqual(tweet.user, user) + + def test_saves_user_data(self): + "Saves data about the user in each tweet's json" + ingester = Version2TweetIngester() + ingester.ingest(directory=FIXTURES_DIR) + + user = User.objects.get(twitter_id=12552) + raw = json.loads(user.raw) + + self.assertEqual( + raw, + { + "id": 12552, + "id_str": "12552", + "screen_name": "philgyford", + "name": "Phil Gyford", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/1167616130/james_200208_300x300.jpg", # NOQA: E501 + "verified": False, + "protected": False, + "ditto_note": ( + "This user data was compiled from separate parts of a " + "downloaded twitter archive by Django Ditto" + ), + }, + ) + + def test_saves_user_object(self): + "Saves the user object correctly" + ingester = Version2TweetIngester() + ingester.ingest(directory=FIXTURES_DIR) + + user = User.objects.get(twitter_id=12552) + self.assertEqual(user.screen_name, "philgyford") + self.assertEqual(user.is_private, False) + + def test_returns_correctly_on_success(self): + "After successfully importing tweets, returns correct data" + ingester = Version2TweetIngester() + result = ingester.ingest(directory=FIXTURES_DIR) + self.assertTrue(result["success"]) + self.assertEqual(result["tweets"], 2) + self.assertEqual(result["files"], 1) + + def test_returns_correctly_on_success_no_tweets(self): + "No exceptions, but no tweets were imported; is correct data returned?" + ingester = Version2TweetIngester() + result = ingester.ingest(directory=FIXTURES_DIR_NO_TWEETS) + self.assertFalse(result["success"]) + self.assertEqual(result["tweets"], 0) + self.assertEqual(result["files"], 1) + self.assertEqual(result["messages"][0], "No tweets were found") diff --git a/tests/twitter/test_management_commands.py b/tests/twitter/test_management_commands.py index 86a5506..3f1da60 100644 --- a/tests/twitter/test_management_commands.py +++ b/tests/twitter/test_management_commands.py @@ -216,20 +216,13 @@ def test_error_output(self): self.assertIn("Could not fetch @philgyford: It broke", self.out_err.getvalue()) -class ImportTweetsVersion1(TestCase): - "Only testing using archive-version=v1 argument" +class ImportTweets(TestCase): + "Testing failures that aren't specific to v1 or v2 archive-version." def setUp(self): - self.patcher = patch( - "ditto.twitter.management.commands.import_twitter_tweets.Version1TweetIngester.ingest" # noqa: E501 - ) - self.ingest_mock = self.patcher.start() self.out = StringIO() self.out_err = StringIO() - def tearDown(self): - self.patcher.stop() - def test_fails_with_no_args(self): "Fails when no arguments are provided" with self.assertRaises(CommandError): @@ -241,12 +234,58 @@ def test_fails_with_invalid_version(self): "import_twitter_tweets", path="/right/path", archive_version="nope" ) + +class ImportTweetsVersion1(TestCase): + """Only testing using --archive-version=v1 argument + Leaving lots of more generat tests to the ImportTweetsVersion2 class. + """ + + def setUp(self): + self.patcher = patch( + "ditto.twitter.management.commands.import_twitter_tweets.Version1TweetIngester.ingest" # noqa: E501 + ) + self.ingest_mock = self.patcher.start() + self.out = StringIO() + self.out_err = StringIO() + + def tearDown(self): + self.patcher.stop() + + def test_calls_ingest_method(self): + "Calls correct class and method" + with patch("os.path.isdir", return_value=True): + call_command( + "import_twitter_tweets", + path="/right/path", + archive_version="v1", + stdout=self.out, + ) + self.ingest_mock.assert_called_once_with( + directory="/right/path/data/js/tweets" + ) + + +class ImportTweetsVersion2(TestCase): + """Only testing using --archive-version=v2 argument + """ + + def setUp(self): + self.patcher = patch( + "ditto.twitter.management.commands.import_twitter_tweets.Version2TweetIngester.ingest" # noqa: E501 + ) + self.ingest_mock = self.patcher.start() + self.out = StringIO() + self.out_err = StringIO() + + def tearDown(self): + self.patcher.stop() + def test_fails_with_invalid_directory(self): "Test fails with invalid directory" with patch("os.path.isdir", return_value=False): with self.assertRaises(CommandError): call_command( - "import_twitter_tweets", path="/wrong/path", archive_version="v1" + "import_twitter_tweets", path="/wrong/path", archive_version="v2" ) def test_calls_ingest_method(self): @@ -255,11 +294,11 @@ def test_calls_ingest_method(self): call_command( "import_twitter_tweets", path="/right/path", - archive_version="v1", + archive_version="v2", stdout=self.out, ) self.ingest_mock.assert_called_once_with( - directory="/right/path/data/js/tweets" + directory="/right/path/data" ) def test_success_output(self): @@ -269,7 +308,7 @@ def test_success_output(self): call_command( "import_twitter_tweets", path="/right/path", - archive_version="v1", + archive_version="v2", stdout=self.out, ) self.assertIn("Imported 12345 tweets from 21 files", self.out.getvalue()) @@ -281,7 +320,7 @@ def test_success_output_verbosity_0(self): call_command( "import_twitter_tweets", path="/right/path", - archive_version="v1", + archive_version="v2", verbosity=0, stdout=self.out, ) @@ -297,7 +336,7 @@ def test_error_output(self): call_command( "import_twitter_tweets", path="/right/path", - archive_version="v1", + archive_version="v2", stdout=self.out, stderr=self.out_err, ) From 92688fd20f4b6ca9ccb5c1761d71acb5a100c429 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 09:51:19 +0000 Subject: [PATCH 13/22] Add importing of media files when importing Tweets from an archive * The downloaded archive includes all the media files associated with a user's tweets, so we can import them relatively easily. * We import the MP4s Twitter users to display animated GIFs and the image files for JPGs/PNGs. We don't import video files that were uploaded as such because we don't currently include those when fetching media files from the API, so this is to remain consistent. * When we fetch media files for animated GIFs, we fetch both the MP4 and a JPG of it. Although we have the path for both in the tweet data in the archive, only the MP4 is present in the `tweet_media` directory so we only import that. For #229 --- ditto/twitter/ingest.py | 91 ++++++- .../commands/import_twitter_tweets.py | 20 +- ditto/twitter/models.py | 8 + .../fixtures/ingest/v2_with_media/account.js | 12 + .../fixtures/ingest/v2_with_media/profile.js | 13 + .../fixtures/ingest/v2_with_media/tweet.js | 243 ++++++++++++++++++ .../1247471193357275137-EU_oaKjWkAAj6Gv.mp4 | Bin 0 -> 13425 bytes .../1359135226161750021-EtyeQ0FWYAEQDqk.jpg | Bin 0 -> 2846 bytes .../fixtures/ingest/v2_with_media/verified.js | 8 + tests/twitter/test_ingest_v2.py | 51 +++- tests/twitter/test_management_commands.py | 26 +- 11 files changed, 436 insertions(+), 36 deletions(-) create mode 100644 tests/twitter/fixtures/ingest/v2_with_media/account.js create mode 100644 tests/twitter/fixtures/ingest/v2_with_media/profile.js create mode 100644 tests/twitter/fixtures/ingest/v2_with_media/tweet.js create mode 100644 tests/twitter/fixtures/ingest/v2_with_media/tweet_media/1247471193357275137-EU_oaKjWkAAj6Gv.mp4 create mode 100644 tests/twitter/fixtures/ingest/v2_with_media/tweet_media/1359135226161750021-EtyeQ0FWYAEQDqk.jpg create mode 100644 tests/twitter/fixtures/ingest/v2_with_media/verified.js diff --git a/ditto/twitter/ingest.py b/ditto/twitter/ingest.py index f266aef..41a68e1 100644 --- a/ditto/twitter/ingest.py +++ b/ditto/twitter/ingest.py @@ -1,8 +1,11 @@ -# coding: utf-8 import json import os +from urllib.parse import urlparse + +from django.core.files import File from .fetch.savers import TweetSaver +from .models import Media from ..core.utils import datetime_now @@ -37,6 +40,9 @@ def __init__(self): # How mnay tweets we found in all the files: self.tweet_count = 0 + # How many media files we imported: + self.media_count = 0 + # Stores all the imported data from the files before saving. # So that we know we've got through all the files within JSON errors # etc before we begin touching the DB. @@ -47,19 +53,23 @@ def ingest(self, directory): self._load_data(directory) - self._save_tweets() + self._save_tweets(directory) + + self._save_media(directory) if self.tweet_count > 0: return { "success": True, "tweets": self.tweet_count, "files": self.file_count, + "media": self.media_count, } else: return { "success": False, "tweets": 0, "files": self.file_count, + "media": self.media_count, "messages": ["No tweets were found"], } @@ -78,7 +88,7 @@ def _load_data(self, directory): "_load_data() method." ) - def _save_tweets(self): + def _save_tweets(self, directory): """Go through the list of dicts that is self.tweets_data and create/update each tweet in the DB. """ @@ -89,6 +99,12 @@ def _save_tweets(self): TweetSaver().save_tweet(tweet, self.fetch_time) self.tweet_count += 1 + def _save_media(self, directory): + """Save media files. + Not doing anything by default. + """ + pass + class Version1TweetIngester(TweetIngester): """ @@ -153,6 +169,9 @@ class Version2TweetIngester(TweetIngester): was introduced sometime between January and May of 2019. It contains two directories - assets and data - and a "Your archive.html" file. + + This not only saves the Tweet objects but also imports media from the + tweet_media directory, saving it as Media files . """ def __init__(self): @@ -171,11 +190,11 @@ def _load_data(self, directory): self.user_data = self._construct_user_data(directory) - self.tweets_data = self._get_json_from_file(os.path.join(directory, "tweet.js")) + self.tweets_data = self._get_json_from_file(directory, "tweet.js") self.file_count = 1 - def _save_tweets(self): + def _save_tweets(self, directory): """ Save the tweets with our constructed user data. """ @@ -188,6 +207,59 @@ def _save_tweets(self): TweetSaver().save_tweet(tweet["tweet"], self.fetch_time, self.user_data) self.tweet_count += 1 + def _save_media(self, directory): + """ + Save any animated gif's mp4 or an image's file for the saved tweets. + """ + + for t in self.tweets_data: + tweet = t["tweet"] + + if "extended_entities" in tweet and "media" in tweet["extended_entities"]: + for item in tweet["extended_entities"]["media"]: + try: + media_obj = Media.objects.get(twitter_id=int(item["id"])) + except Media.DoesNotExist: + pass + else: + if ( + media_obj.media_type != "video" + and media_obj.has_file is False + ): + # We don't save video files - only image files, and mp4s for # GIFs - and only want to do this if we don't already have a + # file. + + if ( + media_obj.media_type == "animated_gif" + and media_obj.mp4_url + ): + url = media_obj.mp4_url + elif ( + media_obj.media_type == "photo" and media_obj.image_url + ): + url = media_obj.image_url + + if url: + # Work out name of file in the tweet_media directory: + parsed_url = urlparse(url) + filename = os.path.basename(parsed_url.path) + local_filename = f"{tweet['id_str']}-{filename}" + filepath = os.path.join( + directory, "tweet_media", local_filename + ) + + django_file = File(open(filepath, "rb")) + + if media_obj.media_type == "animated_gif": + # When we fetch GIFs we also fetch an image file for + # them. But their images aren't included in the + # downloaded archive so we'll make do without here. + media_obj.mp4_file.save(filename, django_file) + self.media_count += 1 + elif media_obj.media_type == "photo": + media_obj.image_file.save(filename, django_file) + self.media_count += 1 + def _construct_user_data(self, directory): """ Make a single dict of data about a user like we'd get from the API. @@ -195,11 +267,11 @@ def _construct_user_data(self, directory): piece it together from those. """ - account_data = self._get_json_from_file(os.path.join(directory, "account.js")) + account_data = self._get_json_from_file(directory, "account.js") - profile_data = self._get_json_from_file(os.path.join(directory, "profile.js")) + profile_data = self._get_json_from_file(directory, "profile.js") - verified_data = self._get_json_from_file(os.path.join(directory, "verified.js")) + verified_data = self._get_json_from_file(directory, "verified.js") try: user_data = { @@ -223,7 +295,8 @@ def _construct_user_data(self, directory): return user_data - def _get_json_from_file(self, filepath): + def _get_json_from_file(self, directory, filepath): + filepath = os.path.join(directory, filepath) try: f = open(filepath) except OSError as e: diff --git a/ditto/twitter/management/commands/import_twitter_tweets.py b/ditto/twitter/management/commands/import_twitter_tweets.py index e70fa07..b8c35cd 100644 --- a/ditto/twitter/management/commands/import_twitter_tweets.py +++ b/ditto/twitter/management/commands/import_twitter_tweets.py @@ -37,18 +37,18 @@ def handle(self, *args, **options): ingester_class = None + # For v2, the default: + # Where the JS files are: + subpath = "/data" + ingester_class = Version2TweetIngester + if options["archive_version"]: if options["archive_version"] == "v1": # Where the JS files are: subpath = "/data/js/tweets" ingester_class = Version1TweetIngester - elif options["archive_version"] in ("v2", None): - # Where the JS files are: - subpath = "/data" - ingester_class = Version2TweetIngester - - else: + elif options["archive_version"] != "v2": raise CommandError( f"version should be v1 or v2, not '{options['archive_version']}" ) @@ -68,8 +68,8 @@ def handle(self, *args, **options): else: raise CommandError( ( - "Specify the location of the archive, " - "e.g. --path=/Path/To/1234567890_abcdefg12345" + "Specify the location of the archive directory, " + "e.g. --path=/path/to/twitter-2022-01-31-abcdef123456" ) ) @@ -77,10 +77,12 @@ def handle(self, *args, **options): if result["success"]: tweetnoun = "tweet" if result["tweets"] == 1 else "tweets" filenoun = "file" if result["files"] == 1 else "files" + mediafilenoun = "file" if result["media"] == 1 else "files" self.stdout.write( f"Imported {result['tweets']} {tweetnoun} from " - f"{result['files']} {filenoun}" + f"{result['files']} {filenoun}, " + f"and {result['media']} media {mediafilenoun}" ) else: diff --git a/ditto/twitter/models.py b/ditto/twitter/models.py index 3a9cf2f..a236fb1 100644 --- a/ditto/twitter/models.py +++ b/ditto/twitter/models.py @@ -235,6 +235,14 @@ class Meta: verbose_name = "Media item" verbose_name_plural = "Media items" + @property + def has_file(self): + "Do we have a file saved at all?" + if self.image_file.name or self.mp4_file.name: + return True + else: + return False + @property def thumbnail_w(self): "Because we usually actually want 150, not whatever thumb_w is." diff --git a/tests/twitter/fixtures/ingest/v2_with_media/account.js b/tests/twitter/fixtures/ingest/v2_with_media/account.js new file mode 100644 index 0000000..ed9567e --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_with_media/account.js @@ -0,0 +1,12 @@ +window.YTD.account.part0 = [ + { + "account" : { + "email" : "phil@gyford.com", + "createdVia" : "web", + "username" : "philgyford", + "accountId" : "12552", + "createdAt" : "2006-11-15T16:55:59.000Z", + "accountDisplayName" : "Phil Gyford" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_with_media/profile.js b/tests/twitter/fixtures/ingest/v2_with_media/profile.js new file mode 100644 index 0000000..c3f486c --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_with_media/profile.js @@ -0,0 +1,13 @@ +window.YTD.profile.part0 = [ + { + "profile" : { + "description" : { + "bio" : "Creator of the Bishop of Manchester’s favourite meme // Also @samuelpepys and @todaysguardian", + "website" : "https://t.co/FsYzXrATit", + "location" : "Herefordshire, UK" + }, + "avatarMediaUrl" : "https://pbs.twimg.com/profile_images/1167616130/james_200208_300x300.jpg", + "headerMediaUrl" : "https://pbs.twimg.com/profile_banners/12552/1603038696" + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_with_media/tweet.js b/tests/twitter/fixtures/ingest/v2_with_media/tweet.js new file mode 100644 index 0000000..4209cb3 --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_with_media/tweet.js @@ -0,0 +1,243 @@ +window.YTD.tweet.part0 = [ + { + "tweet" : { + "retweeted" : false, + "source" : "Tweetbot for Mac", + "entities" : { + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/piSTKg40ct", + "expanded_url" : "http://Dropbox.com", + "display_url" : "Dropbox.com", + "indices" : [ + "109", + "132" + ] + } + ], + "symbols" : [ ], + "media" : [ + { + "expanded_url" : "https://twitter.com/philgyford/status/1247471193357275137/photo/1", + "indices" : [ + "237", + "260" + ], + "url" : "https://t.co/DcKCkNekxp", + "media_url" : "http://pbs.twimg.com/tweet_video_thumb/EU_oaKjWkAAj6Gv.jpg", + "id_str" : "1247471158011793408", + "id" : "1247471158011793408", + "media_url_https" : "https://pbs.twimg.com/tweet_video_thumb/EU_oaKjWkAAj6Gv.jpg", + "sizes" : { + "small" : { + "w" : "250", + "h" : "330", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "medium" : { + "w" : "250", + "h" : "330", + "resize" : "fit" + }, + "large" : { + "w" : "250", + "h" : "330", + "resize" : "fit" + } + }, + "type" : "photo", + "display_url" : "pic.twitter.com/DcKCkNekxp" + } + ], + "hashtags" : [ ] + }, + "display_text_range" : [ + "0", + "260" + ], + "favorite_count" : "1", + "id_str" : "1247471193357275137", + "truncated" : false, + "retweet_count" : "0", + "id" : "1247471193357275137", + "possibly_sensitive" : false, + "created_at" : "Tue Apr 07 10:28:04 +0000 2020", + "favorited" : false, + "full_text" : "The good thing is that once I've finished the laborious process of downloading 39 separate shared folders on https://t.co/piSTKg40ct, the day can only get better.\n\nThe weirdly-changing top-level navigation is the least confusing aspect. https://t.co/DcKCkNekxp", + "lang" : "en", + "extended_entities" : { + "media" : [ + { + "expanded_url" : "https://twitter.com/philgyford/status/1247471193357275137/photo/1", + "indices" : [ + "237", + "260" + ], + "url" : "https://t.co/DcKCkNekxp", + "media_url" : "http://pbs.twimg.com/tweet_video_thumb/EU_oaKjWkAAj6Gv.jpg", + "id_str" : "1247471158011793408", + "video_info" : { + "aspect_ratio" : [ + "25", + "33" + ], + "variants" : [ + { + "bitrate" : "0", + "content_type" : "video/mp4", + "url" : "https://video.twimg.com/tweet_video/EU_oaKjWkAAj6Gv.mp4" + } + ] + }, + "id" : "1247471158011793408", + "media_url_https" : "https://pbs.twimg.com/tweet_video_thumb/EU_oaKjWkAAj6Gv.jpg", + "sizes" : { + "small" : { + "w" : "250", + "h" : "330", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "medium" : { + "w" : "250", + "h" : "330", + "resize" : "fit" + }, + "large" : { + "w" : "250", + "h" : "330", + "resize" : "fit" + } + }, + "type" : "animated_gif", + "display_url" : "pic.twitter.com/DcKCkNekxp" + } + ] + } + } + }, + { + "tweet" : { + "retweeted" : false, + "source" : "Twitter for iPad", + "entities" : { + "user_mentions" : [ ], + "urls" : [ + { + "url" : "https://t.co/6hPhxAcr9n", + "expanded_url" : "https://twitter.com/peterme/status/1358811736464191488", + "display_url" : "twitter.com/peterme/status…", + "indices" : [ + "179", + "202" + ] + } + ], + "symbols" : [ ], + "media" : [ + { + "expanded_url" : "https://twitter.com/philgyford/status/1359135226161750021/photo/1", + "indices" : [ + "203", + "226" + ], + "url" : "https://t.co/0tWLxyETsw", + "media_url" : "http://pbs.twimg.com/media/EtyeQ0FWYAEQDqk.jpg", + "id_str" : "1359135199255224321", + "id" : "1359135199255224321", + "media_url_https" : "https://pbs.twimg.com/media/EtyeQ0FWYAEQDqk.jpg", + "sizes" : { + "large" : { + "w" : "248", + "h" : "256", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "medium" : { + "w" : "248", + "h" : "256", + "resize" : "fit" + }, + "small" : { + "w" : "248", + "h" : "256", + "resize" : "fit" + } + }, + "type" : "photo", + "display_url" : "pic.twitter.com/0tWLxyETsw" + } + ], + "hashtags" : [ ] + }, + "display_text_range" : [ + "0", + "226" + ], + "favorite_count" : "3", + "id_str" : "1359135226161750021", + "truncated" : false, + "retweet_count" : "0", + "id" : "1359135226161750021", + "possibly_sensitive" : false, + "created_at" : "Tue Feb 09 13:41:04 +0000 2021", + "favorited" : false, + "full_text" : "I don’t know why I’d reveal my age when mentioning this anyway, but I think it was QS Defender, at my friend Simon’s. He had a 16K RAM Pack, if you can imagine such extravagance. https://t.co/6hPhxAcr9n https://t.co/0tWLxyETsw", + "lang" : "en", + "extended_entities" : { + "media" : [ + { + "expanded_url" : "https://twitter.com/philgyford/status/1359135226161750021/photo/1", + "indices" : [ + "203", + "226" + ], + "url" : "https://t.co/0tWLxyETsw", + "media_url" : "http://pbs.twimg.com/media/EtyeQ0FWYAEQDqk.jpg", + "id_str" : "1359135199255224321", + "id" : "1359135199255224321", + "media_url_https" : "https://pbs.twimg.com/media/EtyeQ0FWYAEQDqk.jpg", + "sizes" : { + "large" : { + "w" : "248", + "h" : "256", + "resize" : "fit" + }, + "thumb" : { + "w" : "150", + "h" : "150", + "resize" : "crop" + }, + "medium" : { + "w" : "248", + "h" : "256", + "resize" : "fit" + }, + "small" : { + "w" : "248", + "h" : "256", + "resize" : "fit" + } + }, + "type" : "photo", + "display_url" : "pic.twitter.com/0tWLxyETsw" + } + ] + } + } + } +] \ No newline at end of file diff --git a/tests/twitter/fixtures/ingest/v2_with_media/tweet_media/1247471193357275137-EU_oaKjWkAAj6Gv.mp4 b/tests/twitter/fixtures/ingest/v2_with_media/tweet_media/1247471193357275137-EU_oaKjWkAAj6Gv.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..b9aa006e5bd913e673eb4b03471e01993e50fa59 GIT binary patch literal 13425 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 literal 0 HcmV?d00001 diff --git a/tests/twitter/fixtures/ingest/v2_with_media/tweet_media/1359135226161750021-EtyeQ0FWYAEQDqk.jpg b/tests/twitter/fixtures/ingest/v2_with_media/tweet_media/1359135226161750021-EtyeQ0FWYAEQDqk.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4393be5bc9d95db152a29a8bd30eef841a0b4649 GIT binary patch literal 2846 zcmb_e30PBC7QXLgB?S8dF>Kl zRIREWfUrHhJOBg%;E5hU^$@rM>?{aaEP+HI5J(y%6dH)e3=k?Z3+ij=%wpLLK6rzf zAP^3RBNB*92!thcnkJ3@m!YZ#6e2pTaSUVtUHd*CVF#}C#Med?!5MP%y-0+#f}*kEz9c{hwI%HvzTI6HBzq;)Q3eGxeIDm zCu3vQ0tLtw&&>mi_?!qyuglO_j7ZV!1z;NLW2vx>Q0nMi5wi~8SC=L$&(~nSsQ!&n z-Wz>%JL}N-&&2rtyFT(yIs+5RpGZx@I&$qD$?6ySrOAy{A(~$^1V9)JM8KjModXUm zrNJ010#UT+hAVtDE$w(z8)p%kbs{K9(2Przuq`g zEj@Nc(`V_#-S?)&+q3Jt@=Q^B~b6%nS&}P6iKZf5_DVkY)l=-C0&&6CC zFc9PfftmFEFAw;Qhan$Lo22WH!$ZP2*WjjYHj1ZIVdWv zfu3mTYL5 zD(G(-i}~`zRxN9Pe1na|oVV@8^8BCvN%?xDw{qyYuq7?0&OJ4Bqt>waHF71HWGSw$Od+%ToaxDvH6bUq*s^b6Ul_!X1HZPaK3 zZk-A&^6c&_8%rBu?BU)yxWRGq#7)V5tOdz|V$v^^v^0LKNUqvoV6<$i^={ZQ`|~!| z3JZ@*KE2lkvP>vesYG=VHZ}^2S2Az6lxMka{u(Nf^hP^Ln|Iy&voF_Ry?{c)#Mz!a zNO|a)GNS+78kGh;Q;PK)&NX|cw!3W*b(cw-J&$a4a~E}&EJ*X#uEU`@ZhIRI*5Rkl zICBP9w~5LfT;joP%?t;@pTY(24VJA0{-m6_BmO6nIHa7j{ct+rNl zBdhK~WqE_?0n|6qmTXfhHDd>DG4Xq3&Jr+galdn~WS@TWaJ-7SRQJU0zEW}`Cu_Au zrt)2!uu=0%t7v zKLvZHq$7V?(&s!(5C8)l1`EUUzbp`i;Sv}%0uU>@PeQMyGnXeiR`q60B1)&Q>fih1 z2ee9FuEC3v8eJL18^y_PV>;NhXB@4c!*2}HX-%~itlHMe!Bk0ZJNq2B%D|G3-5Z_1 zk5}NpJayFLhxKxqu*Ey7^-0izJ!bky%oKlTpZ@xGhp&aTPg~4l#Uy!}S1nf1mi{6X zN2m{(YD;h#(-rRJ`NZQt@BE(nfy*L;3S=rm-^RYFLiG$uDw%V;uSXBo@*<0?EcBLY zO;9p9q+J0%`YF!q{JTsxZDJ+5OsqUbtyB2vt}*>VbjEs*uOs9W+>^H#&Z@22G*x=W zW@3k;LmEBdxAfQA4TY=AT()&cn4 literal 0 HcmV?d00001 diff --git a/tests/twitter/fixtures/ingest/v2_with_media/verified.js b/tests/twitter/fixtures/ingest/v2_with_media/verified.js new file mode 100644 index 0000000..2b0d9bd --- /dev/null +++ b/tests/twitter/fixtures/ingest/v2_with_media/verified.js @@ -0,0 +1,8 @@ +window.YTD.verified.part0 = [ + { + "verified" : { + "accountId" : "12552", + "verified" : false + } + } +] \ No newline at end of file diff --git a/tests/twitter/test_ingest_v2.py b/tests/twitter/test_ingest_v2.py index ce6fc28..7657ffa 100644 --- a/tests/twitter/test_ingest_v2.py +++ b/tests/twitter/test_ingest_v2.py @@ -9,20 +9,20 @@ from ditto.twitter.models import Tweet, User -# e.g. /path/to/django-ditto/tests/twitter/fixtures/ingest/v2/ +# e.g. /path/to/django-ditto/tests/twitter/fixtures/ingest FIXTURES_DIR = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "fixtures", "ingest", "v2" -) -FIXTURES_DIR_NO_TWEETS = os.path.join( - os.path.dirname(os.path.abspath(__file__)), "fixtures", "ingest", "v2_no_tweets" + os.path.dirname(os.path.abspath(__file__)), "fixtures", "ingest" ) +FIXTURES_DIR_WITH_TWEETS = os.path.join(FIXTURES_DIR, "v2") +FIXTURES_DIR_NO_TWEETS = os.path.join(FIXTURES_DIR, "v2_no_tweets") +FIXTURES_DIR_WITH_MEDIA = os.path.join(FIXTURES_DIR, "v2_with_media") class Version2TweetIngesterTestCase(TestCase): def test_saves_all_tweets(self): "Saves the tweets to the DB" ingester = Version2TweetIngester() - ingester.ingest(directory=FIXTURES_DIR) + ingester.ingest(directory=FIXTURES_DIR_WITH_TWEETS) self.assertEqual(Tweet.objects.count(), 2) def test_associates_tweets_with_user(self): @@ -30,7 +30,7 @@ def test_associates_tweets_with_user(self): We should check, given it's all got from separate files. """ ingester = Version2TweetIngester() - ingester.ingest(directory=FIXTURES_DIR) + ingester.ingest(directory=FIXTURES_DIR_WITH_TWEETS) tweet = Tweet.objects.first() user = User.objects.first() @@ -40,7 +40,7 @@ def test_associates_tweets_with_user(self): def test_saves_user_data(self): "Saves data about the user in each tweet's json" ingester = Version2TweetIngester() - ingester.ingest(directory=FIXTURES_DIR) + ingester.ingest(directory=FIXTURES_DIR_WITH_TWEETS) user = User.objects.get(twitter_id=12552) raw = json.loads(user.raw) @@ -65,19 +65,41 @@ def test_saves_user_data(self): def test_saves_user_object(self): "Saves the user object correctly" ingester = Version2TweetIngester() - ingester.ingest(directory=FIXTURES_DIR) + ingester.ingest(directory=FIXTURES_DIR_WITH_TWEETS) user = User.objects.get(twitter_id=12552) self.assertEqual(user.screen_name, "philgyford") self.assertEqual(user.is_private, False) + def test_imports_media_files(self): + "It should create Media objects and import their files" + ingester = Version2TweetIngester() + ingester.ingest(directory=FIXTURES_DIR_WITH_MEDIA) + + # animated_gif + tweet = Tweet.objects.get(twitter_id=1247471193357275137) + media = tweet.media.first() + self.assertEqual(media.media_type, "animated_gif") + self.assertEqual(media.mp4_file.name, "twitter/media/j6/Gv/EU_oaKjWkAAj6Gv.mp4") + self.assertTrue(os.path.isfile(media.mp4_file.path)) + + # image + tweet = Tweet.objects.get(twitter_id=1359135226161750021) + media = tweet.media.first() + self.assertEqual(media.media_type, "photo") + self.assertEqual( + media.image_file.name, "twitter/media/QD/qk/EtyeQ0FWYAEQDqk.jpg" + ) + self.assertTrue(os.path.isfile(media.image_file.path)) + def test_returns_correctly_on_success(self): "After successfully importing tweets, returns correct data" ingester = Version2TweetIngester() - result = ingester.ingest(directory=FIXTURES_DIR) + result = ingester.ingest(directory=FIXTURES_DIR_WITH_TWEETS) self.assertTrue(result["success"]) self.assertEqual(result["tweets"], 2) self.assertEqual(result["files"], 1) + self.assertEqual(result["media"], 0) def test_returns_correctly_on_success_no_tweets(self): "No exceptions, but no tweets were imported; is correct data returned?" @@ -86,4 +108,13 @@ def test_returns_correctly_on_success_no_tweets(self): self.assertFalse(result["success"]) self.assertEqual(result["tweets"], 0) self.assertEqual(result["files"], 1) + self.assertEqual(result["media"], 0) self.assertEqual(result["messages"][0], "No tweets were found") + + def test_returns_correctly_on_success_with_media_files(self): + ingester = Version2TweetIngester() + result = ingester.ingest(directory=FIXTURES_DIR_WITH_MEDIA) + self.assertTrue(result["success"]) + self.assertEqual(result["tweets"], 2) + self.assertEqual(result["files"], 1) + self.assertEqual(result["media"], 2) diff --git a/tests/twitter/test_management_commands.py b/tests/twitter/test_management_commands.py index 3f1da60..952af42 100644 --- a/tests/twitter/test_management_commands.py +++ b/tests/twitter/test_management_commands.py @@ -266,8 +266,7 @@ def test_calls_ingest_method(self): class ImportTweetsVersion2(TestCase): - """Only testing using --archive-version=v2 argument - """ + """Only testing using --archive-version=v2 argument""" def setUp(self): self.patcher = patch( @@ -297,13 +296,16 @@ def test_calls_ingest_method(self): archive_version="v2", stdout=self.out, ) - self.ingest_mock.assert_called_once_with( - directory="/right/path/data" - ) + self.ingest_mock.assert_called_once_with(directory="/right/path/data") def test_success_output(self): """Outputs the correct response if ingesting succeeds""" - self.ingest_mock.return_value = {"success": True, "tweets": 12345, "files": 21} + self.ingest_mock.return_value = { + "success": True, + "tweets": 12345, + "files": 1, + "media": 345, + } with patch("os.path.isdir", return_value=True): call_command( "import_twitter_tweets", @@ -311,11 +313,19 @@ def test_success_output(self): archive_version="v2", stdout=self.out, ) - self.assertIn("Imported 12345 tweets from 21 files", self.out.getvalue()) + self.assertIn( + "Imported 12345 tweets from 1 file, and 345 media files", + self.out.getvalue(), + ) def test_success_output_verbosity_0(self): """Outputs nothing if ingesting succeeds""" - self.ingest_mock.return_value = {"success": True, "tweets": 12345, "files": 21} + self.ingest_mock.return_value = { + "success": True, + "tweets": 12345, + "files": 1, + "media": 345, + } with patch("os.path.isdir", return_value=True): call_command( "import_twitter_tweets", From 2eeec0a8cbd7cde2d7c6130adb33702609028af8 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 10:21:30 +0000 Subject: [PATCH 14/22] Alter versbose names of Twitter API key fields To be in sync with what they're called on Twitter these days. And change link to Twitter developer portal. --- ditto/twitter/admin.py | 2 +- ...057_alter_account_access_token_and_more.py | 33 +++++++++++++++++++ ditto/twitter/models.py | 12 ++++--- 3 files changed, 42 insertions(+), 5 deletions(-) create mode 100644 ditto/twitter/migrations/0057_alter_account_access_token_and_more.py diff --git a/ditto/twitter/admin.py b/ditto/twitter/admin.py index dd2754c..abddfe6 100644 --- a/ditto/twitter/admin.py +++ b/ditto/twitter/admin.py @@ -29,7 +29,7 @@ class AccountAdmin(admin.ModelAdmin): ), "description": ( "Keys and secrets require creation of an app at " - 'apps.twitter.com' + 'developer.twitter.com/portal' ), }, ), diff --git a/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py b/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py new file mode 100644 index 0000000..c4fd2ad --- /dev/null +++ b/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py @@ -0,0 +1,33 @@ +# Generated by Django 4.0.2 on 2022-02-14 10:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('twitter', '0056_add_count_index'), + ] + + operations = [ + migrations.AlterField( + model_name='account', + name='access_token', + field=models.CharField(blank=True, max_length=255, verbose_name='Access Token'), + ), + migrations.AlterField( + model_name='account', + name='access_token_secret', + field=models.CharField(blank=True, max_length=255, verbose_name='Access Token Secret'), + ), + migrations.AlterField( + model_name='account', + name='consumer_key', + field=models.CharField(blank=True, max_length=255, verbose_name='API Key'), + ), + migrations.AlterField( + model_name='account', + name='consumer_secret', + field=models.CharField(blank=True, max_length=255, verbose_name='API Key Secret'), + ), + ] diff --git a/ditto/twitter/models.py b/ditto/twitter/models.py index a236fb1..1d879db 100644 --- a/ditto/twitter/models.py +++ b/ditto/twitter/models.py @@ -32,13 +32,17 @@ class Account(TimeStampedModelMixin, models.Model): null=False, blank=True, max_length=255, - help_text="(API Key) From https://apps.twitter.com", + verbose_name="API Key", ) consumer_secret = models.CharField( - null=False, blank=True, max_length=255, help_text="(API Secret)" + null=False, blank=True, max_length=255, verbose_name="API Key Secret" + ) + access_token = models.CharField( + null=False, blank=True, max_length=255, verbose_name="Access Token" + ) + access_token_secret = models.CharField( + null=False, blank=True, max_length=255, verbose_name="Access Token Secret" ) - access_token = models.CharField(null=False, blank=True, max_length=255) - access_token_secret = models.CharField(null=False, blank=True, max_length=255) last_recent_id = models.BigIntegerField( null=True, blank=True, From 80152834330b220afe5465355bddfdf873f9424c Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 10:46:49 +0000 Subject: [PATCH 15/22] Add a bit of logging for when an API call fails I'm sure this isn't an ideal way, but it's better than not doing anything which is what was happening before. --- devproject/devproject/settings.py | 4 ++++ ditto/twitter/models.py | 21 ++++++++++++++++++--- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/devproject/devproject/settings.py b/devproject/devproject/settings.py index 646a087..e907017 100644 --- a/devproject/devproject/settings.py +++ b/devproject/devproject/settings.py @@ -113,6 +113,10 @@ def get_env_variable(var_name, default=None): "handlers": ["console"], "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"), }, + "ditto": { + "handlers": ["console"], + "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"), + }, "ditto.management_commands": { "handlers": ["console"], "level": os.getenv("DJANGO_LOG_LEVEL", "INFO"), diff --git a/ditto/twitter/models.py b/ditto/twitter/models.py index 1d879db..6a8c96a 100644 --- a/ditto/twitter/models.py +++ b/ditto/twitter/models.py @@ -1,4 +1,6 @@ # coding: utf-8 +import json +import logging import os try: @@ -17,7 +19,8 @@ from .utils import htmlify_description, htmlify_tweet from ..core.models import DiffModelMixin, DittoItemModel, TimeStampedModelMixin -import json + +logger = logging.getLogger("ditto") class Account(TimeStampedModelMixin, models.Model): @@ -63,8 +66,20 @@ class Account(TimeStampedModelMixin, models.Model): def save(self, *args, **kwargs): if self.user is None: - self.updateUserFromTwitter() - # Quietly ignoring errors. Sorry. + result = self.updateUserFromTwitter() + + # It would be nice to make this more visible, but not sure how to + # given we don't have access to a request at this point. + if "success" in result and result["success"] is False: + if "messages" in result: + messages = ", ".join(result["messages"]) + else: + messages = "" + logger.error( + "There was an error while trying to update the User data from " + f"the Twitter API: {messages}" + ) + super().save(*args, **kwargs) def __str__(self): From ebf375ca1eb7e5b0c82277b4ff5316ab0bdd2689 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:10:31 +0000 Subject: [PATCH 16/22] Don't add the `protected` info to the user data when importing tweet data (a) because we can't get it from the downloaded archive https://twittercommunity.com/t/download-archive-does-not-include-current-protected-status/166622 and (b) because that value should be set when saving the Account object, which fetches the User data from Twitter before the import. For #229 --- ditto/twitter/ingest.py | 2 -- tests/twitter/test_ingest_v2.py | 1 - 2 files changed, 3 deletions(-) diff --git a/ditto/twitter/ingest.py b/ditto/twitter/ingest.py index 41a68e1..663fc66 100644 --- a/ditto/twitter/ingest.py +++ b/ditto/twitter/ingest.py @@ -281,8 +281,6 @@ def _construct_user_data(self, directory): "name": account_data[0]["account"]["accountDisplayName"], "profile_image_url_https": profile_data[0]["profile"]["avatarMediaUrl"], "verified": verified_data[0]["verified"]["verified"], - # TODO: - "protected": False, # So that we don't mistake this for coming from the API when # we save the JSON: "ditto_note": ( diff --git a/tests/twitter/test_ingest_v2.py b/tests/twitter/test_ingest_v2.py index 7657ffa..119fc30 100644 --- a/tests/twitter/test_ingest_v2.py +++ b/tests/twitter/test_ingest_v2.py @@ -54,7 +54,6 @@ def test_saves_user_data(self): "name": "Phil Gyford", "profile_image_url_https": "https://pbs.twimg.com/profile_images/1167616130/james_200208_300x300.jpg", # NOQA: E501 "verified": False, - "protected": False, "ditto_note": ( "This user data was compiled from separate parts of a " "downloaded twitter archive by Django Ditto" From dd90c1f8dcf6325d47a20da153ec7a52bfc3b191 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:14:05 +0000 Subject: [PATCH 17/22] Update Twitter documentation * To account for new procedures for setting up a Twitter App and applying for Extended Permissions, which are required to access the v1.1 API * And to document the two versions of the import management command. For #229 --- docs/services/twitter.rst | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/docs/services/twitter.rst b/docs/services/twitter.rst index 5b3854a..7a8dc07 100644 --- a/docs/services/twitter.rst +++ b/docs/services/twitter.rst @@ -8,13 +8,15 @@ You can fetch, store and display data about your own Tweets and Liked Tweets for Set-up ****** -Go to https://apps.twitter.com/ and create a new Application for your Twitter account. You can leave the 'Callback URL' field empty. +Go to https://developer.twitter.com/portal. You'll need to sign up for a Developer Account, and then create a new App for your Twitter account. Note down the three credentials it says that you should note down. -When viewing the Application Settings, click 'manage keys and access tokens'. +When viewing your App's details, click the "Edit" button, then the "Keys and tokens" tab. -On the next screen click the 'Create my access token' button. +In the "Access Token and Secret" section, tap the "Generate" button. Make a note of the Access Token and Access Token Secret. -Now, go to the Django admin, and add a new ``Account`` in the Twitter app. Copy the Consumer Key, Consumer Secret, Access Token and Access Token Secret from Twitter into the Django admin (ignore the other fields), and save the account. A new ``User`` object will be created, reflecting the Twitter user your API credentials are associated with. +Django Ditto currently uses the v1.1 Twitter API rather than the latest v2. Unfortunately, accessing v1.1 requires that you apply for "Elevated" access before the API calls used will work. You can do that here: https://developer.twitter.com/en/portal/products/elevated You will then need to wait for approval. + +Once you have that, go to the Django admin, and add a new ``Account`` in the Twitter app. Copy the API Key, API Key Secret, Access Token and Access Token Secret from your Twitter App into the Django admin (ignore the other fields), and save the account. A new ``User`` object will be created, reflecting the Twitter user your API credentials are associated with. If it's worked your Account should have a title like **@philgyford** instead of a number like **1**. Once this is done you'll need to import a downloaded archive of Tweets, and/or fetch Tweets from the Twitter API. See :ref:`twitter-management-commands` below. @@ -253,13 +255,21 @@ Management commands Import Tweets ============= -If you have more than 3,200 Tweets, you can only include older Tweets by downloading your archive and importing it. To do so, request your archive at https://twitter.com/settings/account . When you've downloaded it, do: +If you have more than 3,200 Tweets, you can only include older Tweets by downloading your archive and importing it. To do so, request your archive at https://twitter.com/settings/download_your_data . When you've downloaded it, do: .. code-block:: shell - $ ./manage.py import_twitter_tweets --path=/Users/phil/Downloads/12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66 + $ ./manage.py import_twitter_tweets --path=/path/to/twitter-2022-01-31-123456abcdef + +using the correct path to the directory you've downloaded and unzipped (in this case, the unzipped directory is ``twitter-2022-01-031-123456abcdef``). This will import all of the Tweets found in the archive and all of the images and animated GIFs' MP4 files (other videos aren't currently imported). -using the correct path to the directory you've downloaded and unzipped (in this case, the unzipped directory is ``12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66``). This will import all of the Tweets found in the archive. +**NOTE:** If you have an archive of data you downloaded before sometime in early 2019 it will be a different format. You can tell because the folder will contain five directories, and three files: ``index.html``, ``README.txt``, and ``tweets.csv``. If you want to import an archive in this format add the `--archive-version=v1` argument: + +.. code-block:: shell + + $ ./manage.py import_twitter_tweets --archive-version=v1 --path=/path/to/123456_abcdef + +using the correct path to the directory (in this case, the unzipped directory is ``123456_abcdef``). This will import Tweet data but no images etc, because these files weren't included in the older archive format. Update Tweets ============= @@ -423,4 +433,3 @@ Fetch Accounts $ ./manage.py fetch_twitter_accounts I don't think this is needed now. - From ce22222b9a063044cc5909aa408d728e3430cc08 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:25:56 +0000 Subject: [PATCH 18/22] Fix errors found after running tests * Make passing "private" in when saving Twitter User data optional (because it's not in the downloaded archive of data) * Cope with the fact some idiot (me) decided to pass either a dict *or* a boolean from a method. For #229 --- ditto/twitter/fetch/savers.py | 4 +++- ditto/twitter/models.py | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/ditto/twitter/fetch/savers.py b/ditto/twitter/fetch/savers.py index d18a19c..51783a4 100644 --- a/ditto/twitter/fetch/savers.py +++ b/ditto/twitter/fetch/savers.py @@ -59,7 +59,6 @@ def save_user(self, user, fetch_time, download_avatar=True): "raw": raw_json, "screen_name": user["screen_name"], "name": user["name"], - "is_private": user["protected"], "is_verified": user["verified"], "profile_image_url_https": user["profile_image_url_https"], } @@ -67,6 +66,9 @@ def save_user(self, user, fetch_time, download_avatar=True): # When ingesting tweets there are lots of fields the 'user' element # doesn't have, compared to the API: + if "protected" in user: + defaults["is_private"] = user["protected"] + if "created_at" in user: defaults["created_at"] = self._api_time_to_datetime(user["created_at"]) diff --git a/ditto/twitter/models.py b/ditto/twitter/models.py index 6a8c96a..8662c32 100644 --- a/ditto/twitter/models.py +++ b/ditto/twitter/models.py @@ -70,7 +70,11 @@ def save(self, *args, **kwargs): # It would be nice to make this more visible, but not sure how to # given we don't have access to a request at this point. - if "success" in result and result["success"] is False: + if ( + type(result) is dict + and "success" in result + and result["success"] is False + ): if "messages" in result: messages = ", ".join(result["messages"]) else: From b71dc446fca8d688b4b707c6316573196646e662 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:27:16 +0000 Subject: [PATCH 19/22] Update name of changelog --- docs/development.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/development.rst b/docs/development.rst index bd07373..1310c82 100644 --- a/docs/development.rst +++ b/docs/development.rst @@ -98,7 +98,7 @@ Set version number in ``ditto/__init__.py``. Rebuild documentation (which includes the version number). -Ensure ``CHANGES.rst`` is up-to-date for new version. +Ensure ``CHANGELOG.md`` is up-to-date for new version. Commit changes to git. From 6f6e0aa48e85bed53263d42b9a325ab93104a344 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:27:32 +0000 Subject: [PATCH 20/22] Update for v2.0.0 release --- CHANGELOG.md | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 614fd2b..83295c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,14 +4,22 @@ Changelog (Django Ditto) Unreleased ---------- +- None + + +2.0.0 - 2022-02-14 +------------------ + - **Backwards incompatible:** Drop support for Django 2.2 and 3.1. - **Backwards incompatible:** Requires django-taggit >= v2.0.0 (It changed how `TaggableManager` sets tags: https://github.com/jazzband/django-taggit/blob/master/CHANGELOG.rst#200-2021-11-14 ) -- Add support for Django 4.0 +- Add support for Django 4.0 (#223) + +- Add support for Python 3.10 (#225) -- Add support for Python 3.10 +- Add support for importing the "new" (2019-onwwards) format of downloadable Twitter archive (#229). 1.4.2 - 2021-10-22 From c7cd4ef1e531e2c5501e06cdbd629c19c90c724e Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:29:09 +0000 Subject: [PATCH 21/22] Rebuild documentation for v2.0.0 --- docs/_build/doctrees/development.doctree | Bin 12248 -> 12431 bytes docs/_build/doctrees/environment.pickle | Bin 46927 -> 47929 bytes docs/_build/doctrees/index.doctree | Bin 5500 -> 5629 bytes docs/_build/doctrees/installation.doctree | Bin 21853 -> 22237 bytes docs/_build/doctrees/introduction.doctree | Bin 16906 -> 17411 bytes docs/_build/doctrees/services/flickr.doctree | Bin 68001 -> 69305 bytes docs/_build/doctrees/services/lastfm.doctree | Bin 49728 -> 50987 bytes .../_build/doctrees/services/pinboard.doctree | Bin 28893 -> 29425 bytes docs/_build/doctrees/services/twitter.doctree | Bin 75628 -> 82637 bytes docs/_build/html/.buildinfo | 2 +- docs/_build/html/_sources/development.rst.txt | 2 +- .../html/_sources/services/twitter.rst.txt | 25 +- docs/_build/html/_static/basic.css | 259 ++- docs/_build/html/_static/css/badge_only.css | 2 +- docs/_build/html/_static/css/theme.css | 6 +- docs/_build/html/_static/doctools.js | 19 +- .../html/_static/documentation_options.js | 4 +- docs/_build/html/_static/jquery.js | 6 +- docs/_build/html/_static/js/theme.js | 4 +- docs/_build/html/_static/language_data.js | 6 +- docs/_build/html/_static/pygments.css | 7 +- docs/_build/html/_static/searchtools.js | 78 +- docs/_build/html/_static/underscore-1.13.1.js | 2042 +++++++++++++++++ docs/_build/html/_static/underscore.js | 37 +- docs/_build/html/development.html | 209 +- docs/_build/html/genindex.html | 159 +- docs/_build/html/index.html | 183 +- docs/_build/html/installation.html | 236 +- docs/_build/html/introduction.html | 192 +- docs/_build/html/objects.inv | 5 +- docs/_build/html/search.html | 167 +- docs/_build/html/searchindex.js | 2 +- docs/_build/html/services/flickr.html | 276 +-- docs/_build/html/services/lastfm.html | 250 +- docs/_build/html/services/pinboard.html | 240 +- docs/_build/html/services/twitter.html | 318 +-- 36 files changed, 2977 insertions(+), 1759 deletions(-) create mode 100644 docs/_build/html/_static/underscore-1.13.1.js diff --git a/docs/_build/doctrees/development.doctree b/docs/_build/doctrees/development.doctree index d2345ab9ee23fe6f0596ce289fd8fd3f807e40ab..3e63f21547b7d09b826f7c3a3bba88db98b5ef4a 100644 GIT binary patch literal 12431 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 Ee{RWE-T(jq literal 12248 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 Sh3ZV(`cq%2cSN$}YQ%om5N`Vk$Tx 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 BdNcq4 literal 46927 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 delta 1851 zcmb_dTTB#J7@lF-%ec#+tBYh^xv8O<3zOqy)ZX=3~0dqdJTXrl4KCl&hE7hjCgJ~h>crjJ^U{xg6s>*9rUk~5jf`Oo)% z-+wz#c05j2oh|?2>zLp@j;!gbZDoheRDNS~83_4ILKO0o&G`DYNsc-JL!l&Raaapt z{^9Ac3~>m92tL@vbn##?k@nexAh22SyclDL%Dz3b8!dJ%Sad<6%N|r<^AvvvYBL<_ zac#l14cGPzx1kYsz$QpSBJE!ScHx|ms*f1Dozpnujpw*~-VXr?X1G&n8j#J6rxZ=g z=^8P)6SQ>IqJ((1+Y60X^bB#9^>z9VLpQtP>#uc*v@H?|A(4a2S+ftyt4rC4)bZQZe zL;o~C@DpIrjT|G(muaB+JYldauS{7RKk7_Mn!?$3C>lOE**9?r0=|Lx~?yy z%S+Eoaix}HeNx|^Mwmt8qHtX-s?{q?|IQ5iH@KetBVDK~O#)leXVWZqy4gqJ7<()o zc$dSCDGqaR_c^scUQcabxVx$(HG%yUPT_Ew57!@#!-JRNTF{t|G(IxiVj7A{xDzrc zF|l=sH)sA{t~s5;hP}_;k2D~1TO{_`H~htziNk-d@&XUxksI@3$UPq9wMace{u!zJ zFg_%Sg0LE-CJ*V83Kxk~xJVmUiL}>4x>-?+NPkt-w8w|GtrBUUJxCVkDeIK${oX8R zrrgj`FwG^5vTtGdds7`Rhm~p(>n338HpNsy62r-E%e|sJ+f@0Zxb--4bYw!QP6x0P zbS;}Z#T|d|k&a#axs&iV*l%mASzz5GG0DW}7Dl4C*w$!rwsn2GnB0%&hwu&)Oh?Ko zBgC38@S>RFL+(bG3AOm?ZbO*;ykR~P%4!3qrBI8fMRp<9vSE!zRGli`H0^Tb*n_EO D))jv7 diff --git a/docs/_build/doctrees/installation.doctree b/docs/_build/doctrees/installation.doctree index 214d293e4fa1bf5d2ee925f6d4ed89d8d715463d..579af772b430a6e3071a864c0216b9aaf0002c4f 100644 GIT binary patch literal 22237 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 literal 21853 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 F|33sA9*F<| literal 16906 zcmd^HeT*H~RrlBKdUx$ze{Iq{+wr&|@vggXH*!pzCTWOiYU4O{Ok$@kl6gDt&3!vF zo;UL{b7$8}Qxt@t8}+sd^zlc7stO5IRR|;`1SLQlRe*pB2#OFwLP8Yy165S~fvU6; zg5SA!?%a8^@9i7Ak^g8Td3Wc2oclZHo^$Rw_am?F`L+K$zeD~fW}K*%axX}h!pLDs zPwb_F4hwnj^Sy;%=zXd;FD7GqJ&Dq|#d=}~TC`j*aAFqrZuHz8Vj^KJ?nPnV-W_wt z-H98$c~p*Zj|Z$!CH7qkc^o;Z>O<|&Y|k}ziv}#!{!&i@0Kr3IylZ1f-g6JQJKf!4 zJOgw^>aV>{+BF|dyLB^W zZEBN>32v`aRnMJqYwk3S=pGeMFJDhsoGf?2|MJy1^1(R1P!xrBuNhuo4ffTXyJJ0J`S2Sh8eYYFkOvVX}+mL@WtUajRqBWM~s6 zY|&a_9oq}6tKiDIxPf6D>q#o%(c{GF)2p&TBNVzcoouLV3D5`JqwZi6XQ1GfQVw@fl@MnD#sAn)B$c0uC!G!lNtg3(^7!)ds>j{5 zNe)H2QZ>u{?vsQ3G88dfE{p{ClX;kPTBvR+SCBbz?ha9v%xArd`P}hX?oWxQe^4Rh zc9=l9E^9f655EWEEt%<~31jtw`0G)-Zr5pvsmqD3a~Jj5MA!3)F4*!pP`DFS0f{XZ z|I5|u_7|(06-5$n zsOHj1%=9^jCqA6U6yF3Ji`Fv~L0Bz2l zL_A6ge=@GVo{zm%522Xlb?j9ped?O$u*hnA0aHz61g8YHL(Dp??S&piuY-YN^*&N+ zvjy^vQIK=M`VWFzw?=@iTLvmc(t9|I`$TnO#JG~ldDpngcQRKwu0&k&eE(3z^XaZ| zWQVmQD@;)CoBqDfH{COMHq|WTQNg$(RB#`rWQ#ZW_o6qzXxn>(zsuI;IjHD2rFu@8 zSuLoa(oXkH?H9DReq9%caix0-dcL&#yLRr_p{1L($n8m0*8Dwavz?5KOYdQ~=I^M` z{%c_9f5DIeIH`t*ij^_mXD}8T8JM!Z<{zyvtTy>0fO&6)_FG}zzrFUCu|I6EkLqa{ zlAUV)nF;_kLr@TZsY3g$42>CUH6fpW(csP+7@Ux-{B9$}9wm=YD^bmcFaZXgGON<-aP}++U2M_-CN_)~H6r)gKqvrGnaDT6xY+ z_)@!LT+RCW`V!K9DqPkp$BV5vYBsSJSo7y&js{Gx*S zJuTkBuDzf^4^*AAf_eV|2FcuhrS8V~WzU-bRf)1%I`%$r_4^gt!%Y0&8_~{hqJiI{ zR*VZH+s}t~0W=@4R-g+n;J;F#-FA-P;gzdi*o3 z1wQ~NnWPJijGfB*n*Sgn-ezNstU@o+H6T1$p*`8@{Uh29wo@A6=!l-$PL-^-m#wx_ zlI?$u&?}-#cKV+c+HGg28!Ok=k>;{OrpHx5U#fR)o$2K6g1r{Sw7!hX7U>aZBcZ$%0H4Wr#MVw0F3{zdRaQ-O6y)tum^*RUK27 z;weN$pK)>|ge@+k1%1dAc_Nc+$z!k)8lyc%-o5BBigS}Y3|mqh>@bQQ$_`^9t1S47 zLeUm?!D$$%oel-mu-mJ&b{8k0sy7tO5$&DS4j^Y0#aJfTkTU3DoSMif7&n zMwMfm6H`WL207Byn*R_GY!_|nmAXg)i}hKZ@7#{$^TnLl?%TCJcZXA{_{;Nt39>F{ zy0G3Cp>I9x@gF5Hg(W`&Hz#&38ClWCfcYA3^h8m6%?Ab=z&Ea@O`JE#?VxV#ts$Vy zP8$|YiYIGTgka%Liba0GS+pqPjKW~U>M9y=42VoopC*V(VI^=K_|*zh2j4GwY#qjP zO&^acqS=>)>nF(*h+o5cM$ECfEs4ny);wjQ8Bu*p#OZip?rVM+STWA-r^zU5{`2(f zww>LBgXa3<&mx0SCv9{oMkWiVlZ~)-+LFSq*Kwoe6lRb-e0|;Cu-c5nr{lC+)}N-! zH>c&KW**Wy&7;%m@NUWaM3l-!BW7JjX$kZ~^(QSzaJ4AcE2T+`7N|=lKm#vUW2}4d zv`wrpaJuWreK-qAktFJDh$syl-0A^LI(sLttx=Mf-oULbMam{llF;tbnf&`4@MpaDY)PgC zd)-on8NE@OQJi$`g%!AV;w6QX88NQrMmx_vG*gDObek?nZRa*&{(hT=Q=`J!&4~pi zoo~JRd2omOBE#p~3??2@oknR0Ij1sv{we_IJxMSnl_+P5zRWn1sZZVkQ~Ue0(hwA- zijnyCkVb2CyLesy_KMV9fM;KP{)#eK#Hezuruf{Wi%U(q!I`g^?-8|pp8c;VXY*zHb=!;9 zg5lVRNF317cwJvqF*oP(y8IGL9$8W3lV63&4(90o$u?JF4u1@bfihMdwPbtcb7Ekf z;rknk@3(G?Z(NV@|1|F*Z^$h5rD6A8!>p>sMc#)+211*A`R$jX^#<763fSM~!`x2F z^l$+nfNgh4;G?)o9c(#(|5qB8?mN$k@vMb`CM#?HzoE^DH7pNd&j8TBRA^6$|3Bv} zlVs^$s@X{zJ5Pb5a`SoC>%VKzW(^EjSy%JFUtw?^Z$APM->uMo6xa`Z)DE%dOBd9k z=A91iI?Is61XmQDEz1i(WtL|5XEo7UF zH+6Y->pVM^H`@83jNN${(~&`>O{g-Y9(?_T*2j&sCTv?KRG!{aS_g1E+Pk<_zAorFBq84t){BugD}^X2|4iC@NfcBjm^d4hHFl zZA_^-CK<~g4i5u$iCuap$4hW+eIrpBbfzm)N<&ntPAMZ@ZzifMD-K&jJVN2*^2&-- zKig_z^QYdF+d%A=jcf3QEZMzV&t+06{>!bBh?LhWz zJ7PbwV{c%;NnY>A7A?#7C#73m!kuOLmduJ!N3YR3O(hA>^+U#0t{ncGN~OM9 z((7u+El>6-fl(ZBcpb5jdNNqg_J)(fvMj4DN4^IrRAYyi`*n;eQXNAZ8R@gJJCYwF~vf zFn)hUsk1mhJR}g53lRn2sVDXact4xM>p|iUzIWk;u{exy4KGp~4))PQ2g7($u;Z;L zY=ccm#B&;5JOlJ@_1tkWW2Zc7m?E*ugHr8x(oVOLD;@+Z3t${9#&Z#xsaaV9>4phS zzbWb_EOnyBtq!Tw0d@e^ z#|fhQvt|vIwBniOOqX>V`O`+JNL13aF*ND6uyl?lWr$nH6S?{7-|f ze5PH1p?B}{ZF*+zuR%$omKU}$)!P0Kkw?H&v;KAmSf|MxnB)e=a&bKk)aF{q8E!V@ zKfRIo1{T z`lkE(rX1yp`<+cWz@{X=DG6^%qMMT76-jI}bx%-tiE&{PR|4Bbx6M6pD*gGNCo zJIyG_6Jcdw)%>v^J1xWc=7~KnmHX>;PC|a{{fb{at8na diff --git a/docs/_build/doctrees/services/flickr.doctree b/docs/_build/doctrees/services/flickr.doctree index 58a303826b2ad25a2f4ec08c03166ae1f9a9f37a..5d517c5c6883140982cc854ad0eae17f693c3f34 100644 GIT binary patch literal 69305 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 diff --git a/docs/_build/doctrees/services/lastfm.doctree b/docs/_build/doctrees/services/lastfm.doctree index 322c4b5f7a2e6be0a64d06430f7635fd2187d75e..44def2c9e9c3ff73358727d39ef2bc0ecad642b4 100644 GIT binary patch literal 50987 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 J^VwS|{eSW%IhFtb literal 49728 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

jR1NUMY1#QRwj**Je>% ze?qRQ8{aiOqfrRI7obU>nc?F~2!+&cz)O%pw+T^@PLABl@wKAx4DA{Ys>6I{+bO^=4Ib0b36DOyA=g#7 z-B@I$rGxX)NC%~$3-;qW2#h$mQ*mSVwkx=4oC{>bd|kI%4w=39df8fwlVf|J<+88lcotw+1P;P{NqD=0b>OKF0; zhZ=`hP#4bLh>?W_HYd6|A%3aI&<_ws${OHR>nj<8lju@DY0UkQS9!N-QhMDQF5!VG zOj|o-*HXL<#{qdsr6Ux#q|`PTJGC01`NjYb8yXF}mSRx3jEg&K;$-+%1{tIqN#n55 zIix=ZA;_mco;D~M(;sKf<78&7W_TCU_&^wrYD%GiF)Z-gA0cA(&;CV(1N8lmLLZS!qUXK%Bhh6k~xG1 z0|&tht-N*{T^bS*D+WmS46wAJoO0TG$1S<35F$1=N7wOQA?F*eM3a?JY zjZ<1Ng^`FGuaSU3KGpkfgIQv#_w+drm&bAJ)461~I(+RN!lXx47^-$J{fW@c3Ua(C zf{LgR1%FEN54`pd89O4^Cv|DeO7eRESRTzflL92E4z9w5Xo_0AwAXV^0*%2;Gw3AH zMHpCVC|HmI2k4>UxOV`K_Z5X>M$=Yzh5Z6W@eGJ&6K6yMc&(fyHCuWRrrS>!g?A@S zw(cYp&k0n^$C&SlF=lKnd+r>vJ760_XDzYG>sxx!$CZUu1oMtcbC`^4QA^pwiAxXS zi)D30{Y34kFu!RCP8KmnSaE`NI=Ear%8XIFcOGMjN`t$!xkj4j?O589>Q&zGT9A zuY&Wuuy!;hU}=hzC?beTcV0-!L?r-M{G~`k+sfGL;9J&C99-ML{zq-Jvv38_i!N|E z5&a&-PT?e6osr1SBZX>UmLx+A^Ml??hy9V^A0?t3Gh2#H=K#LN8V~Yp!PbME6zPUH z#Y@3v8lo|6XHN6t=xyO~YMLbj>$* zO3kvAy;9nrOxY{lbKZdkND2P9msxF?4wNdptMThV4S@a&`jtDRM!TlJrdsf>X%MqW zA48CYHVX02cW?&4Zd$k@OoPSSr_kk`+)pCz`2Gt@sW_yt0n~D@ed%FepX8t#NN%QQbFH56=*t6jerBlhkEUV_0;V?Z_5C>eA zVR{Jsm;jAdY4U1od7m{=MT*T|G1zi2@97ioJAm^-xHOe-Ni2(-L9GLqXJ+uiW+58P zm!Pc(kvSpjQSMI{H?bmnQokU*|4`>)WwO8TeN?AJSEyT;FCVv}XOSCm`7+mgXb}xC zFm6AkJ`Y@$0{guVrcxZdVBMK9-Fm?aCx9oCG+zmKHIbd#Lvl+$oD|pd_rtw)cdg#U zzo3kZ&*?(}m{yU&DK7E*@z~57XGP!sC`B45(p#wz#Z@SR$&DvW6-Tyc+Gw4KVpT?h z*0k!vkQk#7L*EZP&1K67R3VBk#+5U;lOA zz<@YboC%$xn`Eu2s6_Y3tp4Gm&`m`Xq5DBLj+h$?XKfA5UM&jMbhIHGi(eUq36SMu z=nyTX=`^@Ty)9)a5>Xi$1c@z8az@5&u0)t8@K-WOrFDAa2&%r)IEtT2l{b#zX-Iwl zbPQ=tsPG1{@~RCbTvJZpK{33QsD=u*MGLR~patnpTqix~D3Cpx=Ds{`Zz!W#yD#xl zMVQ8yffdI1ZTeNnefc-41zX9uHr`mg{uvpp@zZo<4oh1e1}}X|CU*7!-(6udIQqT} zRW~&l_CT@vG?9!PAafF%oVdh`uTns2rHt8A_GsXtBj`Z-q|FLmxmZEz>n@1_VzSSN zUYUENWpVvujO&P;QFeiqnBjWf8od@aoZf;Ldzk5A`|ofFJ8w9aV9J@S^wW08eq8OpzX za+4CgA^E-}g5rEo1fG$#K(3K`$;k-vopPq;%qnU#2CWaJ`%!;EuvIG*v)%m}Y&Xu* z{c|yvG8V7*nzpf=MZQjBYi;m5v&YfW7v`xAj81}5=0a{bbOkK&A_T~7hm0$jPdK%H z(e-+i_RdLFCF?E~4t|41Q{-iB^Pe&%avW{*nHWh8Gvej!<=u2}btEfSC{LsWBg+M! z85DPSS;ImZc-FBaI_Q_jgir*_YjFJcEfKLl$(R{waL{N)432c@@){gFr}HTQ1zm>0 zkq%W}gX6}cP#u$@zaq?|8DgyFkd8rY^QkI)er}|ydI+j&SR)M>FHKy65u7-7WYE)- ztMTSKQDkAoawKCa#!)O^h!H>&Exbmco@mKL?+O?*WH6){Gc)I*&PBSNB%E2K$j~?o z5&+^e^sA5o^Mq=_2F$;V88E*$+Ky28(+y<|A;NzC$O95l(C{%47nB<;NcRc6;|Kx{ zZ?51wF0vHnA>GXCT)>$@uZ?Xv#0h9K47Z+%L_}Clsxp*%bh@`>J*tj`!8($aX|qn+ zP1<5QkPB18Hp;=~Xe3t8OPihv1Jf<&ES(AkJmX$bN<1(w z9~lG~zmIghb04;RxhU3m=i+^(J;HqT6R^>GG0pD%B3ep4Gidj|o@Vz3UZ)(%IBeSJ zFC$vWC1mUBR|#=K#1+XbF7X}^wj(ZIE~z*m!hqa1F@`AK&|x-8xEO9Dy>oF~33bwA zhkp@JRXoKD^WVu}+;JA>e;s2c!{YzoNqKk#NqC&$MLY8pR91@vuOzWG1h$yo!*6Yr zDMT&y@W3Apxp&Ws)xitDt<{ z>ose1?MtnP14;OtZXJ7tye6Eb8`Ul9M7ZO+G4o4mTh1+B<;L2BsJ;PM8w&Id84fc% zJu`CQ*c+b&DOEFiW;DFah5ON09zTZ0hOswt(ikPRGR9*^XI7d6k3KF`#@fW&l zhVVd92oD!vF+CRUPs-1k8MtE6ktju+D^cAOE7zklrVkXw^k53eF@aE;C(PX>VK(zE zU|$`jgPtd86fpyQ0TvnsixgDM;|(MUdpOh~j&4*cr%pd}?tJ<2rRU2(a;p5UlPAwq zD)aIl8Dubt+|DD=26N}2rtFPFTHp`l8bXsj%-H}aJ&nm3VXeUyN`P5T`L#pu^!PmO z@6I{x1ObcSHG|~P9frg2(qW&dR6t4z>-HnMD~7FA6t)>-Ry5a{r3vulW31mF#aNZd zuBVeeeBHkCG$JF&3`U8>l$ehpioj4J6;+3;qUf;pAWm#*Bu(3JlO2H)A0Ew*2x3T- z3(DKZ z>r3-OIBpNX?%#rHBUE*PxaNP%puKdgX*3oN(*+}1iH)|?#t)}ron&?R6NY2EH+2cF7 z6x*^tq8YYSY;c27i?#&%-xyNT`6&zQbH8jIQUrcq=va2Z`E9qIyNb<-Gd zkC;2ft0CYXQ6~ZJd@}gQXgMkl^PT}2U9?Nw;m==Sldx2A(oJ)2!z^AXs#q(*q zW*r%Yv^w$mO&yPf*=?TVhhe_rUBn$_bk&N5kANbp4lydkq#~XXQ7Emrb8h-7YKA!* zfP8gDzNB5^h%R#K67SD`5k2Hl(lin)>8G-HiSv`$Q0!aVZ#r!dgEFUA5{M)x+BwvK zvG)03Q7XY6Fs^>c%`%z?#_S*gZ>=!Wc3c0iA&djNtFJsG=OK8hhzbd|E%WV_4Y{i?TEnD$M8gKcwY~Q3;UV15ZXCeD|hLDZ3#Q(n- zTWe7eYp39*!L?JBre~DXT9vYP?mmxYSi}$1iOyJ=LcZ~NAPzYHDgDZA9nk9eS=EA8 z&$D~B$Cl4O%e#C=QIDdEog5YZW)&}-$XiWVIK}rZw1OB|OX-$eT1@$a8zM4Rb5~b! zjSgJ}hs8Sj)T8(e2W&BXu9uF8id&$?y-zxn^ad`xzo95UwD9KkkG_mP@+`eH7B9Ug zw`7L&(iUz}hv38%dK6x4UoT3Rl=~^N;S$oW1I%m$L@GduDC?(h6@}~Rm=UlQyl%|h z73e&D9&^WRcU@hOucxHoDtd>iC;=v|#ZwHLv-`Fi3Ubh**`CLuVYP^BImR?%qUNR* z!$oYy=$B*IG2B=lPK{-lG2fQ*F28iKNPYIXH;F-49x2{qS-&HLhsUr*&R!em$od)O z=-yr`S3*wGE3O?Zai58w}(WPSb+b-i8nAH zQWtcEQT<8S2$l)N&<%aNu~IJx8{Rx?N5$}O1G=m(E2h9!h!)Xsk933<_-Z~|La$$l zJNpI?@YQzUrLBs!9# z?^G<(M8p4n0smzMO%c)_CelhoV#fI?oHXMt1Z(N3rv{Lq#0Uw!HOF@(BMTWRNr8QV z@{yVzQdH?C^XPIYgd(@9JB{~G3B3Q>Sa>hQ@s95gE#7UF7KNHCb#Q?Uu~ek}jKhix z3rL*sPksGd8t+p$<7s z9jFHD7@hH!x_&m?L=Ot@#xILW{M1;Jcr1=xd=eLmOyV&)g#}wFM0f&U+xiK-KaQd? zfopsZpVtXoudQ|gVkeM{M2>jAcqF=XG#lTBp=2PMW2ye-?d8(u6-HS2hK;9a+W0NO z9KSghbG$uHxj1t?oRc}EX)W$?w<3{O+_Kqj6spWVzq9r1^I)6^2K#*GbZ`)t)!3`J zk(jOqToAgR7=gDMu;pf#tjBvuP^}_?m3A)Z>e)87BfM(0*QFd*>^zD1(c*bJv9`EG zAy)MI>@$d!}mJto9%EU>D#f0S&2!tDBO&gK-*cTqlq%?6|$5Nf&`;+0C7NN_o%wMq^QoEowX zb=Py@bqP*Xzwr<-aHRVYtE8QVR3FNb9v3-NxaH4uQO@4IJ$#G!RA3qIn22E3@PVo_ z%`@(hZS32FuYMl|41RcHVnw)cs76qVY9>zM6!~@wt1TU@W?-JR>jz(8=Z@gnVYo~? z>d&76Sw_16;iT{N=oZ}iJ%rEpa4+-@0TdMI{i~iAAPDRjFVAcb_xSikBX0LDUt0CLtv*Wj z(q*h2Y}mATA0J)bB1)X5!zE?@QbrYIMVc>-7&TA@S9hHbzTQ@D;x6}Q|IAh4OdS#| zA1A_Vol7og71%+~*QFCRXQj7>{`Rih-8L3~)WCHQEtE{tR=q<=^E<~q$qH1OANC3GPaC>ye>1Yi=uv|?gD_D}t#M_}& z4}y+=d~tDoeI5Q!Q1{ySklfm0&AGUUn*L%xoTV1jBef{Y07^gHh4O_1NA3ez_I6jR z1H({>9_Cg#OyGHtQr8Jqd6;_8YGR1#z+Qm})Pj2d%&zb@FjT9oWJ@WqvfrWUeI>ks zp>f;z^bTPTz9kyfz{tD1_PTn6;9cWyv;%y(MO~uZ4|kHo+7GYxTZkc*U+h7AeYCue zpT%Rj>CrhKrr>RK-Ug`|PFIK(W{mVt8Lcn$Isj%bbWh+0Ade9DSHL7*)orh0s-^tz zCyn6uR^s)paat=*4I;ULvFeT!ptsp7HnuO6otEu3%P`ns-QV4(T^u--FOH6_)XlV z+4xuVVw2FD+NQ>Bl7f z*nuCtaGIbBHaegWf{~4vQ228F50@FBWd>%M0a<1smKlI$9(O~#YwI)hr|Ms?JB(=kn*z&8LYlFpPjLt==>lVcCEYeDu%ru<1eTN` zC$OYkBY`FDn~H^&3<-fH|3z4GyrviKF{Od$b5GTUvZoowq=^#JShAkr1hYic1Ajm! zS}R^t2^d$sexOj*o{sf6El1@>`(yoM@#zM%+RYC36}{OO?t(sz9)vNae+$P!~&KSHai zG=re1$j&*l1Kl=WB_@oScxNU7O1NLGGm>IN$Hvd2x{T)!(k*(P4S)Cv42%nr+ZQC+ zm|&}|q>%lcwEs=}-AWtR2FdfQ8E8xLd@iHj5N#U&7%he=gWUs38Y0DRMG97pGc{W7 Nqm_{?(cVhw{{yL;wkrSt diff --git a/docs/_build/doctrees/services/pinboard.doctree b/docs/_build/doctrees/services/pinboard.doctree index 348dce467d944ef80cb92beea157cc4a5fb6ad7e..4d7e2376b5d05b2110663ced66a789952938d545 100644 GIT binary patch literal 29425 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

<(DfvPmS z<^;QDRpSR)7xp~RDA`sl&|PQg$X?xADa=*RHD&h-%I+SBGV*QTs&a5aela7+gXhFr zVZMBCL9DQ>%1CLdtCMVvRGP?nLF5HhhEzCu*v{XmG&UzZ5~IMc*zw|7V1A`~Oe(|6o11-YKAszqF! z%NsAwuVmV4i1YQBjN_|bwb0~D0fvaQLYAhImEihKt{UWjNQmg#xf`4X%c&*ijkURj+^h~O6olbmoX};8_wAzv(}V|f@mLUyR=FVU-IKG zqD78j|0)C1tRla?Z$(y}Ir(O3@LX>%lWg3u@)T#d5MJJR<^7usR}AGnbq2bNL$@(e z$6YgvpWn-e^zq5AC;ZzjZ|)Y6fb)TL>|kLj8e?lE1eHI|A<)%}4qq#m=E$()1V@pph~N0ORJq^$T_@eC)o7AF%N_&mEAN4w(+8Emyo zFDt2+t1D%GVaU~ve*_%#H-U(ly{cgN#K<1Bkg8Ldg$ zu}n0?hU!kWy@={2=wyFvjzkLhk_|i=O(JYMrAFbv{|T?zYA0pfX@enUa}hTOw3CI| zyJlk#-w$M8mYpaHqcVKiI!+4*pNZ63(qX%BXHd43Azn&{9n8JS72&@FXk-(jTup<_ zeIWZHmznLRHpE~QmXcz7C~c%2mwULt@j8BQ!TnNfA9@vRPR2X~T@rz6Jb+`K4cEfv z0-6bqc=a-N;4XN}9e0>b*zF`N>ql%0g&4={?MADtfCt9%2efMo+n{k3z&uWhrzGHR zGbZutN3Gat*TXV4{36wEXk8dPWiuy72~_rq7kdJtyUN&hLC5@~At{yHr9!wfY$qBM z21lx-F(e+M~N~=TUJ8%&f1TKC8qI*cIfSl$cfXF+T z&O^J8v5A(`(l&$|gF7}_z&mIsAk1@;1-^TOHfo@X(ZsGohw6#jIX}V<0+Eff zQch(8%VMMT(`018lvaeT-~x<|%a#{4q*fP(SESC%Wt`?GPUC@GilQ*>*}I-b@>v z0=(}Zx-6z4`uS1% z*h7gY=!5rJyhl1rz1Jc7xS2jC@zG|ZL=3H!Cqk$F4jx`}e>l&{nCB$S^Xlh$)$_dC zd0yo;Ufn#eYMxhf&8I4mo<7^|VJh%8d`BO9$(?t9;4bopxjz!EqVpF-t7tpBXw^&f zjkk)H+KX0wmA>&-(b`neDw-A({Ve$rqE-AGwTcH~+icu~GMCRd?rh;&Pf8=6kiC-W zguu-wA|37w1N0l!Fi_gTlirkjs8Ww+N*tB7@=SX(<)iC~66)*r=gUgpY+_@urhMxh zbsIZsVGsbK03&+T?Qf$kb$I>}LYa-GpWhsRu=5Bk15PG}tpP4$I>-+<=;4fuiFgGk zd^Y4$-N&c*0~#*&ZTGk7iW_wGbjAg~VY8Xg3X1@9(mEpj*&`)6vY1;d&x=ofOy+v= z$&VXHGVu|_3xt%uCr)PJl>Py76nRJPC7TVUUH@j>%E52(*>-OJ>_zH-#dV7455#SS zxBw8xNBlk!k-g1k7*(*ns%MhiBcA$SL~^-T292NtiPU20^!Fq?^8hN2$O)1xRLtu( zZ+C>YH__=y$^h5%tonyF8cx0-G3f8sNVkeR{&$h13vWInc|*L|p?JZ~=8p7;C)oK# Ty3G+6h`?h=J695DyIT5RZ>7oi literal 28893 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 diff --git a/docs/_build/doctrees/services/twitter.doctree b/docs/_build/doctrees/services/twitter.doctree index fea5baad79abef33370d52d984c654ac4c239203..07588ef9a5149fe31a66ddf1df0c4492474b30ec 100644 GIT binary patch literal 82637 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 z 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 t(Br)}!R^Lf-%(-v(uyL z87x*3WZF-*Nvm~oD2WmsIkENR$fgz9Ni55<6F(^t$H{ueoRq{TFR52ea)~wH8j+gR&QP zq7C$5!K=4A&vkbGK<8{{EZW#~7sH_4ob@`<8nl?LRBPp?SMNO8sjP|Chu&O9sZ-fn*-_a~&n!9*F83Z{U&a0;zYS7*I&swHMR*$gp(YaUtKE@8eKF(Y@r={71BR!;s5 z$niwbc4pnWGv~EtE8|Ys3Ywnd*2_-08a8U~l2dkDuH%-1cFS1;Ih!Jh@{rzp|x++S(68sXk44c%<8F!f-u;JCB1LA%}xC!L2dlsD(L zYb~c$@tkUXw$?7A>jiK~O^ns@761}3?krYoH3!5v<+K8)y5PU(**Zlg{yq7kd0MAgeni z&uNE%j2Z #Azm=Ml#^Vf7stI+znMg^upxG0)?%iU$eL&Oruo!L0*wVtWVpz_+q< z|4mGY37*5mf>*A(gr<^L3l=Atd&erLt341HenK$(OywGg6>%yAgK!D4 zSE`^g6y1=?NkX!>_Y&w~408`;wsI{5wQ@Zazzz8SP5A#U`2Q#bbsY>(zw0jDsZ3*q?U3uWD1bVAsX{d z(TGM*x%0?H5`^v1U;Tppxh~^B&Mhri$M|;o10U14|65U24oK)@x8FY3CW}6;NwBtH;Z_$}< zG-}mZmpnCxoCEeClv5yW|D>a=Sbafxwh8esqX2I>_EPVE;MpET@O`4vp$i#Fe-%bF7PEj{P| zz|lI-x{ig46M}TWhM2364OJw-oQ9md5c|etXOV3R~k2dLe8bC%)hzVh=$Jk59|C+dh3JJl1>m7lWS|bMZzi2-)`!I+E$c9cphPP=v5vudLWpL0+<|*n zqm`}Xc{N9@H>C2Me)JHvE@RP9#Ztz>O4Y%FGnlPH>z2`Bt725-tpi}#Fmg1|YoP9b zwwVGx{Q6oIYi+k?d+?hq3My5*UeeSI%}&K1rzuv_rr)43S(|?G)yxcL+R>|f9$hT( zvUV9ZD2`V&Uq=F9X3hlvR(^s%waSvCwOzE@BPEfR&sbiH*VsXe8Ou)|#d;aKs2V!> zUztKM@U%t|BdL2LP*GiI1kDzdsfv8yvD-vU4GtH=6(XR+x@!t<8oST(q0ok;=ae#n z3Yv5%ps^R)YHzV67OfM;dscpSSX6$oh|Fz|&h!Kn=4Q1)H5?b6?g_)HBdb%{;ctV{ zvvp;(EkuB?er6JePDVmEH@tco>c4OX$h8&djoH{1GPWifuGTqFX#yzzwKOutKDS3# zrx47bi3HQX0dFN`b1YiNphauLRvGb5d`=Lko*hwvmiDiwA$Ry!_vpiJ%CQ!NFgwvD z6iu^Zm>rG=m4gMhTJQMd=qOr`p;}7~#Dv$;@K$KZ5(SJ<8!Ejs^Q%JjyLtm)K?P<4K zb4xXf={m(C$E@|TQM7?W1V3gkLrL+?tNOie_%o#qfGca@WMI))q^tUYpm20WF9^-R zEEo&uKPebCQ%f&};b2A@5);&TkK}_Muo|9Ffk736pkCFgVTVNmjIbu!hUj^N2sfD*${BhNL&OKl zD%l7xzSgP)?fDAe;T1uBROD1;epNW{1ncrr1=6XPI@tfPMZsvJCZ8~;n&tgJMl-2< zhnT{KOWCCUDSpr3Hsl^W7be4Lt8;iI z31!$YTG@WVcz?@`SJ6TcZH?<8AtT$P5u=<8I4l+GF3u+va-{9i4Vk*ljF6{suUWvw z(&|x7VZD4}dT01wGbsEQk2|J|h`#lMKyXR6(QG=pPQ5zDz{ z+m*^1FyW3umOD&Voz|;Sc4nO_Z&aGpFVgg|zI~HOtSdOksg=b~X6>vWX^~9zJoTEH ze1X4am7E&hP)@CI8&bQrom%RhoLUN_v`aC^Hu|Gtk-bs&YWZKh^j$!GU4>FbC2~3& zK}hzuv?OZi=GdL2a5>exwJOj;a7AUx1g>b;3L9=Nuc?nV9XOi{)%gl7uDg3j5LkJ= z=#U1Gj_sU#8ntkMVXDSeeK{dftMM*RP)=EBL~R89_kz^Q6XYgFL9lLoUk0bE;L5Yv z?QBo*CeY`H_?1*oF#6qT5&8aZq7ajSB5Mzv)8q`H&b1@Z;wP9EmUGk{xqfcK$Q2&=SA*i zi>zXd2w(L0sVZDs2htBeo;{|r4nmcrc5Pb+>b;+J_;aO&5%N$;Hmv9o9zAf{Yoe~9 ziYNlbUr}{U(F7F+5H(inWtAC416fWm)o!4Ao8kqCEpTjt>&KnNN}!BQ6{QJBt%_~r z0?`oF&dTl}F~>Fp#>Xl%ucc>PDh9TI;!kvx||8fmE*`}T`g9Nu5L-F^Z zhBOpC(#HP(%O(~pfxpdeXWNO_fl~jMUrDzUU;l0=mNpu9EoY{d?pWUYAj9^xwEDG7 zM1obeN4@ysI({qF#bdsZy>E|d=Tmenyqw>0d*O2cb$t7vSe+P1GgxRD@I^hZR9&pq zJc;*Z*>h29UTA{Uu5C3>y&E;3{@M@IVj-DGrCkuF;`YmrA^eR}4pAtE$^fS=Q(~yL zSTf$bC?`YphbWB;m#~spz@8fHdkN|_v7i`(5pZEU7NMAF`wZgAmPY3lhNae}NQBPB zL_)g@%RnY&u~Nle76LC;FoIu_P6nH<&=jU!mp(6x8M0aefo}sf?cDXC`ohcR2G$oe z4kvTpsF8Dy__pS`a($*_WB`djGbmmj*LZpP>E~9EYs||3gdSmK*|M97QbkuQlQBzv z+a>c(G%N}mOiaXjl2Xku(G?tj8KFO)(@%PahM>Fi0?GoCDedXj=0gRp2ni5_fq3EeSk=YsQ!#NKop8x z&YT^G+As|VtiG9(+JBPW&R&S@27c})c*fwdjK={DE=JKeuts8>~BtS zS-&oyxXAvuM-M4+Sw4SQ^H_=A^z8Eq57G8-bFhP~uMljI+O_S4Qtw~Q(Yy3Ol@yEW zjJOB-JI9r7tp`-VFzYoCgP<+oytkT)hh1k>3f-uvU?4H%TpVwmc0wwG;L?T>Y=*!_ zE_j|M)@@?ZQidtnCi~N)P(%TH#1EYDnzL2ji;d$0g8B%=zm8}&?^LHEwJ!ZZ`_*K> zi(aXL?benT`nf!F!zLLC4eg5IX}ogtvzYd!JiuQtgrQ*E9guR{BN<#z+?P{N&`4}n zuTgrUCm$H&ncl7k?5U!t-NU=_rV_50dpN`if6F`658}?DpYX}Z8%p!ZL^?(JWa68i zrSB2}cKC$^9nvEuRO|aT{RaDF_s4v)s?KexieC;Gh8|*(zt4q1}os?S6d&| zu1AG`b~;q5eebSa4mM-5^QJ=Ei-;r}!{92#ZJfH8JrL0Z6D;wcBQBMN&ck4ypgwQa z*G5{Y| z^_oSX0_?3jldBfP)F){R&iAmEfiG>75p+c zt!zKJ7L<%Jo!Itv9=JPepn>^2-r-;zZZH}BeGDD{&_tbFV!<5wwDC0B|6&fl>!*$T zj}i?FyWWW|+C|5%_&xmcuJ7P6>o4LC0E; zl{S`doETQVAcg0eysJn$aFe2^0u>^uY%(V)a1ItW_&9X>7{!O!M%Ye5?}eh!2XN#L ztO$@6%dSv|KFupGK!5$gJkzlO8|}A-YdA3 zGiAo!!`EFJ#p*}!x)rNL5DPJngj>KtPUUorhTIvwqkRPmgQClYzL8GBD~YKIPSQ&# z|MDTQp^S9)cp<@J+tE71?lFs9n%&NhbRGoVw(u+Ikxq(vyn5)Owa_(bU>gia>Ft1{ zTNy`Kh;6`GNZ5H<4ebTa5Obzd6>Gt!rf*gddvZ|aF0?TtZI3>5yYkj%NDPd;5mJU^C$ATk0h#3Qw9I|59-k8tmCjrWq$c+%h|w8O|zsusXu zhBzWeobhRvSX6Kza{p96Mq!+K&{E5Jitf-}GjVFCep_x4Mh$X^6DZI%7dmSd)>UVW zS_16yQ)hzqtQNa2eFjPW<`O>({k9`!JYzFAOvQpSn@ty1bA{}7wwgNxqP$fQC2cQS z^u7y<3QD0|U{GnV!+$4{c!$4~O$;5FB}$ymZm)`f1krK}AN5YcNA6v6C%}gk`?g5F z3NbE3GBl0y!Ua%U0i=|SvlMEH(oTVc&9ZW%XbA^YDW}6uuCOro_8zWHg)%8)FVI|t zjJ;OKSdYmiMC=pU*k=*@Xm&eW#0~@X&+#kio<#HfBU;JPD>1YYmY*kD?eIUBjaDrz zgwvnRZm)zzpg*^;Q1AVO<+F+nrM2q8Rx2no;+*J!EFe|4#cUmIp_XgSNr&o2+E~&C zY6UEoy}d>0<~(yqO4NTMDhY`ahFC56dSDKG!FqP3 z1nZosq2%qo=LI5otvNWv(8~V{BJmFYzh#p_3nJ0r&$8PqK@{Z5Er`^6KS6v>F|jf< z*@jECnT4V^L z*JZa?A|sHWTV$yBOp%ecOHnAvk=-tzYMDw)a^%=lNue&|I!Fl6zHFMXm3n=4J6nJr2SM)RSJDNjx;z0|2GW(_oLb!xW9G-;+J7ri zX@~zrHX60aoIv}>v)e0?5$Mh>GDIOGGU>0$@-&rx=vAKf{YU3emDX;Cs0BqZ6iyjk zW=sP z3S<(pVsWo3N!cE?UlBkIrC%ukK+YxNvEG@CT>G_tFq_#}7tlDIx43ApHE(?B0YfTd zX;wdpHx+krfy)+oa&e)An_EuV!PV#a%%xsO1LCe1K3kPoVqAFZBO_QIG@S?7Rneux zV6!oCl6Qg5g?a!drc`V5OIT}^M|Y02M7-^RG=E<(^cZ#i0DbIK+T{X;PMdCantm*U z&e6s*3$?vr!=)>qHt^AdxLt=6lAj-gb&C+RNIugW5GfIB1Db~|o#!j2)a_Xeo!Jk=u@0+*TFML(n;eW+Z^^Q02+JytV36~d0y%%7r3SW0fv!Tsg#mOMnNq9$el~D^N5J`a1Hnl|{2ToS6R{Q};+cox zk&ri1Z!eUn{9#UOEfhcC!IB3rgfhf%bP$ZPs^98CeL@vQoPdc4Cn#V%p>itD7%v+5 zQUa>kh$+gQ!kqz)UpW8_YB#TE`52);x#dH#K;1%dQc-^LowwkuL|p#H*1RB(!**^t zJ2HY_T;_;^QlGU3 z22O$!cN%u0treVHRHM_23bLYyAjh|$*6N=ElSM41kfn_`hrE{`=T78&38 z23mPIDwOF)8WMMVc=NQggi%iC<80JjSQg%Th@o#yFr-zu19w-9t4O$xzM7sGPj_YD zi3(b%8lA?0R=^HJE)Oxis0Zn=pf+AkTLCk~-%URZ&BKF2vm*tInjxaJRz2W0_Bn0G z;k)pr(wi}TdGIJUql=}Vy={Q*|FIM&=}Y9H>+?8@oK&OGjBZ^iN3H!#yR(+=gM4F&)_Pf3;fri>9hVQKD7$)cj8-@ z*gqXZgC+Lf%+ccq_VQ7>bliU=+qzL!{{X@Dni{u>1SXodP$y419`5bYi0iG;@ zp~#0)<>_*_!S?7pji&MGKMiDH>hGpM1M|*%Vn{P$7F{Xq9BMbknQyqWgFPQ}{eWzt zQ6SA6+~&B8ob*S@l}T~AE|)GB6C~kp_596X;st?;j}C+ha<)494R*Gki7AgacRO2> zSt=OpD?D+`r4q-qn3;v5S1Q?!)E|)H+=S}(alF-tIYC#sO4jkXR1=Hf40(_}f-Si9aUQ#z=>~~~r2@I4v<5{i z!70)g+T%DG`-izT92a7RlZ_?RMbsyQ=KR#1le zAf}s0J?RCLIg9+QtH@Gnj#tKbO|!3om8bkj#+21T<^6iYb>Od8w=^$P4AkA>Ohlm7 zoM!&exr>;<#&T7Rh@s=iNJyMB>4X@?b)$nvH<0l8J^ z*&w4Mkn!PVA>*?#WW;^YX$VnoQAzVc6?$wLT7jPQd|8Bk9Ft8mOUn_V&&5z-bWpSf zNYHVn&{B-_gV7mAACd;dJ(tPA68U;59_Yw^^d@*r87%veMu7jzg5bY25W&g!{JegH zea~O8eb4B>AdIBjTzqoRxpX{=+D4z+ONi@ANNe|lb%U} z%4u#%7x~Yr4?Rbw{`e|T|JP#EHzI@Ecj1kQ*%%?_ry?Fk4oZ3?jO>1jA9BetZx(kZ zcL&3|f6!>~4+&B~JP@hLC)uyxV4vhSVm`@7cvJRb&^#47bfpuVhb99jx;x`p>3*2GQp`!lJHrUzxy}L z_Jp2omx;!qDT%o$FK|ojxfz0a? zL-atZA(C`cOvpu8=8LgJ=h%xzEi=So216{z6n!~{0?QP=`?2am6*~%QOOPK?z%pAw zNt8G)$yEPIacp|6cC(I63uCw6MnP+Nq3=#{fDBjmi6*MtL19a-wXH1-B*HpH{YrzO zDd0a#0=~ol5&AQ*$@{$+n&T#KKRB(6pZXfS8pzUmV0XWm*2;9IXU%-~{3`I>@5c~g z#5KA^prYrhT>dt|!kmmwib33ROc+GL#9AxIpK4_IKPOn=pAEzUWC~x>Z?Gx+!-Ode z)Irglu313-Q!<1S7Gt&27U=pe#`wvSHAtl_vc{#ciul$dhq^IGgioq}w!Pce@wf#Y&P&6D=Tr1M59oP;-{-=*~UZcrvgA2o7hs~F4Nhrtt^RL1Qnq|nV6MQh+pC{PVD*W1(pr11On=Gmt46xSt zUm03M#Z75cUWlzDrZAmE;(Iz=mn4};0k+xRjA=S$$c9JK^;s8W_Wo4ABX$TSk!75* zw6)WJkI8i0qkYhLw9@cd$c=3-#oAxHv$CmKJe_MdT6;0BuFJsHa&-S+#gJen^PR~_ zM{VDk5Zn4_ryB~M7Vxbs0}U0Gs!t+18ftoT)p94gT5bXA)d!anya{_xzhyzuwKY+O z7`o$1@(1afWQLaDvl_;TwkX3i!5a!qX}11B>@-XUtYVuMX?tLbbAI^|zMp}22r9fO zq3HRWrni3-v<6a+(4X9EHFDJ7q~Bmi{oCmfZaF0OR|^ZIU`sqTP!$DKPw6r8_^AZd zTlE_Z)pugchyQv=92&sYV8X}1I^DT*{EpjhleSS@)JVq7J-x7n@RMD(G6DfejL?} z52M$TdYIsm#U)49Tx3aNa-|sD>`YDxJ&)Q*DJ;qWsFc;jM8j=W9+=`7^%NbkFtuNb zTsU?69lLkmQ7D(Z(p@F*-qJmDbGzs6-c!E2eAhjDW^cP~_w4K)x6j@?=em1tpWCxX zk>tFOt8vZL{XhnFd)w5Zu;Sqa;GTP_j$9l^v$dZ3YMXp}4qMCyO@xVXsu}P}ODgiw z%T;<5;8Jqvt_1N(fwk-Js5TlDp``UV6)w!W@@y9Ko9P6<7mI@trC8i451Zu!;^pBR zyb)Ry;!0JE-S4DO#f7+1$C`bf%>ky_B@)YKP<3YyVURYb)29U}sfz-?Q7!v(QHfgG}iPQHF1AMv1ktDLCAp*+LdsL?4?*=ITSmT zM~IX)O^^cH17aF>;>f`D`NPpaduB`P>uteA+C=-JXy1_#d#4BMVfP-+`Vy zWB2beu)7RjWJ`SF#uqvH7HsDc6#{f$z1Ymda!*nJc7uG9J>$3O1sIAYdoI%W_$N35 zEX&dpz>*3YpbF)ITMCz)+Yz3u*4r&y?}1LSi>X?6nxsECasr2F9NtT-T2o$+D3id! za&-QR?RH4lM6RU4S>1q>8&&h%ur&c!3gHSmZdhc4Fo6~V*{Iim!v*;21GYynhrH|D8z)z)a^227}+-0>5`^Y~_h`DPFpg zcu65TX>Rt%%?)ELkF{|oq)vOF?ky@)y)vEYX|oxc#+=iP{4&hYRdIwEGZek;3HXf* zbRZG*Jw@YSeX8}a<+){4?a1qD1y`BKAQ>H#3NvhJXTcCV)CB;mJBY@f|CnH!?^_nr zTocDpJRfoHbOt_Fj%lbfJ#A*1!pbwvb#a7PO!KlVZKON!qz-1gtjsd0s6M8dPvo;a z3koqa17V#c)Y&+B1@Hyf^WZzhM3fm!C*2&QyQEVwSFLkiTyUbbdXkGSI7hS~b8Aho zwf0Evqo7ZMC#?C&f4dN)U|C{x zV_&X$e{T<#&i6Zx^(bA1D2t595!{a_P)Ec{ykv%JClX(r=?A6A$8~3$L5S)I?WrzM zAYZ^pFBgjw6LRT5srE*zie2Z9H*Ycn?NZ zwVa>5M{zbPLJ`d>(nknUNFPIC(mp^%m6A!W)Bf-Ps^`u*e;h~#mphbttGLX%X=eyU2D zP*k^yFe7fjz)p1nRQUDyh1RvWlpD3PSkh8@liWgTfpBD_8Q{EloSIn)Aj)IzX=GlS zJE=dbl!V?9?~`N7b_DPF$Q7f9V)4j<{fDLt$BrI74hK`Gehb!4;nCaR4v3#sEy~l8%q9 zFm`yUagO-mK8&XrbygV06`>#{X|C10*DFb5Q&_S8hvNxw1Sa{C&4m#)C24!?JU^MuXlwYa!AB@gA`vbzPZTy>|=6sl7eolqKE({M4MP*CXN5h+)tHL43Z{hT8{ z^t4S%S={id7yO6zW60a@xbv>vd+xr6`lph>1rNnF$PV$YUi{PARJ%b2xW$5R(jW< z^Ekd5bT&XmtJ8lvUN_r(rjWQnv7P~rG4_E$F?Lm7&ec*K^>5Py@_g!Pzb)@c_4IHG zhe-W2B^;h`YWJS0yYE2-p%BC=9D62yne-d;3Rx@GpGFDe`lm8*Z4{k-YH(@=;K4Xr zti{{M$thdFSxPwm+T__(od*HqaL3=!XM&7#t4e?TevgpNa~;X(#cQ_lYas0OzEJpIY-<*WSMo8t6| zFFx;%FFplLbb?M`T}L6Um8W9UWxuZ{$87oQE6}6_!VK+%O|E^M)cP*5Us2%jmB2CFc?C_I%W`*Xhw*h z9Bin8ao>%@e0u-UI47BxqRm2HCRk2TQhCFZoytu(rb#|$C#=UQFo}Qwuf0BvLEP9~4lv(3cH(lhf#VPC z8q;l@_@&*T%`eDgvX@J*QEi6W!5exwqJrwKQ~?!LdT~btGyBRU`XWAY3QQJCan+}aF_tsY9$aKpsZyQxfmzCdd7SjG zQb=Hnam{xXaxix-w8Pdeh**;<7Uc#Vw&ARqWDz5$wdL_PkW`K=a=_3CuaJGx6TK85Te)`B+CFn_gHv?$0kCG!~1;Q>#2{!<(x;QV$H~ zV~&$?=7@W@H^jYLCbf2MncRvZIa+FDFu6`-kZTzWskg+ZV)6Nl>@Hd*z+`LU>?*DB zVuiR?{6yOvXv>4D#3^}Td&YrR7WY?+Zb)wE2zH9*L$-H;``HXj<{uT^k!y=v3|MAb zE~Q`=ZRl+d1o!O7~@NKjN;{@8qYtKlH(RB!2=1_Dm4GOm6@X|(#!5)0sju>>ci zZ)#FTtr*8vTyKqL>Mdk`iK*nCjNI)t@XUnIXE5P1bXX}qEu+IuZo-=309~2MzV{Tl z+>|a1!(g_`?zM8`!4@^|G!?_LP8-95fpdb;X2RFcpB6+061hbj%|IvJ;WeBkBDb_- z*Ke_C)(c#QA~T0N&Q3`|*l85F@kKE9mR0nn@As41md@g$m^@VLAtXgr*6_4jYh!mB z&6IYGVOc~=6f2YXmQ_JYQa_$tl~G_VNEd!8ApursV&F8u&t~wX3Q*9PtQB{dd|r~= zM(5(zES)RvYLz|%I)KJz8YOd^tfyummaAVKbPi`FCo!m_ zxYCL1(mcsPsYdfOjcd@aWKh~@P%`M^YWgFH#F+I=SKjdF4sr;B)CsO@LhvDE-9@=N zwSrZwTtyUw!hB6W0t79DKSx0aR5LW)SycIkBVtz>O0UVb@|IIXkx--og+##>yvF-s zTS0(WJ!(9l+lU3#AWMjzd)T#xFez*95wU*(HNmXy&|I6}S0m_}p8lVMmLSYG=}+!h znKI|TP19s<=%F0BA(8amb9~BOn%Z~l*>Vq;@3f^l+(HM6HaDUM&6bew7H9qhlO?U7u2 zBwE)UaxjSF#rgy>w^w9rjcb3yR%WkZ`ZF+lHTz-o>&zi31);8|WycbgU7O za&>MFUJ6{Wu=)-t8K@9OJ6tnPnjkU?&zpn0VYNjI zN3n^C8rG_HREfXAVUE3s?QPeyFH@(np2dySiI&N7{0Lxja~84zC9&5;Vut#MX0 z12D9=4GQf>&FQA6$a>fVlleTSR$Q;dJ*Ru(lR%}_*a#hmi$k6!C;4BaiX5Zk)-O6a zwfqjW+GKnk%D`7oFYB~DwJtB~z%)`nZkf_QAUKp1E3=rVkAsJLt>cQtgRnEWe{-j$ zcDDEI&LUQy1|ZyAQ!?iR;qGLKJ_Y&^e>Xid#oO6Hvpf^>7~+d@jEZKOh`#lJBcDvX z%VwOUD|d6e3h~5a2MULe?wdYb;9@t3$nj>|Q&Y>=ScA;zhKD#2?bENq8KF|1 z5Yj0YEYuC6M0lz;mWH(ewHPHF>7$(wES2C~%pw8>km*b@+?`w8H@)wTR0pmXJKEcj znP%P~Do?mT;`ZeB@8Ob=-Hl5lec!_oTg6^Df=+soRITOzTOJQ|qvS`WK!*6cK`m>D zPi1Hb6(OUMSU28~&E8rEML8Pxm_#d9(jB*# z?kVlLy>#zAvvv^B+WQvGBTx}glN*7M+4 z45wEJrm{fgbypE$qa>sAF&YG9>$bRnSf0QQnfOz>>)KR2n@KU3y#^!ZiINaxtog52 zafcpcGJQv>&C+L@b3M3gP{=QuH1PRBChS*paCJ8&^67;S#`QwnQ|aSUw&?1k z0@JZ8$+ytBOW|;tZ)+Sd&KEOqz6^)-!|^FwF2z~66kI%*tePS%mTAl==3XpPUB_TBzw`pcaAkB&8o(4g{1Kqfc3)TDI)5;O zU}{}Ykg*uABfMF265rEd-=OfUcx@dAEaR;66N5ssHBL1PrsOZ_&<&{g{^g)>zP3LL zX$(Xuje0NA1VGiE#6?hUWw0!|vdT0r~NW)N!Sk&nurj)6z%(CRA__SE>T(}dnr1GcZ zfWt~&z+gk@z6NGJzsmTV8RDUoF+s-4xYvRs33fhR@ndl@GA~7!a<%jXr)4HsXIOg< zFXtb*!X_2x)f(K^@ zL!Kq{@GbBTa=vH-4M9R5E+LSCZG))Tl^Y{?xrKL5V81zD;9bB}>%uof*j=%Hs-T7r zm-jl@FIYyk4DwTmyOCIbk;( zLUf7tgCU((M_`vUDE>$K6B-doeO)Pe6Sssrlh#(x#Qy=}x*h)aCzvl^!2h4d;Wbo? zwhC*f@ocu&i(k0(8Fy)9Z?Gq0Vmcm+E*Cey#cufQ`1j&M5>N3;tdZJ79%fwd>Djwi zH&%AUZqNL7^jhx>iWpj^uBTimEfwevpw8Kj{|TVap9BnH^qQUxala^<5tO2tJ*Q~B zTs#qJkqWao{Twk^8d1KW zA8f{TPq<#CfW1myt@Fsm(MZLu>90f4rQVq;aMf~K?NBuuiiXNwsXdSWwl2C&x|Ibj zaM-{Co@{KPV&9`lb)Jc~R_l#+tAOe++)sh>?`UJYH8*k3L|DbYuZjOy@S4q_SwObD zT!YC0;rO`JPP7eoTE%-A;$Aw@wTWL6UHD%DGe%oQzXpb(6UPru+=KDsKO|m`E}=Pu zKvYHCh~;&nEj6U_+o&7?#>@DAu~+Xzm&2dK-i1QhYk)s64E8es55u!TeGbzEMyllk zoW8m0nNDRm+UmAjLBTwVE~XoIx0Krpje=%8AeJ8>{O&ce5rR70#!rCVdPw9qj~b!Z zE(e7(3&c{FKTmp$bT}7EQv*@-0u7h_=sLs<+u2%w4*%fWZWI~*V&c{ch z(=D=DfqnK4jt1G<@ES$~5G6=(_EF5;J;bM{cBsPLfmA%tbXcCY(6Y5TH=7uSo|s{-Q7Lom`+$^Iz1AELQ)w;KFvP}| zTY?CbTb0fu8=`B$PzwbuTe>i@5H`TFooAyf85&f9Bg=qNFz_wms0>El)N~j1R|wuE z;ZnWjo+(st3r3A@!stZnY5{ThW+deyPj7ESd_%l>Ie!;l3!K`x^jLwqR) z0#~%45P=({X+mi7=(5;TG6Vb=z0K(_!^Hh%dd`af$quW2H;mR(6Yw$Mrb6 z*T057{yBYojy^Wxz#)H_KK`CQzD*xP^xDPr@nQP-06yB$Mw)qRslnJ9^EY3*X3aB| zrDu53Gd$rLp6m=ybcQE6!xNn0$<6S@W_VIFJfUZJGBZ4p8J@%pPv9A!fS+N&XBg-i z26%>nonb&{7|0n0aHd_k{%mK=|4F!P)8hpq z57Xl_^e?8z+lV|&kFOAUm>z#a|6+P{h&)V>>oh&yM*m`Ze4hUGcl7Zs`e4fJC-N|5 zUZQ_7W#|+lK^guRQ-*G?7L=j;;{;{sY9B!vI`mvnh7Rczl%aDum@@1|x1%k#mSBe7 zGFycaB+dsjizlSXRXZUe_7l+#k`7(5Pzq{V@o>{C5)XCjjj4<5w3N_zo^oI^#kw6+w0sY-M1UH4?dao%F9o`C|`Q{=^wMQ-Mp~a1*u4L?#QFN z6+ZiDM!U)}HyV;2&PCBW5Hjqp zM-~?E&6@j-#7>ONl77L$pbwf_;~fGWp}ubtSa5OOyW}*E(VH diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo index 85121ad..1791311 100644 --- a/docs/_build/html/.buildinfo +++ b/docs/_build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: c5926ae45bdf655927e4191d7875151f +config: 0955893ed4646c1b447dfb8db4a0e530 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_sources/development.rst.txt b/docs/_build/html/_sources/development.rst.txt index bd07373..1310c82 100644 --- a/docs/_build/html/_sources/development.rst.txt +++ b/docs/_build/html/_sources/development.rst.txt @@ -98,7 +98,7 @@ Set version number in ``ditto/__init__.py``. Rebuild documentation (which includes the version number). -Ensure ``CHANGES.rst`` is up-to-date for new version. +Ensure ``CHANGELOG.md`` is up-to-date for new version. Commit changes to git. diff --git a/docs/_build/html/_sources/services/twitter.rst.txt b/docs/_build/html/_sources/services/twitter.rst.txt index 5b3854a..7a8dc07 100644 --- a/docs/_build/html/_sources/services/twitter.rst.txt +++ b/docs/_build/html/_sources/services/twitter.rst.txt @@ -8,13 +8,15 @@ You can fetch, store and display data about your own Tweets and Liked Tweets for Set-up ****** -Go to https://apps.twitter.com/ and create a new Application for your Twitter account. You can leave the 'Callback URL' field empty. +Go to https://developer.twitter.com/portal. You'll need to sign up for a Developer Account, and then create a new App for your Twitter account. Note down the three credentials it says that you should note down. -When viewing the Application Settings, click 'manage keys and access tokens'. +When viewing your App's details, click the "Edit" button, then the "Keys and tokens" tab. -On the next screen click the 'Create my access token' button. +In the "Access Token and Secret" section, tap the "Generate" button. Make a note of the Access Token and Access Token Secret. -Now, go to the Django admin, and add a new ``Account`` in the Twitter app. Copy the Consumer Key, Consumer Secret, Access Token and Access Token Secret from Twitter into the Django admin (ignore the other fields), and save the account. A new ``User`` object will be created, reflecting the Twitter user your API credentials are associated with. +Django Ditto currently uses the v1.1 Twitter API rather than the latest v2. Unfortunately, accessing v1.1 requires that you apply for "Elevated" access before the API calls used will work. You can do that here: https://developer.twitter.com/en/portal/products/elevated You will then need to wait for approval. + +Once you have that, go to the Django admin, and add a new ``Account`` in the Twitter app. Copy the API Key, API Key Secret, Access Token and Access Token Secret from your Twitter App into the Django admin (ignore the other fields), and save the account. A new ``User`` object will be created, reflecting the Twitter user your API credentials are associated with. If it's worked your Account should have a title like **@philgyford** instead of a number like **1**. Once this is done you'll need to import a downloaded archive of Tweets, and/or fetch Tweets from the Twitter API. See :ref:`twitter-management-commands` below. @@ -253,13 +255,21 @@ Management commands Import Tweets ============= -If you have more than 3,200 Tweets, you can only include older Tweets by downloading your archive and importing it. To do so, request your archive at https://twitter.com/settings/account . When you've downloaded it, do: +If you have more than 3,200 Tweets, you can only include older Tweets by downloading your archive and importing it. To do so, request your archive at https://twitter.com/settings/download_your_data . When you've downloaded it, do: .. code-block:: shell - $ ./manage.py import_twitter_tweets --path=/Users/phil/Downloads/12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66 + $ ./manage.py import_twitter_tweets --path=/path/to/twitter-2022-01-31-123456abcdef + +using the correct path to the directory you've downloaded and unzipped (in this case, the unzipped directory is ``twitter-2022-01-031-123456abcdef``). This will import all of the Tweets found in the archive and all of the images and animated GIFs' MP4 files (other videos aren't currently imported). -using the correct path to the directory you've downloaded and unzipped (in this case, the unzipped directory is ``12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66``). This will import all of the Tweets found in the archive. +**NOTE:** If you have an archive of data you downloaded before sometime in early 2019 it will be a different format. You can tell because the folder will contain five directories, and three files: ``index.html``, ``README.txt``, and ``tweets.csv``. If you want to import an archive in this format add the `--archive-version=v1` argument: + +.. code-block:: shell + + $ ./manage.py import_twitter_tweets --archive-version=v1 --path=/path/to/123456_abcdef + +using the correct path to the directory (in this case, the unzipped directory is ``123456_abcdef``). This will import Tweet data but no images etc, because these files weren't included in the older archive format. Update Tweets ============= @@ -423,4 +433,3 @@ Fetch Accounts $ ./manage.py fetch_twitter_accounts I don't think this is needed now. - diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css index c41d718..912859b 100644 --- a/docs/_build/html/_static/basic.css +++ b/docs/_build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -15,6 +15,12 @@ div.clearer { clear: both; } +div.section::after { + display: block; + content: ''; + clear: left; +} + /* -- relbar ---------------------------------------------------------------- */ div.related { @@ -124,7 +130,7 @@ ul.search li a { font-weight: bold; } -ul.search li div.context { +ul.search li p.context { color: #888; margin: 2px 0 0 30px; text-align: left; @@ -271,25 +277,25 @@ p.rubric { font-weight: bold; } -img.align-left, .figure.align-left, object.align-left { +img.align-left, figure.align-left, .figure.align-left, object.align-left { clear: left; float: left; margin-right: 1em; } -img.align-right, .figure.align-right, object.align-right { +img.align-right, figure.align-right, .figure.align-right, object.align-right { clear: right; float: right; margin-left: 1em; } -img.align-center, .figure.align-center, object.align-center { +img.align-center, figure.align-center, .figure.align-center, object.align-center { display: block; margin-left: auto; margin-right: auto; } -img.align-default, .figure.align-default { +img.align-default, figure.align-default, .figure.align-default { display: block; margin-left: auto; margin-right: auto; @@ -313,24 +319,31 @@ img.align-default, .figure.align-default { /* -- sidebars -------------------------------------------------------------- */ -div.sidebar { +div.sidebar, +aside.sidebar { margin: 0 0 0.5em 1em; border: 1px solid #ddb; - padding: 7px 7px 0 7px; + padding: 7px; background-color: #ffe; width: 40%; float: right; + clear: right; + overflow-x: auto; } p.sidebar-title { font-weight: bold; } +div.admonition, div.topic, blockquote { + clear: left; +} + /* -- topics ---------------------------------------------------------------- */ div.topic { border: 1px solid #ccc; - padding: 7px 7px 0 7px; + padding: 7px; margin: 10px 0 10px 0; } @@ -352,10 +365,6 @@ div.admonition dt { font-weight: bold; } -div.admonition dl { - margin-bottom: 0; -} - p.admonition-title { margin: 0px 10px 5px 0px; font-weight: bold; @@ -366,9 +375,30 @@ div.body p.centered { margin-top: 25px; } +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + /* -- tables ---------------------------------------------------------------- */ table.docutils { + margin-top: 10px; + margin-bottom: 10px; border: 0; border-collapse: collapse; } @@ -416,32 +446,34 @@ table.citation td { border-bottom: none; } -th > p:first-child, -td > p:first-child { +th > :first-child, +td > :first-child { margin-top: 0px; } -th > p:last-child, -td > p:last-child { +th > :last-child, +td > :last-child { margin-bottom: 0px; } /* -- figures --------------------------------------------------------------- */ -div.figure { +div.figure, figure { margin: 0.5em; padding: 0.5em; } -div.figure p.caption { +div.figure p.caption, figcaption { padding: 0.3em; } -div.figure p.caption span.caption-number { +div.figure p.caption span.caption-number, +figcaption span.caption-number { font-style: italic; } -div.figure p.caption span.caption-text { +div.figure p.caption span.caption-text, +figcaption span.caption-text { } /* -- field list styles ----------------------------------------------------- */ @@ -468,10 +500,71 @@ table.field-list td, table.field-list th { /* -- hlist styles ---------------------------------------------------------- */ +table.hlist { + margin: 1em 0; +} + table.hlist td { vertical-align: top; } +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + /* -- other body styles ----------------------------------------------------- */ @@ -495,17 +588,37 @@ ol.upperroman { list-style: upper-roman; } -li > p:first-child { +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { margin-top: 0px; } -li > p:last-child { +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { margin-bottom: 0px; } +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + dl.footnote > dt, dl.citation > dt { float: left; + margin-right: 0.5em; } dl.footnote > dd, @@ -520,14 +633,15 @@ dl.citation > dd:after { } dl.field-list { - display: flex; - flex-wrap: wrap; + display: grid; + grid-template-columns: fit-content(30%) auto; } dl.field-list > dt { - flex-basis: 20%; font-weight: bold; word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; } dl.field-list > dt:after { @@ -535,8 +649,8 @@ dl.field-list > dt:after { } dl.field-list > dd { - flex-basis: 70%; - padding-left: 1em; + padding-left: 0.5em; + margin-top: 0em; margin-left: 0em; margin-bottom: 0em; } @@ -545,7 +659,7 @@ dl { margin-bottom: 15px; } -dd > p:first-child { +dd > :first-child { margin-top: 0px; } @@ -559,6 +673,11 @@ dd { margin-left: 30px; } +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + dt:target, span.highlighted { background-color: #fbe54e; } @@ -572,14 +691,6 @@ dl.glossary dt { font-size: 1.1em; } -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - .versionmodified { font-style: italic; } @@ -636,6 +747,10 @@ pre { overflow-y: hidden; /* fixes display issues on Chrome browsers */ } +pre, div[class*="highlight-"] { + clear: both; +} + span.pre { -moz-hyphens: none; -ms-hyphens: none; @@ -643,22 +758,57 @@ span.pre { hyphens: none; } +div[class*="highlight-"] { + margin: 1em 0; +} + td.linenos pre { - padding: 5px 0px; border: 0; background-color: transparent; color: #aaa; } table.highlighttable { - margin-left: 0.5em; + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; } table.highlighttable td { - padding: 0 0.5em 0 0.5em; + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; } div.code-block-caption { + margin-top: 1em; padding: 2px 5px; font-size: small; } @@ -667,8 +817,14 @@ div.code-block-caption code { background-color: transparent; } -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ } div.code-block-caption span.caption-number { @@ -680,21 +836,7 @@ div.code-block-caption span.caption-text { } div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; + margin: 1em 0; } code.xref, a code { @@ -735,8 +877,7 @@ span.eqno { } span.eqno a.headerlink { - position: relative; - left: 0px; + position: absolute; z-index: 1; } diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css index 3c33cef..e380325 100644 --- a/docs/_build/html/_static/css/badge_only.css +++ b/docs/_build/html/_static/css/badge_only.css @@ -1 +1 @@ -.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} +.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css index aed8cef..0d9ae7e 100644 --- a/docs/_build/html/_static/css/theme.css +++ b/docs/_build/html/_static/css/theme.css @@ -1,6 +1,4 @@ -/* sphinx_rtd_theme version 0.4.3 | MIT license */ -/* Built 20190212 16:02 */ -*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,.rst-content code,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:.5cm}p,h2,.rst-content .toctree-wrapper p.caption,h3{orphans:3;widows:3}h2,.rst-content .toctree-wrapper p.caption,h3{page-break-after:avoid}}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*! +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,.wy-nav-top a,.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) - */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.7.0");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"),url("../fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.3333333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.2857142857em;text-align:center}.fa-ul{padding-left:0;margin-left:2.1428571429em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.1428571429em;width:2.1428571429em;top:.1428571429em;text-align:center}.fa-li.fa-lg{left:-1.8571428571em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.wy-menu-vertical li span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-left.toctree-expand,.rst-content .fa-pull-left.admonition-title,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content dl dt .fa-pull-left.headerlink,.rst-content p.caption .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.rst-content code.download span.fa-pull-left:first-child,.fa-pull-left.icon{margin-right:.3em}.fa.fa-pull-right,.wy-menu-vertical li span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li.current>a span.fa-pull-right.toctree-expand,.rst-content .fa-pull-right.admonition-title,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content dl dt .fa-pull-right.headerlink,.rst-content p.caption .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.rst-content code.download span.fa-pull-right:first-child,.fa-pull-right.icon{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.wy-menu-vertical li span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li.current>a span.pull-left.toctree-expand,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.rst-content p.caption .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content .code-block-caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.rst-content code.download span.pull-left:first-child,.pull-left.icon{margin-right:.3em}.fa.pull-right,.wy-menu-vertical li span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li.current>a span.pull-right.toctree-expand,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.rst-content p.caption .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content .code-block-caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.rst-content code.download span.pull-right:first-child,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-remove:before,.fa-close:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-gear:before,.fa-cog:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-rotate-right:before,.fa-repeat:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-warning:before,.fa-exclamation-triangle:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-gears:before,.fa-cogs:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-save:before,.fa-floppy-o:before{content:""}.fa-square:before{content:""}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-unsorted:before,.fa-sort:before{content:""}.fa-sort-down:before,.fa-sort-desc:before{content:""}.fa-sort-up:before,.fa-sort-asc:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-legal:before,.fa-gavel:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-flash:before,.fa-bolt:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-paste:before,.fa-clipboard:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-unlink:before,.fa-chain-broken:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:""}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:""}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:""}.fa-euro:before,.fa-eur:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-rupee:before,.fa-inr:before{content:""}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:""}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:""}.fa-won:before,.fa-krw:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-turkish-lira:before,.fa-try:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li span.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-institution:before,.fa-bank:before,.fa-university:before{content:""}.fa-mortar-board:before,.fa-graduation-cap:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:""}.fa-file-zip-o:before,.fa-file-archive-o:before{content:""}.fa-file-sound-o:before,.fa-file-audio-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:""}.fa-ge:before,.fa-empire:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-send:before,.fa-paper-plane:before{content:""}.fa-send-o:before,.fa-paper-plane-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-hotel:before,.fa-bed:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-yc:before,.fa-y-combinator:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-tv:before,.fa-television:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:""}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-signing:before,.fa-sign-language:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-vcard:before,.fa-address-card:before{content:""}.fa-vcard-o:before,.fa-address-card-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink,.rst-content tt.download span:first-child,.rst-content code.download span:first-child,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li.current>a span.toctree-expand:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content .code-block-caption .headerlink:before,.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .rst-content p.caption .headerlink,.rst-content p.caption a .headerlink,a .rst-content table>caption .headerlink,.rst-content table>caption a .headerlink,a .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption a .headerlink,a .rst-content tt.download span:first-child,.rst-content tt.download a span:first-child,a .rst-content code.download span:first-child,.rst-content code.download a span:first-child,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .btn span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.btn .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .rst-content p.caption .headerlink,.rst-content p.caption .btn .headerlink,.btn .rst-content table>caption .headerlink,.rst-content table>caption .btn .headerlink,.btn .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .btn .headerlink,.btn .rst-content tt.download span:first-child,.rst-content tt.download .btn span:first-child,.btn .rst-content code.download span:first-child,.rst-content code.download .btn span:first-child,.btn .icon,.nav .fa,.nav .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand,.nav .wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .rst-content p.caption .headerlink,.rst-content p.caption .nav .headerlink,.nav .rst-content table>caption .headerlink,.rst-content table>caption .nav .headerlink,.nav .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .nav .headerlink,.nav .rst-content tt.download span:first-child,.rst-content tt.download .nav span:first-child,.nav .rst-content code.download span:first-child,.rst-content code.download .nav span:first-child,.nav .icon{display:inline}.btn .fa.fa-large,.btn .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .btn span.fa-large.toctree-expand,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .btn .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.btn .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .btn .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .btn span.fa-large:first-child,.btn .rst-content code.download span.fa-large:first-child,.rst-content code.download .btn span.fa-large:first-child,.btn .fa-large.icon,.nav .fa.fa-large,.nav .wy-menu-vertical li span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.fa-large.toctree-expand,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .rst-content p.caption .fa-large.headerlink,.rst-content p.caption .nav .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.nav .rst-content .code-block-caption .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.nav .rst-content code.download span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.nav .fa-large.icon{line-height:.9em}.btn .fa.fa-spin,.btn .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .btn span.fa-spin.toctree-expand,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .btn .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.btn .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .btn .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .btn span.fa-spin:first-child,.btn .rst-content code.download span.fa-spin:first-child,.rst-content code.download .btn span.fa-spin:first-child,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .wy-menu-vertical li span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.fa-spin.toctree-expand,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .rst-content p.caption .fa-spin.headerlink,.rst-content p.caption .nav .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.nav .rst-content .code-block-caption .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.nav .rst-content code.download span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.wy-menu-vertical li span.btn.toctree-expand:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.rst-content p.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.rst-content code.download span.btn:first-child:before,.btn.icon:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.wy-menu-vertical li span.btn.toctree-expand:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content p.caption .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.rst-content code.download span.btn:first-child:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .wy-menu-vertical li span.toctree-expand:before,.wy-menu-vertical li .btn-mini span.toctree-expand:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .rst-content p.caption .headerlink:before,.rst-content p.caption .btn-mini .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.rst-content tt.download .btn-mini span:first-child:before,.btn-mini .rst-content code.download span:first-child:before,.rst-content code.download .btn-mini span:first-child:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.rst-content .admonition{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.admonition{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo,.rst-content .wy-alert-warning.admonition{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title,.rst-content .wy-alert-warning.admonition .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.admonition{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.admonition{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.admonition{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a{color:#2980B9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27AE60}.wy-tray-container li.wy-tray-item-info{background:#2980B9}.wy-tray-container li.wy-tray-item-warning{background:#E67E22}.wy-tray-container li.wy-tray-item-danger{background:#E74C3C}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27AE60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980B9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27AE60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#E74C3C !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#E67E22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980B9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9B59B6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980B9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980B9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 .3125em 0;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#E74C3C}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{float:left;display:block;margin-right:2.3576515979%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.3576515979%;width:48.821174201%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.3576515979%;width:31.7615656014%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type="datetime-local"]{padding:.34375em .625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129FEA}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#E74C3C;border:1px solid #E74C3C}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#E74C3C}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#E74C3C}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type="radio"][disabled],input[type="checkbox"][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{position:absolute;content:"";display:block;left:0;top:0;width:36px;height:12px;border-radius:4px;background:#ccc;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{position:absolute;content:"";display:block;width:18px;height:18px;border-radius:4px;background:#999;left:-3px;top:-3px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27AE60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#E74C3C}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #E74C3C}.wy-control-group.wy-control-group-error textarea{border:solid 1px #E74C3C}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27AE60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#E74C3C}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#E67E22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980B9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:.3em;display:block}.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px}.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980B9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9B59B6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#E67E22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980B9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27AE60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#E74C3C !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,.rst-content .toctree-wrapper p.caption,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2,.rst-content .toctree-wrapper p.caption{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}code,.rst-content tt,.rst-content code{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;color:#E74C3C;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{margin-bottom:0}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{margin-bottom:0}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:before,.wy-breadcrumbs:after{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs li code,.wy-breadcrumbs li .rst-content tt,.rst-content .wy-breadcrumbs li tt{padding:5px;border:none;background:none}.wy-breadcrumbs li code.literal,.wy-breadcrumbs li .rst-content tt.literal,.rst-content .wy-breadcrumbs li tt.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#3a7ca8;height:32px;display:inline-block;line-height:32px;padding:0 1.618em;margin:12px 0 0 0;display:block;font-weight:bold;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li code,.wy-menu-vertical li .rst-content tt,.rst-content .wy-menu-vertical li tt{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.on a:hover span.toctree-expand,.wy-menu-vertical li.current>a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li.current>a span.toctree-expand{display:block;font-size:.8em;line-height:1.6em;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a{color:#404040}.wy-menu-vertical li.toctree-l1.current li.toctree-l2>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>ul{display:none}.wy-menu-vertical li.toctree-l1.current li.toctree-l2.current>ul,.wy-menu-vertical li.toctree-l2.current li.toctree-l3.current>ul{display:block}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{display:block;background:#c9c9c9;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l2 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l2 span.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3{font-size:.9em}.wy-menu-vertical li.toctree-l3.current>a{background:#bdbdbd;padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{display:block;background:#bdbdbd;padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand{color:gray}.wy-menu-vertical li.toctree-l3 span.toctree-expand{color:#969696}.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover span.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980B9;cursor:pointer;color:#fff}.wy-menu-vertical a:active span.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980B9;text-align:center;padding:.809em;display:block;color:#fcfcfc;margin-bottom:.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em auto;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-side-nav-search>a img.logo,.wy-side-nav-search .wy-dropdown>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search>a.icon img.logo,.wy-side-nav-search .wy-dropdown>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:normal;color:rgba(255,255,255,0.3)}.wy-nav .wy-menu-vertical header{color:#2980B9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980B9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980B9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980B9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:gray}footer p{margin-bottom:12px}footer span.commit code,footer span.commit .rst-content tt,.rst-content footer span.commit tt{padding:0px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:1em;background:none;border:none;color:gray}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{width:100%}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:before,.rst-breadcrumbs-buttons:after{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-side-scroll{width:auto}.wy-side-nav-search{width:auto}.wy-menu.wy-menu-vertical{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1100px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .wy-menu-vertical li span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.toctree-expand,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content p.caption .headerlink,.rst-content p.caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content img{max-width:100%;height:auto}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure p.caption{font-style:italic}.rst-content div.figure p:last-child.caption{margin-bottom:0px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img,.rst-content .section>a>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;display:block;overflow:auto}.rst-content pre.literal-block,.rst-content div[class^='highlight']{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px 0}.rst-content pre.literal-block div[class^='highlight'],.rst-content div[class^='highlight'] div[class^='highlight']{padding:0px;border:none;margin:0}.rst-content div[class^='highlight'] td.code{width:100%}.rst-content .linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;display:block;overflow:auto}.rst-content div[class^='highlight'] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content pre.literal-block,.rst-content div[class^='highlight'] pre,.rst-content .linenodiv pre{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;font-size:12px;line-height:1.4}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^='highlight'],.rst-content div[class^='highlight'] pre{white-space:pre-wrap}}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last,.rst-content .admonition .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .section ol p:last-child,.rst-content .section ul p:last-child{margin-bottom:24px}.rst-content .line-block{margin-left:0px;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content .toctree-wrapper p.caption .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.rst-content p.caption .headerlink,.rst-content table>caption .headerlink,.rst-content .code-block-caption .headerlink{visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content .toctree-wrapper p.caption .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after,.rst-content .code-block-caption .headerlink:after{content:"";font-family:FontAwesome}.rst-content h1:hover .headerlink:after,.rst-content h2:hover .headerlink:after,.rst-content .toctree-wrapper p.caption:hover .headerlink:after,.rst-content h3:hover .headerlink:after,.rst-content h4:hover .headerlink:after,.rst-content h5:hover .headerlink:after,.rst-content h6:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content p.caption:hover .headerlink:after,.rst-content table>caption:hover .headerlink:after,.rst-content .code-block-caption:hover .headerlink:after{visibility:visible}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#F1C40F;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:baseline;position:relative;top:-0.4em;line-height:0;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:gray}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.docutils.citation tt,.rst-content table.docutils.citation code,.rst-content table.docutils.footnote tt,.rst-content table.docutils.footnote code{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}.rst-content table.docutils td .last,.rst-content table.docutils td .last :last-child{margin-bottom:0}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content tt,.rst-content tt,.rst-content code{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace;padding:2px 5px}.rst-content tt big,.rst-content tt em,.rst-content tt big,.rst-content code big,.rst-content tt em,.rst-content code em{font-size:100% !important;line-height:normal}.rst-content tt.literal,.rst-content tt.literal,.rst-content code.literal{color:#E74C3C}.rst-content tt.xref,a .rst-content tt,.rst-content tt.xref,.rst-content code.xref,a .rst-content tt,a .rst-content code{font-weight:bold;color:#404040}.rst-content pre,.rst-content kbd,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",Courier,monospace}.rst-content a tt,.rst-content a tt,.rst-content a code{color:#2980B9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold;margin-bottom:12px}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980B9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:#555}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) tt,.rst-content dl:not(.docutils) code{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname,.rst-content dl:not(.docutils) tt.descclassname,.rst-content dl:not(.docutils) code.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) code.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27AE60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}.rst-content tt.download,.rst-content code.download{background:inherit;padding:inherit;font-weight:normal;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content tt.download span:first-child,.rst-content code.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content tt.download span:first-child:before,.rst-content code.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}.math{text-align:center}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-regular.eot");src:url("../fonts/Lato/lato-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-regular.woff2") format("woff2"),url("../fonts/Lato/lato-regular.woff") format("woff"),url("../fonts/Lato/lato-regular.ttf") format("truetype");font-weight:400;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bold.eot");src:url("../fonts/Lato/lato-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bold.woff2") format("woff2"),url("../fonts/Lato/lato-bold.woff") format("woff"),url("../fonts/Lato/lato-bold.ttf") format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-bolditalic.eot");src:url("../fonts/Lato/lato-bolditalic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-bolditalic.woff2") format("woff2"),url("../fonts/Lato/lato-bolditalic.woff") format("woff"),url("../fonts/Lato/lato-bolditalic.ttf") format("truetype");font-weight:700;font-style:italic}@font-face{font-family:"Lato";src:url("../fonts/Lato/lato-italic.eot");src:url("../fonts/Lato/lato-italic.eot?#iefix") format("embedded-opentype"),url("../fonts/Lato/lato-italic.woff2") format("woff2"),url("../fonts/Lato/lato-italic.woff") format("woff"),url("../fonts/Lato/lato-italic.ttf") format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:400;src:url("../fonts/RobotoSlab/roboto-slab.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-regular.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-regular.ttf") format("truetype")}@font-face{font-family:"Roboto Slab";font-style:normal;font-weight:700;src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot");src:url("../fonts/RobotoSlab/roboto-slab-v7-bold.eot?#iefix") format("embedded-opentype"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff2") format("woff2"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.woff") format("woff"),url("../fonts/RobotoSlab/roboto-slab-v7-bold.ttf") format("truetype")} + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.rst-content .wy-breadcrumbs li tt,.wy-breadcrumbs li .rst-content tt,.wy-breadcrumbs li code{padding:5px;border:none;background:none}.rst-content .wy-breadcrumbs li tt.literal,.wy-breadcrumbs li .rst-content tt.literal,.wy-breadcrumbs li code.literal{color:#404040}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{font-size:inherit;line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dl:not(.field-list)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js index b33f87f..8cbf1b1 100644 --- a/docs/_build/html/_static/doctools.js +++ b/docs/_build/html/_static/doctools.js @@ -4,7 +4,7 @@ * * Sphinx JavaScript utilities for all documentation. * - * :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -29,9 +29,14 @@ if (!window.console || !console.firebug) { /** * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL */ jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); }; /** @@ -283,10 +288,12 @@ var Documentation = { }, initOnKeyListeners: function() { - $(document).keyup(function(event) { + $(document).keydown(function(event) { var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + // don't navigate when in search box, textarea, dropdown or button + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' + && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey + && !event.shiftKey) { switch (event.keyCode) { case 37: // left var prevHref = $('link[rel="prev"]').prop('href'); @@ -294,12 +301,14 @@ var Documentation = { window.location.href = prevHref; return false; } + break; case 39: // right var nextHref = $('link[rel="next"]').prop('href'); if (nextHref) { window.location.href = nextHref; return false; } + break; } } }); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js index 8ad595c..5a94801 100644 --- a/docs/_build/html/_static/documentation_options.js +++ b/docs/_build/html/_static/documentation_options.js @@ -1,9 +1,11 @@ var DOCUMENTATION_OPTIONS = { URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.4.1', + VERSION: '2.0.0', LANGUAGE: 'None', COLLAPSE_INDEX: false, + BUILDER: 'html', FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', NAVIGATION_WITH_KEYS: false diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js index 644d35e..b061403 100644 --- a/docs/_build/html/_static/jquery.js +++ b/docs/_build/html/_static/jquery.js @@ -1,4 +1,2 @@ -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), -null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" - - - - - - - - - - - - - - - + + + + Development — Django Ditto 2.0.0 documentation + + + + + + + + + - - - +

- -
- - -
- + + + - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index 432f558..146eb5f 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -1,70 +1,34 @@ - - - - - + - - - - - Index — Django Ditto 1.4.1 documentation - - - - - - - - - - - - - - - - - - - - - + + + Index — Django Ditto 2.0.0 documentation + + + - - + + + + + - - - +
- -
- - -
- - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html index b38c848..d115c83 100644 --- a/docs/_build/html/index.html +++ b/docs/_build/html/index.html @@ -1,70 +1,36 @@ - - - - + - - - - - Django Ditto: Documentation — Django Ditto 1.4.1 documentation - - - - - - - - - - - - - - - - - - - - - - - - + + + + Django Ditto: Documentation — Django Ditto 2.0.0 documentation + + + + + + + + + - - - +
- -
- - -
- - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/installation.html b/docs/_build/html/installation.html index 28c5afa..bb2dfe3 100644 --- a/docs/_build/html/installation.html +++ b/docs/_build/html/installation.html @@ -1,71 +1,37 @@ - - - - + - - - - - Installation — Django Ditto 1.4.1 documentation - - - - - + + + + Installation — Django Ditto 2.0.0 documentation + + + - - - - - - - - - - - - - - - - - - + + + + + - - - +
- -
- - -
-
-

Add to INSTALLED_APPS

+ +
+

Add to INSTALLED_APPS

To use Ditto in your own project (untested as yet), add the core ditto.core application to your project’s INSTALLED_APPS in your settings.py, and add the applications for the services you need. This example includes Flickr, Last.fm, Pinboard and Twitter:

INSTALLED_APPS = (
     # other apps listed here.
@@ -232,12 +150,12 @@ 

Add to INSTALLED_APPS)

-
-
-

Add to urls.py

+ +
+

Add to urls.py

To use Ditto’s supplied views you can include each app’s URLs in your project’s own urls.py. Note that each app requires the correct namespace (flickr, lastfm, pinboard or twitter), eg:

-
from django.urls import include, path
-from django.contrib import admin
+
from django.urls import include, path
+from django.contrib import admin
 
 urlpatterns = [
     path("admin/", include(admin.site.urls)),
@@ -261,12 +179,12 @@ 

Add to urls.pytwitter

  • ditto (The Ditto Core URLs)

  • -

    -
    +
    +

    Settings

    There are some optional settings that can be placed in your project’s settings.py.

    -
    -

    Core settings

    +
    +

    Core settings

    The ditto.core app has some optional settings for customing the formats used to display dates and times in the default templates (and the ditto_core.display_time() template tag). The formats are those used for strftime. Here they are, with their default values:

    # e.g. "07:34"
     DITTO_CORE_TIME_FORMAT = '%H:%M'
    @@ -289,9 +207,9 @@ 

    Core settingsDITTO_CORE_DATE_YEAR_MONTH_FORMAT = '%b %Y'

    -
    -
    +
    +

    Service-specific settings

    In addition, some of the other apps have their own optional settings. They’re described in detail in each service’s documentation.

    This is the complete list of service-specific settings with their default values:

    DITTO_FLICKR_DIR_BASE = 'flickr'
    @@ -302,69 +220,51 @@ 

    Service-specific settingsDITTO_TWITTER_USE_LOCAL_MEDIA = False

    -
    -
    -

    Other optional settings

    + +
    +

    Other optional settings

    To have large numbers formatted nicely in the included templates, ensure these are in your settings.py:

    USE_L10N = True
     USE_THOUSAND_SEPARATOR = True
     
    -
    - -
    -

    Set up each service

    + + +
    +

    Set up each service

    Each service (such as Flickr or Twitter) you want to use will require some set-up in order to link your account(s) on the service with Django Ditto. See the documentation for each service for how to do this.

    -
    - + + - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/introduction.html b/docs/_build/html/introduction.html index af29f44..95e9a35 100644 --- a/docs/_build/html/introduction.html +++ b/docs/_build/html/introduction.html @@ -1,71 +1,37 @@ - - - - + - - - - - Introduction — Django Ditto 1.4.1 documentation - - - - - - - - - - - - - - - - - - - - - - - - + + + + Introduction — Django Ditto 2.0.0 documentation + + + + + + + + + - - - +
    - -
    - - -
    - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv index 9e1c4ff..3f4631e 100644 --- a/docs/_build/html/objects.inv +++ b/docs/_build/html/objects.inv @@ -1,6 +1,5 @@ # Sphinx inventory version 2 # Project: Django Ditto -# Version: 1.4 +# Version: 2.0 # The remainder of this file is compressed using zlib. -xڕMn bvTfmUH ;X ۡy7|i{G=ca͎~Ɔ⊜kR1 \ No newline at end of file +xڕMn :UY[*56-? qSyǼyz v Rb/,3Y޵-@j%g_hfXA)վn T⠿H)àGzhHFI^ÑkɍR"=--?- 5sȔ9'+ފ3ŲzCDb%ZFqauҜ,# ge7[̔v>h9~ג/Ù,b]&7՚ܤJ"Xeuc/ ᕦcxph} \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html index af3500b..c1afb61 100644 --- a/docs/_build/html/search.html +++ b/docs/_build/html/search.html @@ -1,70 +1,37 @@ - - - - + - - - - - Search — Django Ditto 1.4.1 documentation - - - - - - - - - - + + + Search — Django Ditto 2.0.0 documentation + + - - - - - - - - - - - - - - + + + + + + + + + - - - +
    - -
    - - -
    - - - - - - - - - - - + diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index dca54e3..53daead 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["development","index","installation","introduction","services/flickr","services/lastfm","services/pinboard","services/twitter"],envversion:{"sphinx.domains.c":1,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":1,"sphinx.domains.javascript":1,"sphinx.domains.math":2,"sphinx.domains.python":1,"sphinx.domains.rst":1,"sphinx.domains.std":1,sphinx:56},filenames:["development.rst","index.rst","installation.rst","introduction.rst","services/flickr.rst","services/lastfm.rst","services/pinboard.rst","services/twitter.rst"],objects:{},objnames:{},objtypes:{},terms:{"0ee894a3438233848e6e9d85e1985260":4,"1234567_987654_o":4,"12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66":7,"27289611500_d0debff24e_m":4,"27289611500_d21f6f47a0_o":4,"35034346050n01":4,"512mb":4,"5a726ea25d3bbd1b35b21b8b61b98c4c":7,"case":[0,4,5,7],"default":[2,4,5,6,7],"final":[4,7],"import":[2,4,6],"long":5,"new":[0,4,5,6,7],"public":[3,4,6,7],"return":[4,5,6,7],"static":4,"switch":[4,7],"true":[2,4,7],"try":[3,4,6,7],"var":[4,7],"while":[5,7],And:[3,4,5,7],But:7,For:[1,3,4,5,7],Its:[5,7],One:7,The:[2,3,4,5,6,7],Their:4,Then:[0,5,6],There:[0,2,4,5,6,7],These:[4,5,7],Use:7,Used:2,Using:0,Yes:7,__init__:0,abl:4,about:[2,4,6,7],abov:[2,4,5,6,7],access:[4,7],accord:7,account:[2,3,5,6],across:[6,7],actual:7,add:[0,1,4,5,6,7],added:[6,7],adding:[4,5],addit:2,admin:[2,3,4,5,6,7],aesthet:6,after:[0,3,4,7],again:[4,7],against:0,aggreg:[2,5],album:[3,4],all:[0,3,4,5,6,7],allow:4,alread:6,alreadi:7,also:[0,4,5,6,7],alter:5,altern:4,although:7,alwai:[4,7],ani:[4,5,7],anim:[3,7],animated_gif:7,annual_bookmark_count:6,annual_favorite_count:7,annual_photo_count:4,annual_scrobble_count:5,annual_tweet_count:7,anoth:5,anyon:7,anyth:5,api:[4,5,6,7],app:[0,1,2,3,4,5,6,7],app_nam:2,appear:5,appli:4,applic:[2,7],appropri:2,apr:2,archiv:[3,7],aren:[5,7],argument:5,around:5,art:5,artist:3,assig:[4,7],associ:[4,5,7],assum:[0,5],attach:7,attribut:4,author:4,avail:[0,4,5,6,7],avatar:[4,7],avoid:7,awar:6,back:[4,7],bang:5,bare:3,basic:0,becaus:5,been:[4,5,7],befor:[4,7],behav:5,behaviour:4,being:[4,5],below:[4,7],best:4,between:[4,5,7],bit:7,bone:3,bookmark:3,bookmarktag:6,boomark:6,bootstrap:3,both:[2,4,5,6,7],browser:4,brut:5,bug:4,build:0,button:7,cach:[4,7],calendar:5,call:7,callback:7,can:[0,2,3,4,5,6,7],cannot:5,caus:5,caution:7,certain:5,chang:[0,2,4,5,6,7],charact:7,chart:5,check:0,choos:[4,7],chrome:0,cjucdvlxiaalhyz:7,clarifi:3,click:7,code:4,collect:[1,3],com:[4,6,7],combin:3,come:7,command:[1,3],commit:0,common:[3,4,5,6],complet:[2,7],concept:7,conf:2,confus:7,connect:5,construct:5,consum:7,contain:[0,4],contrib:2,convert:7,copi:[1,3,7],correct:[2,7],could:[0,3,4,5,7],count_bi:4,counter:5,cours:[4,6,7],cover:1,creat:[3,4,5,6,7],creativ:4,creativecommon:4,credenti:[4,7],credential:[4,7],crxefbewuaa6tai:7,current:[3,4,6],custom:[2,6],customis:[4,7],dai:3,data:[3,4,5,6,7],date:[0,2,3,4,5,6,7],datetim:[4,5,6,7],day_bookmark:6,day_favorit:7,day_photo:4,day_scrobbl:5,day_tweet:7,deactiv:0,defin:[4,7],delet:4,depend:4,deprec:7,describ:2,descript:[6,7],detail:[2,4],develop:1,devproject:[0,2,3],differ:[4,5,6,7],differenti:[4,5,7],digit:4,direct:[4,5,7],directli:5,directori:[0,4,7],displai:[1,2,3,4,6,7],display_tim:2,ditto:[0,4,5,6,7],ditto_cor:2,ditto_core_date_format:2,ditto_core_date_year_format:2,ditto_core_date_year_month_format:2,ditto_core_datetime_format:2,ditto_core_time_format:2,ditto_flickr:4,ditto_flickr_dir_bas:[2,4],ditto_flickr_dir_photos_format:[2,4],ditto_flickr_use_local_media:[2,4],ditto_lastfm:5,ditto_pinboard:6,ditto_twitt:7,ditto_twitter_dir_bas:[2,7],ditto_twitter_use_local_media:[2,7],django19:0,django:[0,3,4,5,6,7],doc:0,document:2,doe:[3,7],doesn:[3,4,5],don:[4,7],done:7,download:[2,4,5,6,7],duplic:5,dure:5,each:[1,3,4,5,6,7],earliest:5,easi:4,easier:[0,4],either:5,elsewher:1,email:3,emili:5,empti:7,end:7,endfor:[4,5,6,7],enough:[0,5],ensur:[0,2,4,7],enter:[4,5],entiti:5,environ:0,equival:4,especi:[4,7],etc:[3,4,5,7],even:[4,7],everi:7,exactli:5,exampl:[2,3,4,5,6,7],except:7,exercis:7,exif:4,exist:5,expect:5,face:[4,6,7],fals:[2,4,7],famili:4,farm8:4,favorit:[3,4],favorite_object:7,fetch:3,fetch_flickr_account_us:4,fetch_flickr_origin:4,fetch_flickr_photo:4,fetch_flickr_photoset:4,fetch_lastfm_scrobbl:5,fetch_pinboard_bookmark:6,fetch_twitter_account:7,fetch_twitter_favorit:7,fetch_twitter_fil:7,fetch_twitter_tweet:7,few:[4,7],field:7,file:[3,4],filter:[4,5,6,7],find:4,fine:7,first:[4,5,7],first_day_of_week:5,flickr:[0,1,2,3,6],flickr_author:4,folder:[4,7],follow:4,forc:[4,7],forloop:5,format:2,found:7,four:7,friend:4,friendli:4,from:[1,2,3,4,5,6,7],full:[2,5,7],fulli:[4,7],futur:[3,4,7],gener:[0,4,7],get:[0,4,5,6,7],gif:[3,7],git:0,github:[1,4],give:5,googl:0,gyford:[3,5],has:[2,4,5,7],hasn:4,have:[0,2,4,5,6,7],haven:[4,7],height:4,here:[2,4,5,6,7],homebrew:2,homeviewtest:0,host:[4,7],how:2,howev:7,href:[4,6],html:[0,4],htmlcov:0,http:[4,5,6,7],ident:5,identifi:5,idgettr:4,ignor:[4,7],imag:[2,3,4,7],imagekit:[2,4,7],img:4,import_twitter_tweet:7,includ:[0,1,2,4,6,7],increas:5,index:0,indic:4,inform:4,ini:0,insensit:5,instal:[0,1,4],installed_app:[1,4,7],instead:[0,4,7],instruct:4,integ:[4,5,6,7],introduct:1,isn:7,issu:3,item:3,its:[0,2,3,4,5,6,7],itself:4,jpg:[4,7],json:3,kane:5,keep:3,kei:[4,5,7],kill:4,kind:7,larg:2,large_square_height:4,large_square_url:4,large_square_width:4,last:[1,2,3,7],lastfm:[2,5],latest:[3,7],least:7,leav:7,level:4,libjpeg:2,like:[0,3,4,6,7],limit:[4,5,6,7],line:4,link:[2,4,6,7],list:[2,4,5,7],listen:5,load:[4,5,6,7],local:[2,4,7],locat:[4,7],loop:5,lot:[3,4,7],lowercas:5,mac:2,macbook:4,machin:4,mai:[2,4,7],main:[4,7],make:[0,3,4],manag:[0,1,3],mangaer:4,mani:[4,7],march:5,mark:[4,6],match:[5,6],matter:[4,7],max_post_tim:5,maximum:5,mayb:3,mbid:5,mean:0,media:4,media_root:[4,7],media_typ:[4,7],method:5,might:[0,3,4,7],migrat:0,min_post_tim:5,mind:[4,7],minim:3,minimum:5,minut:[4,7],model:[1,3],moment:4,month:[2,5],more:[3,4,5,6,7],most:[3,4,5,6,7],mp4:7,music:5,musicbrainz:5,must:7,my_avatar:7,my_dat:[4,5,6,7],n01:4,name:[5,6,7],namespac:2,need:[0,2,4,7],newli:5,next:7,nice:2,non:[3,7],noncommerci:4,note:[1,2,4,6,7],now:[4,5,7],nsid:4,num_tim:6,number:[0,2,4,5,6,7],object:[3,4,5,6,7],objects_with_account:4,occas:4,occur:5,ocean:4,often:7,older:7,omit:7,onc:[4,6,7],one:[0,3,4,5,6,7],ones:[3,5],onli:[0,2,3,4,5,6,7],open:0,option:[4,5,7],order:[2,4,5],order_bi:5,org:4,organis:7,origin:[3,7],original_slug:5,other:[1,3,4,5,6,7],our:[4,7],out:[4,7],output:0,over:4,overal:[2,3],overwritten:3,own:[2,3,4,7],page:[4,6,7],paramet:4,part:2,parti:3,particular:[3,4,5,6,7],pass:4,password:6,past:[4,5],path:[0,2,4,7],pbs:7,per:[4,5,6,7],period:[5,6,7],permiss:4,person:7,phil:[3,7],philgyford:[6,7],photo:[2,3,7],photo_licens:4,photo_object:4,photoset:3,photoset_list:4,pillow:1,pinboard:[1,2,3],pip:[0,2,4],pipenv:0,pipfil:0,place:[2,4],plural:7,png:7,point:7,popul:7,popular:5,popular_bookmark_tag:6,possibl:3,post:[4,6,7],post_tim:[4,5],prerequisit:2,previou:5,primary_photo:4,print:5,privaci:7,privat:[3,4,6,7],process:4,produc:5,profil:[4,7],progress:3,project:[0,2,4,7],properti:[4,5,7],provid:[3,5],public_:[4,7],public_favorite_object:7,public_object:[4,6,7],public_photo_object:4,public_to_read_object:6,public_toread_object:6,public_tweet_object:7,publish:0,py35:0,pypi:1,python:[0,3,4],quantiti:[5,7],queryset:5,rate:[6,7],rather:4,read:6,rebuild:0,recent:3,recent_bookmark:6,recent_favorit:7,recent_photo:4,recent_scrobbl:5,recent_tweet:7,reflect:7,relat:[4,5],relationship:[4,5,7],relev:7,reliabl:5,remov:[4,7],repeatedli:3,replac:[2,4,7],report:0,repres:[4,5,7],request:[4,7],requir:[2,3,4,7],reserv:4,resiz:[4,7],restrict:[4,5,6,7],result:[4,5],retweet:7,right:4,rock:5,roll:5,row:[4,5,6,7],rst:0,run:[0,4,7],runserv:0,safe:[5,7],same:[3,4,5,7],save:[3,4,7],screen:7,screen_nam:7,screenshot:3,script:4,scrobbl:3,scrobble_count:5,search:5,secret:[4,7],see:[0,2,3,4,5,6,7],seem:5,sens:3,separ:[6,7],serv:[4,7],servic:[1,4,6],set:[0,1],setup:0,sever:[4,5,6,7],sharealik:4,should:[4,6,7],shown:[4,7],similar:[5,7],similarli:[5,7],simpl:4,simpler:6,simpli:7,sinc:[5,7],singl:[3,4,5,6,7],site:[1,2,3,4,7],size:[4,7],slow:[4,7],slug:[5,6],small:[4,7],small_height:4,small_url:[4,7],small_width:4,snapshot:3,some:[2,3,5],someth:[3,4,7],sometim:7,sorri:7,sort:5,sortedm2m:2,sourc:0,specif:0,specifi:[0,4],sphinx:0,sqlite:5,src:4,standard:7,start:[4,7],still:[0,4],store:[3,4,5,6,7],strftime:2,string:5,subsequ:5,suit:2,sundai:5,suppli:[2,3,5],support:1,sync:3,system:[4,7],tag:[0,1,2,3],tag_detail:6,taggedbookmark:6,taggedphoto:4,taggit:[2,6],take:[5,7],taken:4,taken_tim:4,templat:[1,2,3],termin:[0,4],test:1,test_home_templ:0,test_view:0,text_html:7,than:[4,7],thei:[2,4,6,7],them:[1,4,6,7],themselv:4,thi:[0,2,3,4,5,6,7],thing:[0,1,3,4,5,7],think:7,third:3,those:[2,4,7],three:4,through:[4,5,6],time:[2,4,5,7],titl:[4,6],todai:5,token:[2,6,7],too:7,took:4,top_album:5,top_artist:5,top_track:5,toread_object:6,total:[4,5,6],tox:0,track:3,travi:0,tumblr:6,tweet:3,tweet_object:7,tweet_video:7,twet:7,twimg:7,twitter:[1,2,3,6],two:[2,4,6,7],type:[4,6,7],under:2,unicod:5,untest:2,until:7,unzip:7,updat:5,update_twitter_tweet:7,update_twitter_us:7,upload:[3,4,7],url:[1,3,4,5,6,7],urlpattern:2,usag:0,use:[2,3,4,5,6,7],use_l10n:2,use_thousand_separ:2,used:[2,3,4,5,6,7],useful:5,user:[3,6],usernam:[5,6],uses:[2,4,5,7],using:[0,2,3,4,7],usual:[4,6,7],valu:[2,4,7],variant:4,veri:4,version:[0,2,4,5,6,7],video:[2,3,4,7],video_url:7,view:[2,3,5,7],virtualenv:0,visibl:3,wai:[3,5,6,7],want:[2,3,4,7],web:[4,7],webpag:7,week:5,were:[4,7],what:[1,4,7],when:[2,4,5,7],whenev:[4,7],wherev:4,whether:[4,6,7],which:[0,2,4,5,7],who:[4,7],whole:3,whose:7,width:4,with_scrobble_count:5,within:[4,7],without:0,won:[5,6,7],work:[0,5,7],worri:2,worth:7,would:[2,4,5,7],www:[4,5,7],xcode:2,year:[2,4,5,6,7],yet:[2,4,7],you:[0,2,3,4,5,6,7],your:[1,2,3,4,5,6,7],zlib:2},titles:["Development","Django Ditto: Documentation","Installation","Introduction","Flickr","Last.fm","Pinboard","Twitter"],titleterms:{"import":7,account:[4,7],add:2,album:5,annual:[4,5,6,7],artist:5,bookmark:6,command:[4,5,6,7],core:2,count:[4,5,6,7],cover:3,coverag:0,dai:[4,5,6,7],develop:0,ditto:[1,2,3],django:[1,2],document:[0,1],each:2,favorit:7,fetch:[4,5,6,7],file:7,flickr:4,includ:3,instal:2,installed_app:2,introduct:3,last:5,licens:4,manag:[4,5,6,7],media:7,model:[4,5,6,7],note:0,option:2,origin:4,other:[0,2],packag:0,photo:4,photoset:4,pillow:2,pinboard:6,popular:6,recent:[4,5,6,7],scrobbl:5,servic:[2,3],set:[2,4,5,6,7],specif:2,tag:[4,5,6,7],templat:[4,5,6,7],test:0,top:5,track:5,tweet:7,twitter:7,updat:7,url:2,user:[4,7],what:3}}) \ No newline at end of file +Search.setIndex({docnames:["development","index","installation","introduction","services/flickr","services/lastfm","services/pinboard","services/twitter"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":4,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":3,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["development.rst","index.rst","installation.rst","introduction.rst","services/flickr.rst","services/lastfm.rst","services/pinboard.rst","services/twitter.rst"],objects:{},objnames:{},objtypes:{},terms:{"0":[4,5],"000":[4,7],"01":7,"03":5,"031":7,"05":4,"06":[4,6],"07":2,"08":4,"09":4,"0ee894a3438233848e6e9d85e1985260":4,"1":[0,4,7],"10":[4,5,6,7],"12345678":7,"1234567_987654_o":4,"123456_abcdef":7,"123456abcdef":7,"15":7,"2":[3,4],"20":6,"200":7,"2015":6,"2016":[4,5],"2018":2,"2019":7,"2022":7,"24":5,"27289611500_d0debff24e_m":4,"27289611500_d21f6f47a0_o":4,"3":[0,3,4,5,7],"30":5,"300":4,"31":[4,7],"34":2,"35034346050":4,"35034346050n01":4,"4":3,"46":4,"5":[0,4,5,6,7],"500":4,"512mb":4,"56":7,"5a726ea25d3bbd1b35b21b8b61b98c4c":7,"6":[3,7],"6t":7,"7442":4,"75":4,"78":7,"8":2,"9":[0,3],"90":4,"case":[0,4,5,7],"default":[2,4,5,6,7],"do":[0,2,3,4,7],"final":[4,7],"import":[2,4,6],"long":5,"new":[0,4,5,6,7],"public":[3,4,6,7],"return":[4,5,6,7],"static":4,"switch":[4,7],"true":[2,4,7],"try":[3,4,6,7],"var":[4,7],"while":[5,7],A:[1,3,4,5,6,7],And:[3,4,5,7],Be:6,But:7,By:[4,5,6,7],For:[3,4,5,7],If:[2,3,4,7],In:[0,2,4,5,6,7],It:[3,4,5,6,7],Its:[5,7],No:4,Of:[4,6,7],On:[2,4,7],One:7,Or:[2,3,4,6,7],The:[2,3,4,5,6,7],Their:4,Then:[0,5,6],There:[0,2,4,5,6,7],These:[4,5,7],To:[0,2,4,5,6,7],__init__:0,abl:4,about:[2,4,6,7],abov:[2,4,5,6,7],access:[4,7],accord:7,account:[2,3,5,6],across:[6,7],actual:7,ad:[4,5,6,7],add:[0,1,4,5,6,7],addit:2,admin:[2,3,4,5,6,7],aesthet:6,after:[0,3,4,7],again:[4,7],against:0,aggreg:[2,5],album:[3,4],all:[0,3,4,5,6,7],allow:4,alread:6,alreadi:7,also:[0,4,5,6,7],alter:5,altern:4,although:7,alwai:[4,7],an:[0,2,4,5,6,7],ani:[4,5,7],anim:[3,7],animated_gif:7,annual_bookmark_count:6,annual_favorite_count:7,annual_photo_count:4,annual_scrobble_count:5,annual_tweet_count:7,anoth:5,anyon:7,anyth:5,api:[4,5,6,7],app:[0,1,2,3,4,5,6,7],app_nam:2,appear:5,appli:[4,7],applic:2,appropri:2,approv:7,apr:2,ar:[0,2,3,4,5,6,7],archiv:[3,7],aren:[5,7],argument:[5,7],around:5,art:5,artist:3,assig:[4,7],associ:[4,5,7],assum:[0,5],attach:7,attribut:4,author:4,avail:[0,4,5,6,7],avatar:[4,7],avoid:7,awar:6,ay:7,b:[2,7],back:[4,7],bang:5,bare:3,basic:0,becaus:[5,7],been:[4,5,7],befor:[4,7],behav:5,behaviour:4,being:[4,5],below:[4,7],best:4,between:[4,5,7],bit:7,bone:3,bookmark:3,bookmarktag:6,boomark:6,bootstrap:3,both:[2,4,5,6,7],br:[4,7],browser:4,brut:5,bug:4,build:0,button:7,cach:[4,7],calendar:5,call:7,can:[0,2,3,4,5,6,7],cannot:5,caus:5,caution:7,cd:0,certain:5,chang:[0,2,4,5,6,7],changelog:0,charact:7,chart:5,check:0,choos:[4,7],chrome:0,cjucdvlxiaalhyz:7,clarifi:3,click:7,code:4,collect:[1,3],com:[4,6,7],combin:3,come:7,command:[1,3],commit:0,common:[3,4,5,6],complet:[2,7],concept:7,conf:2,confus:7,connect:5,construct:5,contain:[0,4,7],contrib:2,convert:7,copi:[1,3,7],correct:[2,7],could:[0,3,4,5,7],count_bi:4,counter:5,cours:[4,6,7],cover:1,creat:[3,4,5,6,7],creativ:4,creativecommon:4,credenti:[4,7],credential:[4,7],crxefbewuaa6tai:7,csv:7,current:[3,4,6,7],custom:[2,6],customis:[4,7],d1:5,d2:5,d:[2,4],dai:3,data:[3,4,5,6,7],date:[0,2,3,4,5,6,7],datetim:[4,5,6,7],day_bookmark:6,day_favorit:7,day_photo:4,day_scrobbl:5,day_tweet:7,deactiv:0,defin:[4,7],delet:4,depend:4,deprec:7,describ:2,descript:[6,7],detail:[2,4,7],develop:7,devproject:[0,2,3],differ:[4,5,6,7],differenti:[4,5,7],digit:4,direct:[4,5,7],directli:5,directori:[0,4,7],displai:[1,2,3,4,6,7],display_tim:2,ditto:[0,4,5,6,7],ditto_cor:2,ditto_core_date_format:2,ditto_core_date_year_format:2,ditto_core_date_year_month_format:2,ditto_core_datetime_format:2,ditto_core_time_format:2,ditto_flickr:4,ditto_flickr_dir_bas:[2,4],ditto_flickr_dir_photos_format:[2,4],ditto_flickr_use_local_media:[2,4],ditto_lastfm:5,ditto_pinboard:6,ditto_twitt:7,ditto_twitter_dir_bas:[2,7],ditto_twitter_use_local_media:[2,7],django19:0,django:[0,3,4,5,6,7],doc:0,document:2,doe:[3,7],doesn:[3,4,5],don:[4,7],done:7,down:7,download:[2,4,5,6,7],download_your_data:7,duplic:5,dure:5,e:[0,2,4,5],each:[1,3,4,5,6,7],earli:7,earliest:5,easi:4,easier:[0,4],edit:7,eg:[0,2,3,4,5,6,7],either:5,elev:7,email:3,emili:5,en:7,end:7,endfor:[4,5,6,7],enough:[0,5],ensur:[0,2,4,7],enter:[4,5],entiti:5,environ:0,equival:4,especi:[4,7],etc:[3,4,5,7],even:[4,7],everi:7,exactli:5,exampl:[2,3,4,5,6,7],except:7,exercis:7,exif:4,exist:5,expect:5,face:[4,6,7],fals:[2,4,7],famili:4,farm8:4,favorit:[3,4],favorite_object:7,fetch:3,fetch_flickr_account_us:4,fetch_flickr_origin:4,fetch_flickr_photo:4,fetch_flickr_photoset:4,fetch_lastfm_scrobbl:5,fetch_pinboard_bookmark:6,fetch_twitter_account:7,fetch_twitter_favorit:7,fetch_twitter_fil:7,fetch_twitter_tweet:7,few:[4,7],field:7,file:[3,4],filter:[4,5,6,7],find:4,fine:7,first:[4,5,7],first_day_of_week:5,five:7,flickr:[0,1,2,3,6],flickr_author:4,fm:[1,2,3],folder:[4,7],follow:4,forc:[4,7],forloop:5,format:[2,7],found:7,four:7,friend:4,friendli:4,from:[1,2,3,4,5,6,7],full:[2,5,7],fulli:[4,7],futur:[3,4,7],g:[2,4,5],gener:[0,4,7],get:[0,4,5,6,7],gif:[3,7],git:0,github:[1,4],give:5,go:7,googl:0,gyford:[3,5],h:2,ha:[2,4,5,7],hasn:4,have:[0,2,4,5,6,7],haven:[4,7],height:4,here:[2,4,5,6,7],homebrew:2,homeviewtest:0,host:[4,7],how:2,howev:7,href:[4,6],html:[0,4,7],htmlcov:0,http:[4,5,6,7],i:[2,3,7],id:[4,7],ident:5,identifi:5,idgettr:4,ie:7,ignor:[4,7],imag:[2,3,4,7],imagekit:[2,4,7],img:4,import_twitter_tweet:7,includ:[0,1,2,4,6,7],increas:5,index:[0,7],indic:4,inform:4,ini:0,insensit:5,instal:[0,1,4],installed_app:[1,4,7],instead:[0,4,7],instruct:4,integ:[4,5,6,7],introduct:1,isn:7,issu:3,item:3,its:[0,2,3,4,5,6,7],itself:4,jpg:[4,7],json:3,kane:5,keep:3,kei:[4,5,7],kill:4,kind:7,larg:2,large_square_height:4,large_square_url:4,large_square_width:4,last:[1,2,3,7],lastfm:[2,5],latest:[3,7],least:7,level:4,lh:7,libjpeg:2,like:[0,3,4,6,7],limit:[4,5,6,7],line:4,link:[2,4,6,7],list:[2,4,5,7],listen:5,ll:[0,3,4,7],load:[4,5,6,7],local:[2,4,7],locat:[4,7],loop:5,lot:[3,4,7],lowercas:5,m:[2,4],mac:2,macbook:4,machin:4,mai:[2,4,7],main:[4,7],make:[0,3,4,7],manag:[0,1,3],mangaer:4,mani:[4,7],march:5,mark:[4,6],match:[5,6],matter:[4,7],max_post_tim:5,maximum:5,mayb:3,mbid:5,md:0,me:[2,4],mean:0,media:4,media_root:[4,7],media_typ:[4,7],method:5,might:[0,3,4,7],migrat:0,min_post_tim:5,mind:[4,7],minim:3,minimum:5,minut:[4,7],model:[1,3],moment:4,month:[2,5],more:[3,4,5,6,7],most:[3,4,5,6,7],mp4:7,music:5,musicbrainz:5,must:7,my:4,my_avatar:7,my_dat:[4,5,6,7],n01:4,name:[5,6,7],namespac:2,nc:4,need:[0,2,4,7],newli:5,nice:2,non:[3,7],noncommerci:4,note:[1,2,4,6,7],now:[4,5,7],nsid:4,num_tim:6,number:[0,2,4,5,6,7],object:[3,4,5,6,7],objects_with_account:4,occas:4,occur:5,ocean:4,often:7,ok:0,older:7,omit:7,onc:[4,6,7],one:[0,3,4,5,6,7],ones:[3,5],onli:[0,2,3,4,5,6,7],open:0,option:[4,5,7],order:[2,4,5],order_bi:5,org:4,organis:7,origin:[3,7],original_slug:5,other:[1,3,4,5,6,7],our:[4,7],out:[4,7],output:0,over:4,overal:[2,3],overwritten:3,own:[2,3,4,7],p:[4,5,6,7],page:[4,6,7],paramet:4,part:2,parti:3,particular:[3,4,5,6,7],pass:4,password:6,past:[4,5],path:[0,2,4,7],pb:7,per:[4,5,6,7],period:[5,6,7],permiss:4,person:7,phil:3,philgyford:[6,7],photo:[2,3,7],photo_licens:4,photo_object:4,photoset:3,photoset_list:4,pillow:1,pinboard:[1,2,3],pip:[0,2,4],pipenv:0,pipfil:0,place:[2,4],plural:7,png:7,point:7,popul:7,popular:5,popular_bookmark_tag:6,portal:7,possibl:3,post:[4,6,7],post_tim:[4,5],prerequisit:2,previou:5,primary_photo:4,print:5,privaci:7,privat:[3,4,6,7],process:4,produc:5,product:7,profil:[4,7],progress:3,project:[0,2,4,7],properti:[4,5,7],provid:[3,5],public_:[4,7],public_favorite_object:7,public_object:[4,6,7],public_photo_object:4,public_to_read_object:6,public_toread_object:6,public_tweet_object:7,publish:0,py35:0,py:[0,1,4,5,6,7],pypi:1,python:[0,3,4],quantiti:[5,7],queryset:5,r:2,rate:[6,7],rather:[4,7],re:[0,2,4,5,6,7],read:6,readm:7,rebuild:0,recent:3,recent_bookmark:6,recent_favorit:7,recent_photo:4,recent_scrobbl:5,recent_tweet:7,reflect:7,relat:[4,5],relationship:[4,5,7],relev:7,reliabl:5,remov:[4,7],repeatedli:3,replac:[2,4,7],report:0,repres:[4,5,7],request:[4,7],requir:[2,3,4,7],reserv:4,resiz:[4,7],restrict:[4,5,6,7],result:[4,5],retweet:7,right:4,rock:5,roll:5,row:[4,5,6,7],run:[0,4,7],runserv:0,s:[0,2,3,4,5,6,7],sa:4,safe:[5,7],sai:7,same:[3,4,5,7],save:[3,4,7],screen:7,screen_nam:7,screenshot:3,script:4,scrobbl:3,scrobble_count:5,search:5,secret:[4,7],section:7,see:[0,2,3,4,5,6,7],seem:5,sens:3,separ:[6,7],serv:[4,7],servic:[4,6],set:[0,1],setup:0,sever:[4,5,6,7],sharealik:4,should:[4,6,7],shown:[4,7],sign:7,similar:[5,7],similarli:[5,7],simpl:4,simpler:6,simpli:7,sinc:[5,7],singl:[3,4,5,6,7],site:[1,2,3,4,7],size:[4,7],slow:[4,7],slug:[5,6],small:[4,7],small_height:4,small_url:[4,7],small_width:4,snapshot:3,so:[4,5,6,7],some:[2,3,5],someth:[3,4,7],sometim:7,sorri:7,sort:5,sortedm2m:2,sourc:0,specif:0,specifi:[0,4],sphinx:0,sqlite:5,src:4,standard:7,start:[4,7],still:[0,4],store:[3,4,5,6,7],strftime:2,string:5,subsequ:5,suit:2,sundai:5,suppli:[2,3,5],sync:3,system:[4,7],t:[3,4,5,6,7],tab:7,tag:[0,1,2,3],tag_detail:6,taggedbookmark:6,taggedphoto:4,taggit:[2,6],take:[5,7],taken:4,taken_tim:4,tap:7,tell:7,templat:[1,2,3],termin:[0,4],test:1,test_home_templ:0,test_view:0,text_html:7,than:[4,7],thei:[2,4,6,7],them:[1,4,6,7],themselv:4,thi:[0,2,3,4,5,6,7],thing:[0,1,3,4,5,7],think:7,third:3,those:[2,4,7],three:[4,7],through:[4,5,6],time:[2,4,5,7],titl:[4,6,7],todai:5,token:[2,6,7],too:7,took:4,top_album:5,top_artist:5,top_track:5,toread_object:6,total:[4,5,6],tox:0,track:3,travi:0,tumblr:6,tweet:3,tweet_object:7,tweet_video:7,twet:7,twimg:7,twitter:[1,2,3,6],two:[2,4,6,7],txt:7,type:[4,6,7],under:2,unfortun:7,unicod:5,untest:2,until:7,unzip:7,up:[0,1,3],updat:5,update_twitter_tweet:7,update_twitter_us:7,upload:[3,4,7],url:[1,3,4,5,6,7],urlpattern:2,us:[0,2,3,4,5,6,7],usag:0,use_l10n:2,use_thousand_separ:2,user:[3,6],usernam:[5,6],usual:[4,6,7],v1:7,v2:7,valu:[2,4,7],variant:4,ve:[4,6,7],veri:4,version:[0,2,4,5,6,7],video:[2,3,4,7],video_url:7,view:[2,3,5,7],virtualenv:0,visibl:3,vs:[4,7],wa:[2,4,5,7],wai:[3,5,6,7],wait:7,want:[2,3,4,7],we:[4,5,6,7],web:[4,7],webpag:7,week:5,were:[4,7],weren:7,what:[1,4,7],when:[2,4,5,7],whenev:[4,7],wherev:4,whether:[4,6,7],which:[0,2,4,5,7],who:[4,7],whole:3,whose:7,width:4,with_scrobble_count:5,within:[4,7],without:0,won:[5,6,7],work:[0,5,7],worri:2,worth:7,would:[2,4,5,7],www:[4,5,7],xcode:2,y:[2,4],ye:7,year:[2,4,5,6,7],yet:[2,4,7],you:[0,2,3,4,5,6,7],your:[1,2,3,4,5,6,7],yz:7,zlib:2},titles:["Development","Django Ditto: Documentation","Installation","Introduction","Flickr","Last.fm","Pinboard","Twitter"],titleterms:{"import":7,For:1,account:[4,7],add:2,album:5,annual:[4,5,6,7],artist:5,bookmark:6,command:[4,5,6,7],core:2,count:[4,5,6,7],cover:3,coverag:0,dai:[4,5,6,7],develop:[0,1],ditto:[1,2,3],django:[1,2],document:[0,1],each:2,elsewher:1,favorit:7,fetch:[4,5,6,7],file:7,flickr:4,fm:5,includ:3,instal:2,installed_app:2,introduct:3,last:5,licens:4,manag:[4,5,6,7],media:7,model:[4,5,6,7],note:0,option:2,origin:4,other:[0,2],packag:0,photo:4,photoset:4,pillow:2,pinboard:6,popular:6,py:2,recent:[4,5,6,7],scrobbl:5,servic:[1,2,3],set:[2,4,5,6,7],specif:2,support:1,tag:[4,5,6,7],templat:[4,5,6,7],test:0,top:5,track:5,tweet:7,twitter:7,up:[2,4,5,6,7],updat:7,url:2,user:[4,7],what:3}}) \ No newline at end of file diff --git a/docs/_build/html/services/flickr.html b/docs/_build/html/services/flickr.html index 245ecb6..77e7788 100644 --- a/docs/_build/html/services/flickr.html +++ b/docs/_build/html/services/flickr.html @@ -1,71 +1,37 @@ - - - - + - - - - - Flickr — Django Ditto 1.4.1 documentation - - - - + + + + Flickr — Django Ditto 2.0.0 documentation + + + - - - - - - - - - - - - - - - - - - - + + + + + - - - +
    - -
    - - -
    - -
    -

    Template tags

    + + +
    +

    Template tags

    There are three assigment template tags and one simple template tag available for displaying Photos, Photosets and information about a Photo.

    -
    -

    Annual Photo Counts

    +
    +

    Annual Photo Counts

    Get the number of Photos taken or uploaded per year for all or one User-with-Account. This fetches totals for all Users, by time uploaded:

    {% load ditto_flickr %}
     
    @@ -305,9 +223,9 @@ 

    Annual Photo Counts
    {% annual_photo_counts nsid='35034346050@N01' count_by='taken_time' as counts %}
     

    -
    -
    +
    +

    Day Photos

    Gets public Photos posted or taken on a particular day by any of the Users-with-Accounts. In this example, my_date is a datetime.datetime.date type:

    {% load ditto_flickr %}
     
    @@ -325,9 +243,9 @@ 

    Day Photos
    {% day_photos my_date time='post_time' nsid='35034346050@N01' as photos %}
     

    -
    -
    +
    +

    Photosets

    Gets Photosets. By default they are by any User and only 10 are returned.

    {% load ditto_flickr %}
     
    @@ -347,9 +265,9 @@ 

    Photosets{% photosets nsid='35034346050@N01' limit=300 as photoset_list %}

    -
    -
    +
    +

    Photo license

    When displaying information about a Photo you may want to display a user-friendly version of its license (indicating Creative Commons level, All rights reserved, etc). This tag makes that easy. Pass it the license property of a Photo object. Here, photo is a Photo object:

    {% load ditto_flickr %}
     
    @@ -360,9 +278,9 @@ 

    Photo licensehttps://creativecommons.org/licenses/by-nc-sa/2.0/” title=”More about permissions”>Attribution-NonCommercial-ShareAlike License</a>

    -
    -
    -

    Recent Photos

    +
    +
    +

    Recent Photos

    To display the most recent public Photos posted by any of the Users associated with Accounts. By default the most recent 10 are fetched:

    {% load ditto_flickr %}
    @@ -383,20 +301,20 @@ 

    Recent Photos
    {% recent_photos nsid='35034346050@N01' limit=5 as photos %}
     

    -
    -
    -
    -

    Management commands

    -
    -

    Fetch Account User

    + + +
    +

    Management commands

    +
    +

    Fetch Account User

    This is only used when setting up a new Account object with API credentials. It fetches data about the Flickr User associated with this Account.

    Once the Account has been created in the Django admin, and its API credentials entered, run this (using the Django ID for the object instead of 1):

    $ ./manage.py fetch_flickr_account_user --id=1
     
    -
    -
    -

    Fetch Photos

    + +
    +

    Fetch Photos

    Fetches data about Photos (including videos). This will fetch data for ALL Photos for ALL Accounts:

    $ ./manage.py fetch_flickr_photos --days=all
     
    @@ -420,9 +338,9 @@

    Fetch Photos
    /var/www/example.com/media/flickr/46/05/35034346050N01/avatars/35034346050N01.jpg
     

    -
    -
    -

    Fetch originals

    + +
    +

    Fetch originals

    The fetch_flickr_photos management command only fetches data about the photos (title, locations, EXIF, tags, etc). To download the original photo and video files themselves, use the fetch_flickr_originals command, after fetching the photos’ data:

    -
    +
    +

    Fetch Photosets

    You can fetch data about your Photosets any time, but it doesn’t fetch detailed data about Photos within them.

    So, for best results, only run this after getting running fetch_flickr_photos.

    To fetch Photosets for all Accounts:

    @@ -483,57 +401,39 @@

    Fetch Photosets
    $ ./manage.py fetch_flickr_photosets --account=35034346050@N01
     

    -
    - - + + + - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/services/lastfm.html b/docs/_build/html/services/lastfm.html index 2ad8f45..280166b 100644 --- a/docs/_build/html/services/lastfm.html +++ b/docs/_build/html/services/lastfm.html @@ -1,71 +1,37 @@ - - - - + - - - - - Last.fm — Django Ditto 1.4.1 documentation - - - - - + + + + Last.fm — Django Ditto 2.0.0 documentation + + + - - - - - - - - - - - - - - - - - - + + + + + - - - +
    - -
    - - -
    -
    -

    Template tags

    + +
    +

    Template tags

    There are several template tags for getting common lists of things.

    -
    -

    Annual Scrobble Counts

    +
    +

    Annual Scrobble Counts

    Get the number of scrobbles per year for all or one Account. This fetches totals for all Account s:

    {% load ditto_lastfm %}
     
    @@ -298,9 +216,9 @@ 

    Annual Scrobble Counts
    {% annual_scrobble_counts account=account as counts %}
     

    -
    -
    +
    +

    Day Scrobbles

    Get a QuerySet of all Scrobbles from a particular day for one or all Account s, earliest first. In these examples, today can be either a datetime.datetime or a datetime.date.

    {% load ditto_lastfm %}
     
    @@ -318,9 +236,9 @@ 

    Day Scrobbles
    {% day_scrobbles date=today account=account as scrobbles %}
     

    -
    -
    +
    +

    Recent Scrobbles

    Get a QuerySet of the most recent Scrobbles, by one or all Account s. The default quantity returned is 10.

    {% load ditto_lastfm %}
     
    @@ -333,9 +251,9 @@ 

    Recent Scrobbles
    {% recent_scrobbles account=account limit=30 as scrobbles %}
     

    -
    -
    +
    +

    Top Tracks

    Get a QuerySet of the most-scrobbled Track s with the most-scrobbled first. Can be restricted to: a single Account; a single day, week, month or year; tracks by a single Artist. By default 10 tracks are returned.

    {% load ditto_lastfm %}
     
    @@ -375,9 +293,9 @@ 

    Top Tracks -

    Top Albums

    +

    +
    +

    Top Albums

    Get a QuerySet of the most-scrobbled Album s with the most-scrobbled first. This works in exactly the same way as the top_tracks template tag, above, with identical arguments. e.g.:

    {% load ditto_lastfm %}
     
    @@ -392,9 +310,9 @@ 

    Top Albums{% endfor %}

    -
    -
    +
    +

    Top Artists

    Get a QuerySet of the most-scrobbled Artist s with the most-scrobbled first. This works in a similar way to the top_tracks and top_albums template tags, above. The only difference is that results cannot be filtered by artist. e.g.:

    {% load ditto_lastfm %}
     
    @@ -409,13 +327,13 @@ 

    Top Artists{% endfor %}

    -
    - -
    -

    Management commands

    + + +
    +

    Management commands

    There is only one Last.fm management command.

    -
    -

    Fetch Scrobbles

    +
    +

    Fetch Scrobbles

    Fetches Scrobbles for one or all Accounts.

    To fetch ALL Scrobbles for all Accounts (this could take a long time):

    $ ./manage.py fetch_lastfm_scrobbles --days=all
    @@ -431,57 +349,39 @@ 

    Fetch Scrobbles - - - - - - + + Built with Sphinx using a + theme + provided by Read the Docs. + +

    -
    -
    - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/services/pinboard.html b/docs/_build/html/services/pinboard.html index e390395..387c36c 100644 --- a/docs/_build/html/services/pinboard.html +++ b/docs/_build/html/services/pinboard.html @@ -1,71 +1,37 @@ - - - - + - - - - - Pinboard — Django Ditto 1.4.1 documentation - - - - - + + + + Pinboard — Django Ditto 2.0.0 documentation + + + - - - - - - - - - - - - - - - - - - + + + + + - - - +
    - -
    - - -
    -
    +
    +

    Recent Bookmarks

    To display the most recently-posted Bookmarks use recent_bookmarks. By default it gets the 10 most recent Bookmarks posted by all Accounts:

    {% load ditto_pinboard %}
     
    @@ -284,9 +202,9 @@ 

    Recent Bookmarks
    {% recent_bookmarks account='philgyford' limit=5 as bookmarks %}
     

    -
    -
    +
    - - -
    -

    Management commands

    + + +
    +

    Management commands

    Once you have set up an Account with your Pinboard API token (see above), you can fetch Bookmarks.

    -
    -

    Fetch Bookmarks

    +
    +

    Fetch Bookmarks

    Import all of your bookmarks:

    $ ./manage.py fetch_pinboard_bookmarks --all
     
    @@ -338,57 +256,39 @@

    Fetch Bookmarkshttps://pinboard.in/api/#limits

    -

    -
    -
    + + + - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/_build/html/services/twitter.html b/docs/_build/html/services/twitter.html index 66b6300..a6981aa 100644 --- a/docs/_build/html/services/twitter.html +++ b/docs/_build/html/services/twitter.html @@ -1,71 +1,37 @@ - - - - + - - - - - Twitter — Django Ditto 1.4.1 documentation - - - - - - - - - - - - - - - - - - - - - + + + + Twitter — Django Ditto 2.0.0 documentation + + + - - + + + + + - - - +
    - -
    - - -
    -
    -

    Tweet

    + +
    +

    Tweet

    Tweet models have several managers. There are two main differentiators we want to restrict things by:

    + +
    +

    Template tags

    There are four assigment template tags available for displaying Tweets in your templates.

    -
    -

    Annual Favorite Counts

    +
    +

    Annual Favorite Counts

    Get the number of favorites per year by all or one of the non-private Users-with-Accounts (only counting public Tweets):

    {% load ditto_twitter %}
     
    @@ -292,9 +211,9 @@ 

    Annual Favorite Counts

    NOTE: The date used is the date the Tweets were posted on, not the date on which they were favorited.

    -
    -
    +
    +

    Annual Tweet Counts

    Get the number of Tweets per year by all or one of the non-private Users-with-Accounts:

    {% load ditto_twitter %}
     
    @@ -312,9 +231,9 @@ 

    Annual Tweet Counts
    {% annual_tweet_counts screen_name='philgyford' as counts %}
     

    -
    -
    +
    +

    Day Favorites

    Use this to fetch Tweets posted on a particular day by non-private Users, which have been favorited/liked by any of the Users-with-Accounts. Again, my_date is a datetime.datetime.date type:

    {% load ditto_twitter %}
    @@ -327,9 +246,9 @@ 

    Day Favorites
    {% day_favorites my_date screen_name='philgyford' as favorites %}
     

    -
    -
    +
    +

    Day Tweets

    Gets Tweets posted on a particular day by any of the non-private Users-with-Accounts. In this example, my_date is a datetime.datetime.date type:

    {% load ditto_twitter %}
     
    @@ -340,9 +259,9 @@ 

    Day Tweets
    {% day_tweets my_date screen_name='philgyford' as tweets %}
     

    -
    -
    +
    +

    Recent Favorites

    This works like recent_tweets except it only fetches Tweets favorited/liked by our Users-with-Accounts, which were posted by public Twitter users:

    {% load ditto_twitter %}
    @@ -354,9 +273,9 @@ 

    Recent Favorites
    {% recent_favorites screen_name='philgyford' limit=5 as favorites %}
     

    -
    -
    +
    +

    Recent Tweets

    To display the most recent Tweets posted by any of the non-private Users with an API-credentialled Account. By default the most recent 10 are fetched:

    {% load ditto_twitter %}
     
    @@ -375,28 +294,33 @@ 

    Recent Tweets
    {% recent_tweets screen_name='philgyford' limit=5 as tweets %}
     

    -
    -
    -
    -

    Management commands

    -
    -

    Import Tweets

    -

    If you have more than 3,200 Tweets, you can only include older Tweets by downloading your archive and importing it. To do so, request your archive at https://twitter.com/settings/account . When you’ve downloaded it, do:

    -
    $ ./manage.py import_twitter_tweets --path=/Users/phil/Downloads/12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66
    +
    +
    +
    +

    Management commands

    +
    +

    Import Tweets

    +

    If you have more than 3,200 Tweets, you can only include older Tweets by downloading your archive and importing it. To do so, request your archive at https://twitter.com/settings/download_your_data . When you’ve downloaded it, do:

    +
    $ ./manage.py import_twitter_tweets --path=/path/to/twitter-2022-01-31-123456abcdef
     
    -

    using the correct path to the directory you’ve downloaded and unzipped (in this case, the unzipped directory is 12552_dbeb4be9b8ff5f76d7d486c005cc21c9faa61f66). This will import all of the Tweets found in the archive.

    +

    using the correct path to the directory you’ve downloaded and unzipped (in this case, the unzipped directory is twitter-2022-01-031-123456abcdef). This will import all of the Tweets found in the archive and all of the images and animated GIFs’ MP4 files (other videos aren’t currently imported).

    +

    NOTE: If you have an archive of data you downloaded before sometime in early 2019 it will be a different format. You can tell because the folder will contain five directories, and three files: index.html, README.txt, and tweets.csv. If you want to import an archive in this format add the –archive-version=v1 argument:

    +
    $ ./manage.py import_twitter_tweets --archive-version=v1 --path=/path/to/123456_abcdef
    +
    -
    -

    Update Tweets

    +

    using the correct path to the directory (in this case, the unzipped directory is 123456_abcdef). This will import Tweet data but no images etc, because these files weren’t included in the older archive format.

    +
    +
    +

    Update Tweets

    If you’ve imported your Tweets (above), you won’t yet have complete data about each one. To fully-populate those Tweets you should run this (replacing philgyford with your Twitter screen name):

    $ ./manage.py update_twitter_tweets --account=philgyford
     

    This will fetch data for up to 6,000 Tweets. If you have more than that in your archive, run it every 15 minutes to avoid rate limiting, until you’ve fetched all of the Tweets. This command will fetch data for the least-recently fetched. It’s worth running every so often in the future, to fetch the latest data (such as Retweet and Like counts).

    -
    -
    -

    Fetch Tweets

    + +
    +

    Fetch Tweets

    Periodically you’ll want to fetch the latest Tweets. This will fetch only those Tweets posted since you last fetched any:

    $ ./manage.py fetch_twitter_tweets --account=philgyford --recent=new
     
    @@ -410,9 +334,9 @@

    Fetch Tweets
    $ ./manage.py fetch_twitter_tweets --recent=new
     

    -
    -
    -

    Fetch Favorites

    + +
    +

    Fetch Favorites

    To fetch recent Tweets that all your Accounts have favorited/liked, run one of these:

    $ ./manage.py fetch_twitter_favorites --recent=new
     $ ./manage.py fetch_twitter_favorites --recent=200
    @@ -423,9 +347,9 @@ 

    Fetch Favorites=philgyford --recent=200

    -
    -
    -

    Update Users

    + +
    +

    Update Users

    When a Tweet of any kind is fetched, its User data is also stored, and the User’s profile photo (avatar) is downloaded and stored in your project’s MEDIA_ROOT directory. You can optionally set the DITTO_TWITTER_DIR_BASE setting to change the location. The default is:

    -
    +
    +

    Fetch Files (Media)

    Fetching Tweets (whether your own or your favorites/likes) fetches all the data about them, but does not fetch any media files uploaded with them. There’s a separate command for fetching images and the MP4 video files created from animated GIFs. (There’s no way to fetch the videos, or original GIF files.)

    You must first download the Tweet data (above), and then you can fetch the files for all those Tweets:

    $ ./manage.py fetch_twitter_files
    @@ -495,65 +419,47 @@ 

    Fetch Files (Media)DITTO_TWITTER_USE_LOCAL_MEDIA.

    -

    -
    +
    +

    Fetch Accounts

    Deprecated: This only needs to be used whenever a new Account is added to the system. It fetches the User data for each Account that has API credentials, and associates the two objects.

    $ ./manage.py fetch_twitter_accounts
     

    I don’t think this is needed now.

    -
    -
    -
    + + +
    - - - - - - - - - - - - - + \ No newline at end of file From 6aca66d4b8c9adeb5cb08abe5e3c060298f8e6e4 Mon Sep 17 00:00:00 2001 From: Phil Gyford Date: Mon, 14 Feb 2022 11:33:36 +0000 Subject: [PATCH 22/22] Please the linter For #229 --- ditto/twitter/admin.py | 40 ++++++++++++++++--- ditto/twitter/ingest.py | 5 ++- ...057_alter_account_access_token_and_more.py | 32 +++++++++------ tests/twitter/test_ingest_v2.py | 4 +- 4 files changed, 58 insertions(+), 23 deletions(-) diff --git a/ditto/twitter/admin.py b/ditto/twitter/admin.py index abddfe6..e2dcdaf 100644 --- a/ditto/twitter/admin.py +++ b/ditto/twitter/admin.py @@ -17,7 +17,15 @@ class AccountAdmin(admin.ModelAdmin): ) fieldsets = ( - (None, {"fields": ("user", "is_active",)}), + ( + None, + { + "fields": ( + "user", + "is_active", + ) + }, + ), ( "API", { @@ -29,7 +37,8 @@ class AccountAdmin(admin.ModelAdmin): ), "description": ( "Keys and secrets require creation of an app at " - 'developer.twitter.com/portal' + '' + "developer.twitter.com/portal" ), }, ), @@ -123,7 +132,13 @@ class MediaAdmin(admin.ModelAdmin): ), ( "Data", - {"classes": ("collapse",), "fields": ("time_created", "time_modified",)}, + { + "classes": ("collapse",), + "fields": ( + "time_created", + "time_modified", + ), + }, ), ) @@ -240,7 +255,12 @@ class TweetAdmin(DittoItemModelAdmin): "Data", { "classes": ("collapse",), - "fields": ("raw", "fetch_time", "time_created", "time_modified",), + "fields": ( + "raw", + "fetch_time", + "time_created", + "time_modified", + ), }, ), ) @@ -309,7 +329,17 @@ class UserAdmin(admin.ModelAdmin): ) }, ), - ("Data", {"fields": ("raw", "fetch_time", "time_created", "time_modified",)}), + ( + "Data", + { + "fields": ( + "raw", + "fetch_time", + "time_created", + "time_modified", + ) + }, + ), ) formfield_overrides = { diff --git a/ditto/twitter/ingest.py b/ditto/twitter/ingest.py index 663fc66..5ec22ec 100644 --- a/ditto/twitter/ingest.py +++ b/ditto/twitter/ingest.py @@ -226,8 +226,9 @@ def _save_media(self, directory): media_obj.media_type != "video" and media_obj.has_file is False ): - # We don't save video files - only image files, and mp4s for # GIFs - and only want to do this if we don't already have a - # file. + # We don't save video files - only image files, and mp4s + # for # GIFs - and only want to do this if we don't already + # have a file. if ( media_obj.media_type == "animated_gif" diff --git a/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py b/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py index c4fd2ad..7ab998f 100644 --- a/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py +++ b/ditto/twitter/migrations/0057_alter_account_access_token_and_more.py @@ -6,28 +6,34 @@ class Migration(migrations.Migration): dependencies = [ - ('twitter', '0056_add_count_index'), + ("twitter", "0056_add_count_index"), ] operations = [ migrations.AlterField( - model_name='account', - name='access_token', - field=models.CharField(blank=True, max_length=255, verbose_name='Access Token'), + model_name="account", + name="access_token", + field=models.CharField( + blank=True, max_length=255, verbose_name="Access Token" + ), ), migrations.AlterField( - model_name='account', - name='access_token_secret', - field=models.CharField(blank=True, max_length=255, verbose_name='Access Token Secret'), + model_name="account", + name="access_token_secret", + field=models.CharField( + blank=True, max_length=255, verbose_name="Access Token Secret" + ), ), migrations.AlterField( - model_name='account', - name='consumer_key', - field=models.CharField(blank=True, max_length=255, verbose_name='API Key'), + model_name="account", + name="consumer_key", + field=models.CharField(blank=True, max_length=255, verbose_name="API Key"), ), migrations.AlterField( - model_name='account', - name='consumer_secret', - field=models.CharField(blank=True, max_length=255, verbose_name='API Key Secret'), + model_name="account", + name="consumer_secret", + field=models.CharField( + blank=True, max_length=255, verbose_name="API Key Secret" + ), ), ] diff --git a/tests/twitter/test_ingest_v2.py b/tests/twitter/test_ingest_v2.py index 119fc30..ca4dabc 100644 --- a/tests/twitter/test_ingest_v2.py +++ b/tests/twitter/test_ingest_v2.py @@ -1,11 +1,9 @@ import json import os -from unittest.mock import call, mock_open, patch from django.test import TestCase -from ditto.twitter import factories -from ditto.twitter.ingest import IngestError, Version2TweetIngester +from ditto.twitter.ingest import Version2TweetIngester from ditto.twitter.models import Tweet, User