From fd717e5aca057956dae017f17514e37939f60140 Mon Sep 17 00:00:00 2001 From: Benjamin Mouncer Date: Mon, 23 Jan 2023 21:06:04 +0000 Subject: [PATCH 01/34] Added proxy parameter to all api calls. --- fingertips_py/api_calls.py | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index 4a8c746..0b5bca8 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -11,16 +11,17 @@ from io import StringIO -def make_request(url, attr=None): +def make_request(url, attr=None, proxies=None): """ :param url: A url to make a request :param attr: The attribute that needs to be returned + :proxies: proxies info to access the data :return: a dict of the attribute and associated data """ try: - req = requests.get(url) + req = requests.get(url, proxies=proxies) except requests.exceptions.SSLError: - req = requests.get(url, verify=False) + req = requests.get(url, verify=False, proxies=proxies) json_response = json.loads(req.content.decode('utf-8')) data = {} for item in json_response: @@ -29,29 +30,31 @@ def make_request(url, attr=None): return data -def get_json(url): +def get_json(url, proxies=None): """ :param url: A url to make a request + :proxies: proxies info to access the data :return: A parsed JSON object """ try: - req = requests.get(url) + req = requests.get(url, proxies=proxies) except requests.exceptions.SSLError: - req = requests.get(url, verify=False) + req = requests.get(url, verify=False, proxies=proxies) json_resp = json.loads(req.content.decode('utf-8')) return json_resp -def get_json_return_df(url, transpose=True): +def get_json_return_df(url, transpose=True, proxies=None): """ :param url: A url to make a request :param transpose: [OPTIONAL] transposes dataframe. Default True. + :proxies: proxies info to access the data :return: Dataframe generated from JSON response. """ try: - req = requests.get(url) + req = requests.get(url, proxies=proxies) except requests.exceptions.SSLError: - req = requests.get(url, verify=False) + req = requests.get(url, verify=False, proxies=proxies) try: df = pd.read_json(req.content, encoding='utf-8') except ValueError: @@ -61,16 +64,16 @@ def get_json_return_df(url, transpose=True): return df -def get_data_in_tuple(url): +def get_data_in_tuple(url, proxies=None): """ - :param url: A url to make a request + :proxies: proxies info to access the data :return: A tuple of returned data """ try: - req = requests.get(url) + req = requests.get(url, proxies=proxies) except requests.exceptions.SSLError: - req = requests.get(url, verify=False) + req = requests.get(url, verify=False, proxies=proxies) json_resp = json.loads(req.content.decode('utf-8')) tup = [tuple(d.values()) for d in json_resp] if isinstance(tup[0][0], str): @@ -79,12 +82,13 @@ def get_data_in_tuple(url): return tup -def deal_with_url_error(url): +def deal_with_url_error(url, proxies=None): """ :param url: A url that returns a URL Error based on SSL errors + :proxies: proxies info to access the data :return: A dataframe from the URL with varify set to false. """ - req = requests.get(url, verify=False) + req = requests.get(url, verify=False, proxies=proxies) s = str(req.content, 'utf-8') data = StringIO(s) df = pd.read_csv(data) From 107578786bb02915f8af108193ed0273653dc068 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 24 Jan 2023 19:39:12 +0000 Subject: [PATCH 02/34] Added proxy variable to api_calls.py --- fingertips_py/api_calls.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index 0b5bca8..7266f1f 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -15,7 +15,7 @@ def make_request(url, attr=None, proxies=None): """ :param url: A url to make a request :param attr: The attribute that needs to be returned - :proxies: proxies info to access the data + :param proxies: proxies info to access the data :return: a dict of the attribute and associated data """ try: @@ -33,7 +33,7 @@ def make_request(url, attr=None, proxies=None): def get_json(url, proxies=None): """ :param url: A url to make a request - :proxies: proxies info to access the data + :param proxies: proxies info to access the data :return: A parsed JSON object """ try: @@ -48,7 +48,7 @@ def get_json_return_df(url, transpose=True, proxies=None): """ :param url: A url to make a request :param transpose: [OPTIONAL] transposes dataframe. Default True. - :proxies: proxies info to access the data + :param proxies: proxies info to access the data :return: Dataframe generated from JSON response. """ try: @@ -67,7 +67,7 @@ def get_json_return_df(url, transpose=True, proxies=None): def get_data_in_tuple(url, proxies=None): """ :param url: A url to make a request - :proxies: proxies info to access the data + :param proxies: proxies info to access the data :return: A tuple of returned data """ try: @@ -85,7 +85,7 @@ def get_data_in_tuple(url, proxies=None): def deal_with_url_error(url, proxies=None): """ :param url: A url that returns a URL Error based on SSL errors - :proxies: proxies info to access the data + :param proxies: proxies info to access the data :return: A dataframe from the URL with varify set to false. """ req = requests.get(url, verify=False, proxies=proxies) From 4cef47eaab6aaf83c25e8539ec930d533d7787bf Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 24 Jan 2023 19:42:20 +0000 Subject: [PATCH 03/34] Corrected wording of variable. --- fingertips_py/api_calls.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index 7266f1f..74e151f 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -15,7 +15,7 @@ def make_request(url, attr=None, proxies=None): """ :param url: A url to make a request :param attr: The attribute that needs to be returned - :param proxies: proxies info to access the data + :param proxies: proxy info to access the data :return: a dict of the attribute and associated data """ try: @@ -33,7 +33,7 @@ def make_request(url, attr=None, proxies=None): def get_json(url, proxies=None): """ :param url: A url to make a request - :param proxies: proxies info to access the data + :param proxies: proxy info to access the data :return: A parsed JSON object """ try: @@ -48,7 +48,7 @@ def get_json_return_df(url, transpose=True, proxies=None): """ :param url: A url to make a request :param transpose: [OPTIONAL] transposes dataframe. Default True. - :param proxies: proxies info to access the data + :param proxies: proxy info to access the data :return: Dataframe generated from JSON response. """ try: @@ -67,7 +67,7 @@ def get_json_return_df(url, transpose=True, proxies=None): def get_data_in_tuple(url, proxies=None): """ :param url: A url to make a request - :param proxies: proxies info to access the data + :param proxies: proxy info to access the data :return: A tuple of returned data """ try: @@ -85,7 +85,7 @@ def get_data_in_tuple(url, proxies=None): def deal_with_url_error(url, proxies=None): """ :param url: A url that returns a URL Error based on SSL errors - :param proxies: proxies info to access the data + :param proxies: proxy info to access the data :return: A dataframe from the URL with varify set to false. """ req = requests.get(url, verify=False, proxies=proxies) From 7f936d4226721f15c2174027978677a722963d89 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 24 Jan 2023 19:53:11 +0000 Subject: [PATCH 04/34] Added proxies variable to functions retrieving the metadata. --- fingertips_py/metadata.py | 82 ++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 27 deletions(-) diff --git a/fingertips_py/metadata.py b/fingertips_py/metadata.py index fe2994d..6e215d6 100644 --- a/fingertips_py/metadata.py +++ b/fingertips_py/metadata.py @@ -10,11 +10,12 @@ from .api_calls import get_data_in_tuple, base_url, make_request, get_json, get_json_return_df, deal_with_url_error -def get_all_ages(is_test=False): +def get_all_ages(is_test=False, proxies=None): """ Returns a dictionary of all the age categories and their IDs. :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param proxies: proxy info to access the data :return: Age codes used in Fingertips in a tuple """ ages = get_data_in_tuple(base_url + 'ages') @@ -23,10 +24,11 @@ def get_all_ages(is_test=False): return ages -def get_all_areas(is_test=False): +def get_all_areas(is_test=False, proxies=None): """ Retreives all area types. + :param proxies: proxy info to access the data :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dictionary of all area types used in Fingertips """ @@ -36,10 +38,11 @@ def get_all_areas(is_test=False): return areas -def get_age_id(age, is_test=False): +def get_age_id(age, is_test=False, proxies=None): """ Returns an ID for a given age. + :param proxies: proxy info to access the data :param age: Search term of an age or age range as a string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: Code used in Fingertips to represent the age or age range as a string @@ -50,10 +53,11 @@ def get_age_id(age, is_test=False): return ages[age]['Id'] -def get_age_from_id(age_id, is_test=False): +def get_age_from_id(age_id, is_test=False, proxies=None): """ Returns an age name from given id. + :param proxies: proxy info to access the data :param age_id: Age id used in Fingertips as an integer :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: Age or age range as a string @@ -64,10 +68,11 @@ def get_age_from_id(age_id, is_test=False): return ages[age_id]['Name'] -def get_all_sexes(is_test=False): +def get_all_sexes(is_test=False, proxies=None): """ Returns a tuple of all sex categories and their IDs. + :param proxies: proxy info to access the data :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: Sex categories used in Fingertips with associated codes as a tuple """ @@ -77,10 +82,11 @@ def get_all_sexes(is_test=False): return sexes -def get_sex_id(sex, is_test=False): +def get_sex_id(sex, is_test=False, proxies=None): """ Returns an ID for a given sex. + :param proxies: proxy info to access the data :param sex: Sex category as string (Case sensitive) :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: ID used in Fingertips to represent the sex as integer @@ -91,10 +97,11 @@ def get_sex_id(sex, is_test=False): return sexes[sex]['Id'] -def get_sex_from_id(sex_id, is_test=False): +def get_sex_from_id(sex_id, is_test=False, proxies=None): """ Returns a sex name given an id. + :param proxies: proxy info to access the data :param sex_id: ID used in Fingertips to represent the sex as integer :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: Sex category as string @@ -105,10 +112,11 @@ def get_sex_from_id(sex_id, is_test=False): return sexes[sex_id]['Name'] -def get_all_value_notes(is_test=False): +def get_all_value_notes(is_test=False, proxies=None): """ Returns a dictionary of all value notes and their IDs. + :param proxies: proxy info to access the data :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: Data value notes and their associated codes that are used in Fingertips as a list of tuples """ @@ -118,10 +126,11 @@ def get_all_value_notes(is_test=False): return value_notes -def get_value_note_id(value_note, is_test=False): +def get_value_note_id(value_note, is_test=False, proxies=None): """ Returns a value note ID for a given value note. + :param proxies: proxy info to access the data :param value_note: Value note as string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: ID used in Fingertips to represent the value note as integer @@ -132,24 +141,28 @@ def get_value_note_id(value_note, is_test=False): return value_notes[value_note]['Id'] -def get_areas_for_area_type(area_type_id, is_test=False): +def get_areas_for_area_type(area_type_id, is_test=False, proxies=None): """ Returns a dictionary of areas that match an area type id given the id as integer or string. + :param proxies: proxy info to access the data :param area_type_id: ID of area type (ID of General Practice is 7 etc) used in Fingertips as integer or string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dictionary of dictionaries with area codes and the names of those areas """ - areas = make_request(base_url + 'areas/by_area_type?area_type_id=' + str(area_type_id), 'Code') + areas = make_request( + base_url + 'areas/by_area_type?area_type_id=' + str(area_type_id), + 'Code') if is_test: return areas, base_url + 'areas/by_area_type?area_type_id=' + str(area_type_id) return areas -def get_metadata_for_indicator(indicator_number, is_test=False): +def get_metadata_for_indicator(indicator_number, is_test=False, proxies=None): """ Returns the metadata for an indicator given the indicator number as integer or string. + :param proxies: proxy info to access the data :param indicator_number: Number used to identify an indicator within Fingertips as integer or string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dictionary of metadata for the given indicator @@ -160,10 +173,11 @@ def get_metadata_for_indicator(indicator_number, is_test=False): return metadata -def get_metadata_for_all_indicators_from_csv(is_test=False): +def get_metadata_for_all_indicators_from_csv(is_test=False, proxies=None): """ Returns a dataframe from the csv of all metadata for all indicators. + :param proxies: proxy info to access the data :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dataframe of all metadata for all indicators """ @@ -176,10 +190,11 @@ def get_metadata_for_all_indicators_from_csv(is_test=False): return metadata -def get_metadata_for_all_indicators(include_definition='no', include_system_content='no', is_test=False): +def get_metadata_for_all_indicators(include_definition='no', include_system_content='no', is_test=False, proxies=None): """ Returns the metadata for all indicators in a dataframe. + :param proxies: proxy info to access the data :param include_definition: optional to include definitions :param include_system_content: optional to include system content :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data @@ -193,10 +208,11 @@ def get_metadata_for_all_indicators(include_definition='no', include_system_cont return metadata_df -def get_multiplier_and_calculation_for_indicator(indicator_number): +def get_multiplier_and_calculation_for_indicator(indicator_number, proxies=None): """ Returns the multiplier and calculation method for a given indicator. + :param proxies: proxy info to access the data :param indicator_number: Number used to identify an indicator within Fingertips as integer or string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A tuple of multiplier and calculation method from Fingetips metadata @@ -213,10 +229,11 @@ def get_multiplier_and_calculation_for_indicator(indicator_number): return multiplier, calc -def get_area_types_as_dict(is_test=False): +def get_area_types_as_dict(is_test=False, proxies=None): """ Returns all area types and related information such as ID and name. + :param proxies: proxy info to access the data :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dictionary of area types """ @@ -226,10 +243,11 @@ def get_area_types_as_dict(is_test=False): return areas -def get_profile_by_id(profile_id, is_test=False): +def get_profile_by_id(profile_id, is_test=False, proxies=None): """ Returns a profile as an dictionary which contains information about domains and sequencing. + :param proxies: proxy info to access the data :param profile_id: ID used in Fingertips to identify a profile as integer or string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dictionary of information about the profile @@ -240,10 +258,11 @@ def get_profile_by_id(profile_id, is_test=False): return get_json(base_url + 'profile?profile_id=' + str(profile_id)) -def get_all_profiles(is_test=False): +def get_all_profiles(is_test=False, proxies=None): """ Returns all profiles. + :param proxies: proxy info to access the data :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A dictionary of all profiles in Fingertips including information on domains and sequencing """ @@ -253,10 +272,11 @@ def get_all_profiles(is_test=False): return profiles -def get_domains_in_profile(profile_id): +def get_domains_in_profile(profile_id, proxies=None): """ Returns the domain IDs for a given profile. + :param proxies: proxy info to access the data :param profile_id: ID used in Fingertips to identify a profile as integer or string :return: A list of domain IDs """ @@ -264,10 +284,11 @@ def get_domains_in_profile(profile_id): return profile['GroupIds'] -def get_area_types_for_profile(profile_id, is_test=False): +def get_area_types_for_profile(profile_id, is_test=False, proxies=None): """ Retrieves all the area types that have data for a given profile. + :param proxies: proxy info to access the data :param profile_id: ID used in Fingertips to identify a profile as integer or string :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data :return: A list of dictionaries of area types with relevant information @@ -278,10 +299,11 @@ def get_area_types_for_profile(profile_id, is_test=False): return get_json(base_url + 'area_types?profile_ids=' + str(profile_id)) -def get_area_type_ids_for_profile(profile_id): +def get_area_type_ids_for_profile(profile_id, proxies=None): """ Returns a list of area types used within a given profile. + :param proxies: proxy info to access the data :param profile_id: ID used in Fingertips to identify a profile as integer or string :return: A list of area types used within a given profile """ @@ -292,10 +314,11 @@ def get_area_type_ids_for_profile(profile_id): return area_type_list -def get_profile_by_name(profile_name): +def get_profile_by_name(profile_name, proxies=None): """ Returns a profile object given a name to search - try to be specific to get better results. + :param proxies: proxy info to access the data :param profile_name: A string or part of a string that is used as the profile name :return: A dictionary of the profile metadata including domain information or an error message """ @@ -310,12 +333,13 @@ def get_profile_by_name(profile_name): return profile_obj -def get_profile_by_key(profile_key): +def get_profile_by_key(profile_key, proxies=None): """ Returns a profile object given a key (as the stub following 'profile' in the website URL). For example, give, a URL of the form `https://fingertips.phe.org.uk/profile/general-practice/data#page/3/gid/2000...`, the key is 'general-practice'. + :param proxies: proxy info to access the data :param profile_key: The exact key for the profile. :return: A dictionary of the profile metadata including domain information or an error message """ @@ -326,10 +350,11 @@ def get_profile_by_key(profile_key): return 'Profile could not be found' -def get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False): +def get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False, proxies=None): """ Returns a dataframe of metadata for a given indicator ID or list of indicator IDs. + :param proxies: proxy info to access the data :param indicator_ids: Number or list of numbers used to identify an indicator within Fingertips as integer or string :return: Dataframe object with metadate for the indicator ID """ @@ -347,10 +372,11 @@ def get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False): return df -def get_metadata_for_domain_as_dataframe(group_ids, is_test=False): +def get_metadata_for_domain_as_dataframe(group_ids, is_test=False, proxies=None): """ Returns a dataframe of metadata for a given domain ID or list of domain IDs. + :param proxies: proxy info to access the data :param group_ids: Number or list of numbers used to identify a domain within Fingertips as integer or string :return: Dataframe object with metadata for the indicators for a given domain ID """ @@ -376,10 +402,11 @@ def get_metadata_for_domain_as_dataframe(group_ids, is_test=False): return df -def get_metadata_for_profile_as_dataframe(profile_ids): +def get_metadata_for_profile_as_dataframe(profile_ids, proxies=None): """ Returns a dataframe of metadata for a given profile ID or list of profile IDs. + :param proxies: proxy info to access the data :param profile_ids: ID or list of IDs used in Fingertips to identify a profile as integer or string :return: Dataframe object with metadata for the indicators for a given group ID """ @@ -403,11 +430,12 @@ def get_metadata_for_profile_as_dataframe(profile_ids): return df -def get_metadata(indicator_ids=None, domain_ids=None, profile_ids=None): +def get_metadata(indicator_ids=None, domain_ids=None, profile_ids=None, proxies=None): """ Returns a dataframe object of metadata for a given indicator, domain, and/or profile given the relevant IDs. At least one of these IDs has to be given otherwise an error is raised. + :param proxies: proxy info to access the data :param indicator_ids: [OPTIONAL] Number used to identify an indicator within Fingertips as integer or string :param domain_ids: [OPTIONAL] Number used to identify a domain within Fingertips as integer or string :param profile_ids: [OPTIONAL] ID used in Fingertips to identify a profile as integer or string From e84fb8683561ac06e4de23208918224b01525681 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 25 Jan 2023 11:01:01 +0000 Subject: [PATCH 05/34] started changing function definitions. --- fingertips_py/api_calls.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index 74e151f..a07e226 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -11,17 +11,17 @@ from io import StringIO -def make_request(url, attr=None, proxies=None): +def make_request(url, attr=None, proxy=None): """ :param url: A url to make a request :param attr: The attribute that needs to be returned - :param proxies: proxy info to access the data + :param proxy: proxy info to access the data :return: a dict of the attribute and associated data """ try: - req = requests.get(url, proxies=proxies) + req = requests.get(url, proxies=proxy) except requests.exceptions.SSLError: - req = requests.get(url, verify=False, proxies=proxies) + req = requests.get(url, verify=False, proxies=proxy) json_response = json.loads(req.content.decode('utf-8')) data = {} for item in json_response: From c6dd7813ec4e30bed568e77f7f6dddeee36ae5ab Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 25 Jan 2023 20:28:58 +0000 Subject: [PATCH 06/34] Added proxy variable to all functions in metadata.py and refactored several functions. --- fingertips_py/api_calls.py | 52 +++-- fingertips_py/metadata.py | 463 +++++++++++++++++++++---------------- 2 files changed, 302 insertions(+), 213 deletions(-) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index a07e226..03d7cd5 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -4,7 +4,6 @@ A group of functions to query the Fingertips api and retrieve data in a variety of formats. """ - import requests import json import pandas as pd @@ -15,7 +14,7 @@ def make_request(url, attr=None, proxy=None): """ :param url: A url to make a request :param attr: The attribute that needs to be returned - :param proxy: proxy info to access the data + :param proxy: proxy given to the get request used to access the API :return: a dict of the attribute and associated data """ try: @@ -30,31 +29,31 @@ def make_request(url, attr=None, proxy=None): return data -def get_json(url, proxies=None): +def get_json(url, proxy=None): """ :param url: A url to make a request - :param proxies: proxy info to access the data + :param proxy: proxy given to the get request used to access the API :return: A parsed JSON object """ try: - req = requests.get(url, proxies=proxies) + req = requests.get(url, proxies=proxy) except requests.exceptions.SSLError: - req = requests.get(url, verify=False, proxies=proxies) + req = requests.get(url, verify=False, proxies=proxy) json_resp = json.loads(req.content.decode('utf-8')) return json_resp -def get_json_return_df(url, transpose=True, proxies=None): +def get_json_return_df(url, transpose=True, proxy=None): """ :param url: A url to make a request :param transpose: [OPTIONAL] transposes dataframe. Default True. - :param proxies: proxy info to access the data + :param proxy: proxy given to the get request used to access the API :return: Dataframe generated from JSON response. """ try: - req = requests.get(url, proxies=proxies) + req = requests.get(url, proxies=proxy) except requests.exceptions.SSLError: - req = requests.get(url, verify=False, proxies=proxies) + req = requests.get(url, verify=False, proxies=proxy) try: df = pd.read_json(req.content, encoding='utf-8') except ValueError: @@ -64,16 +63,16 @@ def get_json_return_df(url, transpose=True, proxies=None): return df -def get_data_in_tuple(url, proxies=None): +def get_data_in_tuple(url, proxy=None): """ :param url: A url to make a request - :param proxies: proxy info to access the data + :param proxy: proxy given to the get request used to access the API :return: A tuple of returned data """ try: - req = requests.get(url, proxies=proxies) + req = requests.get(url, proxies=proxy) except requests.exceptions.SSLError: - req = requests.get(url, verify=False, proxies=proxies) + req = requests.get(url, verify=False, proxies=proxy) json_resp = json.loads(req.content.decode('utf-8')) tup = [tuple(d.values()) for d in json_resp] if isinstance(tup[0][0], str): @@ -82,13 +81,28 @@ def get_data_in_tuple(url, proxies=None): return tup -def deal_with_url_error(url, proxies=None): +def get_csv(url, proxy=None): + """ + :param url: A url to make a request + :param proxy: proxy given to the get request used to access the API + :return: A pandas df of the csv file + """ + try: + req = requests.get(url, proxies=proxy).text + + except requests.exceptions.SSLError: + req = requests.get(url, verify=False, proxies=proxy).text + + return pd.read_csv(StringIO(req)) + + +def deal_with_url_error(url, proxy=None): """ :param url: A url that returns a URL Error based on SSL errors - :param proxies: proxy info to access the data - :return: A dataframe from the URL with varify set to false. + :param proxy: proxy given to the get request used to access the API + :return: A dataframe from the URL with verify set to false. """ - req = requests.get(url, verify=False, proxies=proxies) + req = requests.get(url, verify=False, proxies=proxy) s = str(req.content, 'utf-8') data = StringIO(s) df = pd.read_csv(data) @@ -96,5 +110,3 @@ def deal_with_url_error(url, proxies=None): base_url = 'http://fingertips.phe.org.uk/api/' - - diff --git a/fingertips_py/metadata.py b/fingertips_py/metadata.py index 6e215d6..ee59659 100644 --- a/fingertips_py/metadata.py +++ b/fingertips_py/metadata.py @@ -1,223 +1,255 @@ """ metadata.py ================================== -Calls used to retrieve metadata about areas, ages, sexes, value notes, calculation methods, rates, and indicator -metadata. +Calls used to retrieve metadata about areas, ages, sexes, value notes, +calculation methods, rates, and indicator metadata. """ import pandas as pd from urllib.error import HTTPError, URLError -from .api_calls import get_data_in_tuple, base_url, make_request, get_json, get_json_return_df, deal_with_url_error +from .api_calls import get_data_in_tuple, base_url, make_request, get_json, \ + get_json_return_df, get_csv, deal_with_url_error -def get_all_ages(is_test=False, proxies=None): +def get_all_ages(is_test=False, proxy=None): """ Returns a dictionary of all the age categories and their IDs. - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data - :param proxies: proxy info to access the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Age codes used in Fingertips in a tuple """ - ages = get_data_in_tuple(base_url + 'ages') + ages = get_data_in_tuple(base_url + 'ages', proxy) if is_test: return ages, base_url + 'ages' return ages -def get_all_areas(is_test=False, proxies=None): +def get_all_areas(is_test=False, proxy=None): """ - Retreives all area types. + Retrieves all area types. - :param proxies: proxy info to access the data - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: A dictionary of all area types used in Fingertips """ - areas = make_request(base_url + 'area_types', 'Id') + areas = make_request(base_url + 'area_types', 'Id', proxy) if is_test: return areas, base_url + 'area_types' return areas -def get_age_id(age, is_test=False, proxies=None): +def get_age_id(age, is_test=False, proxy=None): """ Returns an ID for a given age. - :param proxies: proxy info to access the data :param age: Search term of an age or age range as a string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Code used in Fingertips to represent the age or age range as a string """ - ages = make_request(base_url + 'ages', 'Name') + ages = make_request(base_url + 'ages', 'Name', proxy) if is_test: return ages[age]['Id'], base_url + 'ages' return ages[age]['Id'] -def get_age_from_id(age_id, is_test=False, proxies=None): +def get_age_from_id(age_id, is_test=False, proxy=None): """ Returns an age name from given id. - :param proxies: proxy info to access the data :param age_id: Age id used in Fingertips as an integer - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Age or age range as a string """ - ages = make_request(base_url + 'ages', 'Id') + ages = make_request(base_url + 'ages', 'Id', proxy) if is_test: return ages[age_id]['Name'], base_url + 'ages' return ages[age_id]['Name'] -def get_all_sexes(is_test=False, proxies=None): +def get_all_sexes(is_test=False, proxy=None): """ Returns a tuple of all sex categories and their IDs. - :param proxies: proxy info to access the data - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Sex categories used in Fingertips with associated codes as a tuple """ - sexes = get_data_in_tuple(base_url + 'sexes') + sexes = get_data_in_tuple(base_url + 'sexes', proxy) if is_test: return sexes, base_url + 'sexes' return sexes -def get_sex_id(sex, is_test=False, proxies=None): +def get_sex_id(sex, is_test=False, proxy=None): """ Returns an ID for a given sex. - :param proxies: proxy info to access the data :param sex: Sex category as string (Case sensitive) - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: ID used in Fingertips to represent the sex as integer """ - sexes = make_request(base_url + 'sexes', 'Name') + sexes = make_request(base_url + 'sexes', 'Name', proxy) if is_test: return sexes[sex]['Id'], base_url + 'sexes' return sexes[sex]['Id'] -def get_sex_from_id(sex_id, is_test=False, proxies=None): +def get_sex_from_id(sex_id, is_test=False, proxy=None): """ Returns a sex name given an id. - :param proxies: proxy info to access the data :param sex_id: ID used in Fingertips to represent the sex as integer - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Sex category as string """ - sexes = make_request(base_url + 'sexes', 'Id') + sexes = make_request(base_url + 'sexes', 'Id', proxy) if is_test: return sexes[sex_id]['Name'], base_url + 'sexes' return sexes[sex_id]['Name'] -def get_all_value_notes(is_test=False, proxies=None): +def get_all_value_notes(is_test=False, proxy=None): """ Returns a dictionary of all value notes and their IDs. - :param proxies: proxy info to access the data - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data - :return: Data value notes and their associated codes that are used in Fingertips as a list of tuples + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API + :return: Data value notes and their associated codes that are used in + Fingertips as a list of tuples """ - value_notes = get_data_in_tuple(base_url + 'value_notes') + value_notes = get_data_in_tuple(base_url + 'value_notes', proxy) if is_test: return value_notes, base_url + 'value_notes' return value_notes -def get_value_note_id(value_note, is_test=False, proxies=None): +def get_value_note_id(value_note, is_test=False, proxy=None): """ Returns a value note ID for a given value note. - :param proxies: proxy info to access the data :param value_note: Value note as string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: ID used in Fingertips to represent the value note as integer """ - value_notes = make_request(base_url + 'value_notes', 'Text') + value_notes = make_request(base_url + 'value_notes', 'Text', proxy) if is_test: return value_notes[value_note]['Id'], base_url + 'value_notes' return value_notes[value_note]['Id'] -def get_areas_for_area_type(area_type_id, is_test=False, proxies=None): +def get_areas_for_area_type(area_type_id, is_test=False, proxy=None): """ - Returns a dictionary of areas that match an area type id given the id as integer or string. + Returns a dictionary of areas that match an area type id given the id as + integer or string. - :param proxies: proxy info to access the data - :param area_type_id: ID of area type (ID of General Practice is 7 etc) used in Fingertips as integer or string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data - :return: A dictionary of dictionaries with area codes and the names of those areas + :param area_type_id: ID of area type (ID of General Practice is 7 etc) used + in Fingertips as integer or string + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API + :return: A dictionary of dictionaries with area codes and the names of + those areas """ areas = make_request( base_url + 'areas/by_area_type?area_type_id=' + str(area_type_id), - 'Code') + 'Code', proxy) if is_test: return areas, base_url + 'areas/by_area_type?area_type_id=' + str(area_type_id) return areas -def get_metadata_for_indicator(indicator_number, is_test=False, proxies=None): +def get_metadata_for_indicator(indicator_number, is_test=False, proxy=None): """ - Returns the metadata for an indicator given the indicator number as integer or string. + Returns the metadata for an indicator given the indicator number as integer + or string. - :param proxies: proxy info to access the data - :param indicator_number: Number used to identify an indicator within Fingertips as integer or string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param indicator_number: Number used to identify an indicator within + Fingertips as integer or string + :param proxy: proxy given to the get request used to access the API + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data :return: A dictionary of metadata for the given indicator """ - metadata = get_json(base_url + 'indicator_metadata/by_indicator_id?indicator_ids=' + str(indicator_number)) + metadata = get_json(base_url + + 'indicator_metadata/by_indicator_id?indicator_ids=' + + str(indicator_number), proxy) if is_test: - return metadata, base_url + 'indicator_metadata/by_indicator_id?indicator_ids=' + str(indicator_number) + return metadata, base_url + \ + 'indicator_metadata/by_indicator_id?indicator_ids=' \ + + str(indicator_number) return metadata -def get_metadata_for_all_indicators_from_csv(is_test=False, proxies=None): +def get_metadata_for_all_indicators_from_csv(is_test=False, proxy=None): """ Returns a dataframe from the csv of all metadata for all indicators. - :param proxies: proxy info to access the data - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: A dataframe of all metadata for all indicators """ try: - metadata = pd.read_csv(base_url + 'indicator_metadata/csv/all') + metadata = get_csv(base_url + 'indicator_metadata/csv/all', proxy) + except URLError: - metadata = deal_with_url_error(base_url + 'indicator_metadata/csv/all') + metadata = deal_with_url_error( + base_url + 'indicator_metadata/csv/all', proxy) + if is_test: return metadata, base_url + 'indicator_metadata/csv/all' return metadata -def get_metadata_for_all_indicators(include_definition='no', include_system_content='no', is_test=False, proxies=None): +def get_metadata_for_all_indicators(include_definition='no', + include_system_content='no', + is_test=False, proxy=None): """ Returns the metadata for all indicators in a dataframe. - :param proxies: proxy info to access the data :param include_definition: optional to include definitions :param include_system_content: optional to include system content - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: dataframe of all indicators """ url = 'indicator_metadata/all?include_definition={}&include_system_content={}' url_suffix = url.format(include_definition, include_system_content) - metadata_df = get_json_return_df(base_url + url_suffix) + metadata_df = get_json_return_df(base_url + url_suffix, proxy) if is_test: return metadata_df, base_url + url_suffix return metadata_df -def get_multiplier_and_calculation_for_indicator(indicator_number, proxies=None): +def get_multiplier_and_calculation_for_indicator(indicator_number, proxy=None): """ Returns the multiplier and calculation method for a given indicator. - :param proxies: proxy info to access the data - :param indicator_number: Number used to identify an indicator within Fingertips as integer or string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data - :return: A tuple of multiplier and calculation method from Fingetips metadata + :param indicator_number: Number used to identify an indicator within + Fingertips as integer or string + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy info to access the data + :return: A tuple of multiplier and calculation method from Fingertips + metadata """ - metadata = get_metadata_for_indicator(indicator_number) + metadata = get_metadata_for_indicator(indicator_number, proxy=proxy) multiplier = metadata[str(indicator_number)]['Unit']['Value'] calc_metadata = metadata[str(indicator_number)]['ConfidenceIntervalMethod']['Name'] if 'wilson' in calc_metadata.lower(): @@ -229,100 +261,119 @@ def get_multiplier_and_calculation_for_indicator(indicator_number, proxies=None) return multiplier, calc -def get_area_types_as_dict(is_test=False, proxies=None): +def get_area_types_as_dict(is_test=False, proxy=None): """ Returns all area types and related information such as ID and name. - :param proxies: proxy info to access the data - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy info to access the data :return: A dictionary of area types """ - areas = get_json(base_url + 'area_types') + areas = get_json(base_url + 'area_types', proxy) if is_test: return areas, base_url + 'area_types' return areas -def get_profile_by_id(profile_id, is_test=False, proxies=None): +def get_profile_by_id(profile_id, is_test=False, proxy=None): """ - Returns a profile as an dictionary which contains information about domains and sequencing. + Returns a profile as an dictionary which contains information about domains + and sequencing. - :param proxies: proxy info to access the data - :param profile_id: ID used in Fingertips to identify a profile as integer or string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param profile_id: ID used in Fingertips to identify a profile as integer + or string + :param proxy: proxy info to access the data + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data :return: A dictionary of information about the profile """ + + tmp_url = base_url + 'profile?profile_id=' + str(profile_id) + if is_test: - return get_json(base_url + 'profile?profile_id=' + str(profile_id)), base_url + 'profile?profile_id=' + \ - str(profile_id) - return get_json(base_url + 'profile?profile_id=' + str(profile_id)) + return get_json(tmp_url, proxy), tmp_url + return get_json(tmp_url, proxy) -def get_all_profiles(is_test=False, proxies=None): + +def get_all_profiles(is_test=False, proxy=None): """ Returns all profiles. - :param proxies: proxy info to access the data - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data - :return: A dictionary of all profiles in Fingertips including information on domains and sequencing + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy info to access the data + :return: A dictionary of all profiles in Fingertips including information + on domains and sequencing """ - profiles = get_json(base_url + 'profiles') + profiles = get_json(base_url + 'profiles', proxy) if is_test: return profiles, base_url + 'profiles' return profiles -def get_domains_in_profile(profile_id, proxies=None): +def get_domains_in_profile(profile_id, proxy=None): """ Returns the domain IDs for a given profile. - :param proxies: proxy info to access the data - :param profile_id: ID used in Fingertips to identify a profile as integer or string + :param profile_id: ID used in Fingertips to identify a profile as integer + or string + :param proxy: proxy given to the get request used to access the API :return: A list of domain IDs """ - profile = get_profile_by_id(profile_id) + profile = get_profile_by_id(profile_id, proxy=proxy) return profile['GroupIds'] -def get_area_types_for_profile(profile_id, is_test=False, proxies=None): +def get_area_types_for_profile(profile_id, is_test=False, proxy=None): """ Retrieves all the area types that have data for a given profile. - :param proxies: proxy info to access the data - :param profile_id: ID used in Fingertips to identify a profile as integer or string - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param profile_id: ID used in Fingertips to identify a profile as integer + or string + :param proxy: proxy given to the get request used to access the API + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data :return: A list of dictionaries of area types with relevant information """ + + tmp_url = base_url + 'area_types?profile_ids=' + str(profile_id) + if is_test: - return get_json(base_url + 'area_types?profile_ids=' + str(profile_id)), base_url + 'area_types?profile_ids=' + \ - str(profile_id) - return get_json(base_url + 'area_types?profile_ids=' + str(profile_id)) + return get_json(tmp_url, proxy), tmp_url + + return get_json(tmp_url, proxy) -def get_area_type_ids_for_profile(profile_id, proxies=None): +def get_area_type_ids_for_profile(profile_id, proxy=None): """ Returns a list of area types used within a given profile. - :param proxies: proxy info to access the data - :param profile_id: ID used in Fingertips to identify a profile as integer or string + :param profile_id: ID used in Fingertips to identify a profile as integer + or string + :param proxy: proxy given to the get request used to access the API :return: A list of area types used within a given profile """ - area_type_obj = get_area_types_for_profile(profile_id) + area_type_obj = get_area_types_for_profile(profile_id, proxy=proxy) area_type_list = [] for area_type in area_type_obj: area_type_list.append(area_type['Id']) return area_type_list -def get_profile_by_name(profile_name, proxies=None): +def get_profile_by_name(profile_name, proxy=None): """ - Returns a profile object given a name to search - try to be specific to get better results. + Returns a profile object given a name to search - try to be specific to get + better results. - :param proxies: proxy info to access the data - :param profile_name: A string or part of a string that is used as the profile name - :return: A dictionary of the profile metadata including domain information or an error message + :param profile_name: A string or part of a string that is used as the + profile name + :param proxy: proxy given to the get request used to access the API + :return: A dictionary of the profile metadata including domain information + or an error message """ - all_profiles = get_all_profiles() + all_profiles = get_all_profiles(proxy=proxy) profile_obj = '' for profile in all_profiles: if profile_name.lower() in profile['Name'].lower(): @@ -333,135 +384,161 @@ def get_profile_by_name(profile_name, proxies=None): return profile_obj -def get_profile_by_key(profile_key, proxies=None): +def get_profile_by_key(profile_key, proxy=None): """ - Returns a profile object given a key (as the stub following 'profile' in the website URL). For example, - give, a URL of the form `https://fingertips.phe.org.uk/profile/general-practice/data#page/3/gid/2000...`, + Returns a profile object given a key (as the stub following 'profile' in the + website URL). For example, give, a URL of the form + `https://fingertips.phe.org.uk/profile/general-practice/data#page/3/gid/2000...`, the key is 'general-practice'. - :param proxies: proxy info to access the data :param profile_key: The exact key for the profile. - :return: A dictionary of the profile metadata including domain information or an error message + :param proxy: proxy info to access the data + :return: A dictionary of the profile metadata including domain information + or an error message """ - all_profiles = get_all_profiles() + all_profiles = get_all_profiles(proxy=proxy) for profile in all_profiles: if profile['Key'] == profile_key: return profile return 'Profile could not be found' -def get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False, proxies=None): +def get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False, + proxy=None): """ - Returns a dataframe of metadata for a given indicator ID or list of indicator IDs. + Returns a dataframe of metadata for a given indicator ID or list of + indicator IDs. - :param proxies: proxy info to access the data - :param indicator_ids: Number or list of numbers used to identify an indicator within Fingertips as integer or string + :param indicator_ids: Number or list of numbers used to identify an + indicator within Fingertips as integer or string + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Dataframe object with metadate for the indicator ID """ - url_suffix = "indicator_metadata/csv/by_indicator_id?indicator_ids={}" + if isinstance(indicator_ids, list): indicator_ids = ','.join(list(map(str, indicator_ids))) + else: + indicator_ids = str(indicator_ids) + + tmp_url = base_url + f"indicator_metadata/csv/by_indicator_id?" \ + f"indicator_ids={indicator_ids}" try: - df = pd.read_csv(base_url + url_suffix.format(str(indicator_ids))) + df = get_csv(tmp_url, proxy) except HTTPError: - raise NameError('Indicator {} does not exist'.format(indicator_ids)) + raise NameError(f"Indicator {indicator_ids} does not exist") except URLError: - df = deal_with_url_error(base_url + url_suffix.format(str(indicator_ids))) + df = deal_with_url_error(tmp_url, proxy) + if is_test: - return df, base_url + url_suffix.format(str(indicator_ids)) + return df, tmp_url return df -def get_metadata_for_domain_as_dataframe(group_ids, is_test=False, proxies=None): +def get_metadata_for_domain_as_dataframe(group_ids, is_test=False, proxy=None): """ - Returns a dataframe of metadata for a given domain ID or list of domain IDs. + Returns a dataframe of metadata for a given domain ID or list of domain + IDs. - :param proxies: proxy info to access the data - :param group_ids: Number or list of numbers used to identify a domain within Fingertips as integer or string - :return: Dataframe object with metadata for the indicators for a given domain ID + :param group_ids: Number or list of numbers used to identify a domain + within Fingertips as integer or string + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API + :return: Dataframe object with metadata for the indicators for a given + domain ID """ - url_suffix = "indicator_metadata/csv/by_group_id?group_id={}" - if isinstance(group_ids, list): - df = pd.DataFrame() - for group_id in group_ids: - try: - df = df.append(pd.read_csv(base_url + url_suffix.format(str(group_id)))) - except HTTPError: - raise NameError('Domain {} does not exist'.format(group_id)) - except URLError: - df = deal_with_url_error(base_url + url_suffix.format(str(group_id))) - else: + if not isinstance(group_ids, list): + group_ids = [group_ids] + + list_of_df = [] + + for group_id in group_ids: + + tmp_url = base_url + f"indicator_metadata/csv/by_group_id" \ + f"?group_id={group_id}" try: - df = pd.read_csv(base_url + url_suffix.format(str(group_ids))) + list_of_df.append(get_csv(tmp_url, proxy)) except HTTPError: - raise NameError('Domain {} does not exist'.format(group_ids)) + raise NameError(f"Domain {group_id} does not exist") except URLError: - df = deal_with_url_error(base_url + url_suffix.format(str(group_ids))) + list_of_df.append(deal_with_url_error(tmp_url, proxy)) + else: + df = pd.concat(list_of_df) + if is_test: - return df, base_url + url_suffix.format(str(group_ids)) + return df, tmp_url return df -def get_metadata_for_profile_as_dataframe(profile_ids, proxies=None): +def get_metadata_for_profile_as_dataframe(profile_ids, proxy=None): """ - Returns a dataframe of metadata for a given profile ID or list of profile IDs. + Returns a dataframe of metadata for a given profile ID or list of profile + IDs. - :param proxies: proxy info to access the data - :param profile_ids: ID or list of IDs used in Fingertips to identify a profile as integer or string - :return: Dataframe object with metadata for the indicators for a given group ID + :param profile_ids: ID or list of IDs used in Fingertips to identify a + profile as integer or string + :param proxy: proxy given to the get request used to access the API + :return: Dataframe object with metadata for the indicators for a given + group ID """ url_suffix = "indicator_metadata/csv/by_profile_id?profile_id={}" - if isinstance(profile_ids, list): - df = pd.DataFrame() - for profile_id in profile_ids: - try: - df = df.append(pd.read_csv(base_url + url_suffix.format(str(profile_id)))) - except HTTPError: - raise NameError('Profile {} does not exist'.format(profile_id)) - except URLError: - df = deal_with_url_error(base_url + url_suffix.format(str(profile_id))) - else: + + if not isinstance(profile_ids, list): + profile_ids = [profile_ids] + + list_of_df = [] + + for profile_id in profile_ids: + + tmp_url = base_url + f"indicator_metadata/csv/by_profile_id" \ + f"?profile_id={profile_id}" try: - df = pd.read_csv(base_url + url_suffix.format(str(profile_ids))) + list_of_df.append(get_csv(tmp_url, proxy)) except HTTPError: - raise NameError('Profile {} does not exist'.format(profile_ids)) + raise NameError(f"Profile {profile_id} does not exist") except URLError: - df = deal_with_url_error(base_url + url_suffix.format(str(profile_ids))) - return df + list_of_df.append(deal_with_url_error((tmp_url, proxy))) + return pd.concat(list_of_df) -def get_metadata(indicator_ids=None, domain_ids=None, profile_ids=None, proxies=None): + +def get_metadata(indicator_ids=None, domain_ids=None, profile_ids=None, + proxy=None): """ - Returns a dataframe object of metadata for a given indicator, domain, and/or profile given the relevant IDs. At + Returns a dataframe object of metadata for a given indicator, domain, + and/or profile given the relevant IDs. At least one of these IDs has to be given otherwise an error is raised. - :param proxies: proxy info to access the data - :param indicator_ids: [OPTIONAL] Number used to identify an indicator within Fingertips as integer or string - :param domain_ids: [OPTIONAL] Number used to identify a domain within Fingertips as integer or string - :param profile_ids: [OPTIONAL] ID used in Fingertips to identify a profile as integer or string - :return: A dataframe object with metadata for the given IDs or an error if nothing is specified - """ - if indicator_ids and domain_ids and profile_ids: - df = get_metadata_for_profile_as_dataframe(profile_ids) - df = df.append(get_metadata_for_domain_as_dataframe(domain_ids)) - df = df.append(get_metadata_for_indicator_as_dataframe(indicator_ids)) - return df - if indicator_ids and domain_ids: - df = get_metadata_for_domain_as_dataframe(domain_ids) - df = df.append(get_metadata_for_indicator_as_dataframe(indicator_ids)) - return df - if indicator_ids and profile_ids: - df = get_metadata_for_profile_as_dataframe(profile_ids) - df = df.append(get_metadata_for_indicator_as_dataframe(indicator_ids)) - return df - if domain_ids and profile_ids: - df = get_metadata_for_profile_as_dataframe(profile_ids) - df = df.append(get_metadata_for_domain_as_dataframe(domain_ids)) - return df - if profile_ids: - return get_metadata_for_profile_as_dataframe(profile_ids) - if domain_ids: - return get_metadata_for_domain_as_dataframe(domain_ids) + :param indicator_ids: [OPTIONAL] Number used to identify an indicator + within Fingertips as integer or string + :param domain_ids: [OPTIONAL] Number used to identify a domain within + Fingertips as integer or string + :param profile_ids: [OPTIONAL] ID used in Fingertips to identify a profile + as integer or string + :param proxy: proxy info to access the data + :return: A dataframe object with metadata for the given IDs or an error if + nothing is specified + """ + + # Works as long as there is no id that equals zero + if not any([indicator_ids, domain_ids, profile_ids]): + raise NameError( + 'Must use a valid indicator IDs, domain IDs or profile IDs') + + list_of_df = [] + if indicator_ids: - return get_metadata_for_indicator_as_dataframe(indicator_ids) - raise NameError('Must use a valid indicator IDs, domain IDs or profile IDs') + list_of_df.append(get_metadata_for_profile_as_dataframe( + profile_ids, proxy)) + + if domain_ids: + list_of_df.append(get_metadata_for_domain_as_dataframe( + domain_ids, proxy)) + + if profile_ids: + list_of_df.append(get_metadata_for_indicator_as_dataframe( + indicator_ids, proxy)) + + return pd.concat(list_of_df) From 7e344023562468fa86623f29100310a814da7f0a Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 25 Jan 2023 21:24:59 +0000 Subject: [PATCH 07/34] Added proxy variable to functions. --- fingertips_py/retrieve_data.py | 204 ++++++++++++++++++++------------- 1 file changed, 124 insertions(+), 80 deletions(-) diff --git a/fingertips_py/retrieve_data.py b/fingertips_py/retrieve_data.py index 6d33c93..5fd4634 100644 --- a/fingertips_py/retrieve_data.py +++ b/fingertips_py/retrieve_data.py @@ -1,162 +1,206 @@ """ retrieve_data.py ================================== -A group of functions to retrieve data from Fingertips by indicator, profile, domain (group), or geography. +A group of functions to retrieve data from Fingertips by indicator, profile, +domain (group), or geography. """ - import pandas as pd from urllib.error import URLError, HTTPError from .api_calls import base_url, get_json_return_df, deal_with_url_error -from .metadata import get_area_type_ids_for_profile, get_metadata_for_all_indicators, get_all_areas +from .metadata import get_area_type_ids_for_profile, get_csv, \ + get_metadata_for_all_indicators, get_all_areas -def get_data_by_indicator_ids(indicator_ids, area_type_id, parent_area_type_id=15, profile_id=None, - include_sortable_time_periods=None, is_test=False): +def get_data_by_indicator_ids(indicator_ids, area_type_id, + parent_area_type_id=15, profile_id=None, + include_sortable_time_periods=None, + is_test=False, + proxy=None): """ - Returns a dataframe of indicator data given a list of indicators and area types. + Returns a dataframe of indicator data given a list of indicators and area + types. :param indicator_ids: List of indicator IDs as strings - :param area_type_id: ID of area type (eg. CCG, Upper Tier Local Authority) used in Fingertips as integer or string - :param parent_area_type_id: Area type of parent area - defaults to England value + :param area_type_id: ID of area type (eg. CCG, Upper Tier Local Authority) + used in Fingertips as integer or string + :param parent_area_type_id: Area type of parent area - defaults to England + value :param profile_id: ID of profile to select by as either int or string - :param include_sortable_time_periods: Boolean as to whether to include a sort-friendly data field - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param include_sortable_time_periods: Boolean as to whether to include a + sort-friendly data field + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: A dataframe of data relating to the given indicators """ + url_append = "" + + if profile_id: + url_append += f"&profile_id={profile_id}" + + if include_sortable_time_periods: + url_append += "&include_sortable_time_periods=yes" - url_suffix = 'all_data/csv/by_indicator_id?indicator_ids={}&child_area_type_id={}&parent_area_type_id={}' - if profile_id and not include_sortable_time_periods: - url_addition = '&profile_id={}'.format(str(profile_id)) - url_suffix = url_suffix + url_addition - elif include_sortable_time_periods and not profile_id: - url_addition = '&include_sortable_time_periods=yes' - url_suffix = url_suffix + url_addition - elif profile_id and include_sortable_time_periods: - url_addition = '&profile_id={}&include_sortable_time_periods=yes'.format(str(profile_id)) - url_suffix = url_suffix + url_addition if isinstance(indicator_ids, list): - if any(isinstance(ind, int) for ind in indicator_ids): - indicator_ids = ','.join(str(ind) for ind in indicator_ids) - else: - indicator_ids = ','.join(indicator_ids) - else: - indicator_ids = str(indicator_ids) - populated_url = url_suffix.format(indicator_ids, str(area_type_id), parent_area_type_id) + indicator_ids = ','.join(list(map(str, indicator_ids))) + + tmp_url = base_url + f"all_data/csv/by_indicator_id?indicator_ids" \ + f"={indicator_ids}&child_area_type_id" \ + f"={area_type_id}&parent_area_type_id" \ + f"={parent_area_type_id}" + url_append try: - df = pd.read_csv(base_url + populated_url) + df = get_csv(tmp_url, proxy) except URLError: - df = deal_with_url_error(base_url + populated_url) + df = deal_with_url_error(tmp_url, proxy) if is_test: - return df, base_url + populated_url + return df, tmp_url return df -def get_all_data_for_profile(profile_id, parent_area_type_id=15, area_type_id=None, filter_by_area_codes=None, - is_test=False): +def get_all_data_for_profile(profile_id, parent_area_type_id=15, + area_type_id=None, filter_by_area_codes=None, + is_test=False, + proxy=None): """ Returns a dataframe of data for all indicators within a profile. - :param profile_id: ID used in Fingertips to identify a profile as integer or string - :param parent_area_type_id: Area type of parent area - defaults to England value - :param area_type_id: Option to only return data for a given area type. Area type ids are string, int or a list. - :param filter_by_area_codes: Option to limit returned data to areas. Areas as either string or list of strings. - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data - :return: A dataframe of data for all indicators within a profile with any filters applied + :param profile_id: ID used in Fingertips to identify a profile as integer + or string. + :param parent_area_type_id: Area type of parent area - defaults to England. + value + :param area_type_id: Option to only return data for a given area type. Area + type ids are string, int or a list. + :param filter_by_area_codes: Option to limit returned data to areas. Areas + as either string or list of strings. + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API + :return: A dataframe of data for all indicators within a profile with any + filters applied. """ if area_type_id: - area_types = area_type_id + area_types = [area_type_id] else: - area_types = get_area_type_ids_for_profile(profile_id) - url_suffix = 'all_data/csv/by_profile_id?child_area_type_id={}&parent_area_type_id={}&profile_id={}' - df = pd.DataFrame() + area_types = get_area_type_ids_for_profile(profile_id, proxy) + + list_of_df = [] + for area in area_types: - populated_url = url_suffix.format(area, parent_area_type_id, profile_id) + + tmp_url = base_url + f"all_data/csv/by_profile_id?child_area_type_id" \ + f"={area}&parent_area_type_id={parent_area_type_id}" \ + f"&profile_id={profile_id}" try: - df_returned = pd.read_csv(base_url + populated_url) - except HTTPError: - raise Exception('There has been a server error with Fingertips for this request. ') + list_of_df.append(get_csv(tmp_url, proxy)) + except URLError: - df_returned = deal_with_url_error(base_url + populated_url) - df = df.append(df_returned) + list_of_df.append(deal_with_url_error(tmp_url, proxy)) + else: + df = pd.concat(list_of_df) + if filter_by_area_codes: if isinstance(filter_by_area_codes, list): df = df.loc[df['Area Code'].isin(filter_by_area_codes)] elif isinstance(filter_by_area_codes, str): df = df.loc[df['Area Code'] == filter_by_area_codes] df = df.reset_index() + if is_test: - return df, base_url + populated_url + return df, tmp_url return df -def get_all_data_for_indicators(indicators, area_type_id, parent_area_type_id=15, filter_by_area_codes=None, - is_test=False): +def get_all_data_for_indicators(indicators, area_type_id, + parent_area_type_id=15, + filter_by_area_codes=None, + is_test=False, + proxy=None): """ Returns a dataframe of data for given indicators at an area. :param indicators: List or integer or string of indicator Ids - :param area_type_id: ID of area type (eg. ID of General Practice is 7 etc) used in Fingertips as integer or string - :param parent_area_type_id: Area type of parent area - defaults to England value - :param filter_by_area_codes: Option to limit returned data to areas. Areas as either string or list of strings - :param is_test: Used for testing. Returns a tuple of expected return and the URL called to retrieve the data + :param area_type_id: ID of area type (eg. ID of General Practice is 7 etc) + used in Fingertips as integer or string + :param parent_area_type_id: Area type of parent area - defaults to England + value + :param filter_by_area_codes: Option to limit returned data to areas. Areas + as either string or list of strings + :param is_test: Used for testing. Returns a tuple of expected return and + the URL called to retrieve the data + :param proxy: proxy given to the get request used to access the API :return: Dataframe of data for given indicators at an area """ - url_suffix = 'all_data/csv/by_indicator_id?indicator_ids={}&child_area_type_id={}&parent_area_type_id={}' if isinstance(indicators, list): - if any(isinstance(ind, int) for ind in indicators): - indicators = ','.join(str(ind) for ind in indicators) - else: - indicators = ','.join(indicators) - else: - indicators = str(indicators) - populated_url = url_suffix.format(indicators, str(area_type_id), str(parent_area_type_id)) + indicators = ','.join(list(map(str, indicators))) + + tmp_url = base_url + f"all_data/csv/by_indicator_id?indicator_ids" \ + f"={indicators}&child_area_type_id={area_type_id}" \ + f"&parent_area_type_id={parent_area_type_id}" try: - df = pd.read_csv(base_url + populated_url) + df = get_csv(tmp_url, proxy) except URLError: - df = deal_with_url_error(base_url + populated_url) - df.reset_index() + df = deal_with_url_error(tmp_url, proxy) + if filter_by_area_codes: if isinstance(filter_by_area_codes, list): df = df.loc[df['Area Code'].isin(filter_by_area_codes)] elif isinstance(filter_by_area_codes, str): df = df.loc[df['Area Code'] == filter_by_area_codes] - df = df.reset_index() + + df.reset_index(inplace=True) + if is_test: - return df, base_url + populated_url + return df, tmp_url return df -def get_all_areas_for_all_indicators(): +def get_all_areas_for_all_indicators(proxy=None): """ Returns a dataframe of all indicators and their geographical breakdowns. + :param proxy: proxy given to the get request used to access the API :return: Dataframe of all indicators and their geographical breakdowns """ url_suffix = 'available_data' - df = get_json_return_df(base_url + url_suffix, transpose=False) - indicator_metadata = get_metadata_for_all_indicators() - df = pd.merge(df, indicator_metadata[['Descriptive']], left_on='IndicatorId', right_index=True) + + df = get_json_return_df(base_url + url_suffix, transpose=False, + proxy=proxy) + + indicator_metadata = get_metadata_for_all_indicators(proxy=proxy) + + df = pd.merge(df, indicator_metadata[['Descriptive']], + left_on='IndicatorId', right_index=True) + df['IndicatorName'] = df.apply(lambda x: x['Descriptive']['Name'], axis=1) - areas = get_all_areas() - df['GeographicalArea'] = df.apply(lambda x: areas[x['AreaTypeId']]['Name'], axis=1) + + areas = get_all_areas(proxy=proxy) + + df['GeographicalArea'] = df.apply(lambda x: areas[x['AreaTypeId']]['Name'], + axis=1) df = df[['IndicatorId', 'IndicatorName', 'GeographicalArea', 'AreaTypeId']] + return df -def get_data_for_indicator_at_all_available_geographies(indicator_id): +def get_data_for_indicator_at_all_available_geographies(indicator_id, + proxy=None): """ - Returns a dataframe of all data for an indicator for all available geographies. + Returns a dataframe of all data for an indicator for all available + geographies. :param indicator_id: Indicator id - :return: Dataframe of data for indicator for all available areas for all time periods + :param proxy: proxy given to the get request used to access the API + :return: Dataframe of data for indicator for all available areas for all + time periods """ - all_area_for_all_indicators = get_all_areas_for_all_indicators() - areas_for_indicator = all_area_for_all_indicators[all_area_for_all_indicators['IndicatorId'] == indicator_id] + all_area_for_all_indicators = get_all_areas_for_all_indicators(proxy) + areas_for_indicator = all_area_for_all_indicators[ + all_area_for_all_indicators['IndicatorId'] == indicator_id] areas_to_get = areas_for_indicator['AreaTypeId'].unique() df = pd.DataFrame() for area in areas_to_get: - df_temp = get_data_by_indicator_ids(indicator_id, area) + df_temp = get_data_by_indicator_ids(indicator_id, area, proxy=proxy) df = df.append(df_temp) df.drop_duplicates(inplace=True) return df From d2401bf84fcebe254e9f5615faa8698274f4f06a Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 25 Jan 2023 21:28:01 +0000 Subject: [PATCH 08/34] Added HTTP error exception to get_csv. --- fingertips_py/api_calls.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index 03d7cd5..e75a698 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -8,6 +8,7 @@ import json import pandas as pd from io import StringIO +import urllib def make_request(url, attr=None, proxy=None): @@ -93,6 +94,10 @@ def get_csv(url, proxy=None): except requests.exceptions.SSLError: req = requests.get(url, verify=False, proxies=proxy).text + except urllib.error.HTTPError: + raise Exception( + 'There has been a server error with Fingertips for this request.') + return pd.read_csv(StringIO(req)) From 4cfbd2af20adbdd73b774e52505709d125057c9b Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 25 Jan 2023 21:29:53 +0000 Subject: [PATCH 09/34] Removed extraneous lines and cleaned up text. --- fingertips_py/metadata.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/fingertips_py/metadata.py b/fingertips_py/metadata.py index ee59659..4e393ea 100644 --- a/fingertips_py/metadata.py +++ b/fingertips_py/metadata.py @@ -386,8 +386,8 @@ def get_profile_by_name(profile_name, proxy=None): def get_profile_by_key(profile_key, proxy=None): """ - Returns a profile object given a key (as the stub following 'profile' in the - website URL). For example, give, a URL of the form + Returns a profile object given a key (as the stub following 'profile' in + the website URL). For example, give, a URL of the form `https://fingertips.phe.org.uk/profile/general-practice/data#page/3/gid/2000...`, the key is 'general-practice'. @@ -419,8 +419,6 @@ def get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False, if isinstance(indicator_ids, list): indicator_ids = ','.join(list(map(str, indicator_ids))) - else: - indicator_ids = str(indicator_ids) tmp_url = base_url + f"indicator_metadata/csv/by_indicator_id?" \ f"indicator_ids={indicator_ids}" From 16c87d6f48b2f008f595808d66d95d20daf36cca Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 25 Jan 2023 22:11:50 +0000 Subject: [PATCH 10/34] Added proxy variable to deprivation_decile. --- fingertips_py/area_data.py | 63 +++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 25 deletions(-) diff --git a/fingertips_py/area_data.py b/fingertips_py/area_data.py index 7c48e4b..f9a00ed 100644 --- a/fingertips_py/area_data.py +++ b/fingertips_py/area_data.py @@ -4,13 +4,13 @@ Functions to retrieve data that are specific to areas and relevant to all indicators. For example: Deprivation decile. """ - import pandas as pd import warnings from .retrieve_data import get_data_by_indicator_ids -def defined_qcut(df, value_series, number_of_bins, bins_for_extras, labels=False): +def defined_qcut(df, value_series, number_of_bins, bins_for_extras, + labels=False): """ Allows users to define how values are split into bins when clustering. @@ -21,15 +21,18 @@ def defined_qcut(df, value_series, number_of_bins, bins_for_extras, labels=False :param labels: Optional. Labels for bins if required :return: A dataframe with a new column 'bins' which contains the cluster numbers """ - if max(bins_for_extras) > number_of_bins or any(x < 0 for x in bins_for_extras): + if max(bins_for_extras) > number_of_bins or any( + x < 0 for x in bins_for_extras): raise ValueError('Attempted to allocate to a bin that doesnt exist') - base_number, number_of_values_to_allocate = divmod(df[value_series].count(), number_of_bins) + base_number, number_of_values_to_allocate = divmod( + df[value_series].count(), number_of_bins) bins_for_extras = bins_for_extras[:number_of_values_to_allocate] if number_of_values_to_allocate == 0: df['bins'] = pd.qcut(df[value_series], number_of_bins, labels=labels) return df elif number_of_values_to_allocate > len(bins_for_extras): - raise ValueError('There are more values to allocate than the list provided, please select more bins') + raise ValueError( + 'There are more values to allocate than the list provided, please select more bins') bins = {} for i in range(number_of_bins): number_of_values_in_bin = base_number @@ -43,7 +46,8 @@ def defined_qcut(df, value_series, number_of_bins, bins_for_extras, labels=False row_to_end_allocate = 0 for bin_number, number_in_bin in bins.items(): row_to_end_allocate += number_in_bin - bins.update({bin_number: [number_in_bin, row_to_start_allocate, row_to_end_allocate]}) + bins.update({bin_number: [number_in_bin, row_to_start_allocate, + row_to_end_allocate]}) row_to_start_allocate = row_to_end_allocate conditions = [df['rank'].iloc[v[1]: v[2]] for k, v in bins.items()] series_to_add = pd.Series() @@ -69,18 +73,24 @@ def defined_qcut(df, value_series, number_of_bins, bins_for_extras, labels=False } -def deprivation_decile(area_type_id, year='2015', area_code=None): +def deprivation_decile(area_type_id, year='2015', area_code=None, proxy=None): """ - Takes in an area type id and returns a pandas series of deprivation deciles for those areas (with the areas as an - index. If a specific area is requested, it returns just the deprivation decile value. + Takes in an area type id and returns a pandas series of deprivation deciles + for those areas (with the areas as an index. If a specific area is + requested, it returns just the deprivation decile value. :param area_type_id: Area type id as denoted by the Fingertips API :param year: Year of deprivation score - :param area_code: Optional. Area code for area type to return a single value for that area - :return: A pandas series of deprivation scores with area codes as the index. Or single value if area is specified. + :param area_code: Optional. Area code for area type to return a single + value for that area + :param proxy: proxy given to the get request used to access the API + :return: A pandas series of deprivation scores with area codes as the + index. Or single value if area is specified. """ - warnings.warn('Caution, the deprivation deciles are being calculated on the fly and might show some inconsistencies' - ' from the live Fingertips site.') + warnings.warn('Caution, the deprivation deciles are being calculated on ' + 'the fly and might show some inconsistencies from the live ' + 'Fingertips site.') + acceptable_deprivation_years_la = ['2010', '2015'] acceptable_deprivation_years_gp = ['2015'] acceptable_area_types = [3, 101, 102, 7, 153] @@ -88,34 +98,37 @@ def deprivation_decile(area_type_id, year='2015', area_code=None): if not isinstance(year, str): year = str(year) if year not in acceptable_deprivation_years_la and area_type_id is not 7: - raise ValueError \ - ('The acceptable years are 2010 and 2015 for local authorities and CCGs, please select one of these') + raise ValueError('The acceptable years are 2010 and 2015 for local ' + 'authorities and CCGs, please select one of these') elif year not in acceptable_deprivation_years_gp: raise ValueError('The acceptable years are 2015, please select this') if area_type_id not in acceptable_area_types: - raise ValueError('Currently, we support deprivation decile for District & UA, County & UA, MSOA and GP area ' - 'types') + raise ValueError('Currently, we support deprivation decile for' + ' District & UA, County & UA, MSOA and GP area types') if area_type_id == 3: indicator_id = 93275 - area_dep_dec = get_data_by_indicator_ids(indicator_id, area_type_id, parent_area_type_id=101, profile_id=143, - include_sortable_time_periods=True) + area_dep_dec = get_data_by_indicator_ids(indicator_id, area_type_id, + parent_area_type_id=101, + profile_id=143, + include_sortable_time_periods=True, + proxy=proxy) else: indicator_id = 91872 - area_dep_dec = get_data_by_indicator_ids(indicator_id, area_type_id) + area_dep_dec = get_data_by_indicator_ids(indicator_id, area_type_id, + proxy=proxy) if area_type_id == 102: order_of_extra_values = [0, 9, 1, 2, 3, 4, 5, 6, 7, 8] area_dep_dec = area_dep_dec[area_dep_dec['Area Code'] != 'E92000001'] if not order_of_extra_values: order_of_extra_values = extra_areas[area_dep_dec['Value'].count() % 10] - area_dep_dec = defined_qcut(area_dep_dec, 'Value', 10, order_of_extra_values) + area_dep_dec = defined_qcut(area_dep_dec, 'Value', 10, + order_of_extra_values) area_dep_dec.set_index('Area Code', inplace=True) if area_code: try: return area_dep_dec.loc[area_code, 'decile'] except KeyError: - raise KeyError('This area is not available at in this area type. Please try another area type') + raise KeyError('This area is not available at in this area type. ' + 'Please try another area type') return area_dep_dec['bins'] - - - From 3abb3eb27eac31765c96afcbae287287ea9f8e89 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Fri, 27 Jan 2023 21:32:57 +0000 Subject: [PATCH 11/34] Changed function used to process JSONs to pd dataframes. --- fingertips_py/api_calls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fingertips_py/api_calls.py b/fingertips_py/api_calls.py index e75a698..ab5fd81 100644 --- a/fingertips_py/api_calls.py +++ b/fingertips_py/api_calls.py @@ -56,7 +56,7 @@ def get_json_return_df(url, transpose=True, proxy=None): except requests.exceptions.SSLError: req = requests.get(url, verify=False, proxies=proxy) try: - df = pd.read_json(req.content, encoding='utf-8') + df = pd.DataFrame.from_dict(req.json()) except ValueError: df = pd.DataFrame.from_dict([req.json()]) if transpose: From 1f6823a28d78def42ca543711397871d6cf39f1b Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Fri, 27 Jan 2023 22:08:36 +0000 Subject: [PATCH 12/34] Updated test for get_all_areas as the area '1' has been removed. Changed it to look for the England area type. --- fingertips_py/unit_tests/tests.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index 92b6a93..68833d1 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -44,9 +44,18 @@ def test_get_all_data_for_profile(): def test_get_all_areas(): data = get_all_areas(is_test=True) + + # Check the function output is a tuple + assert isinstance(data, tuple) is True + + # Check the standard output for the function is a dict assert isinstance(data[0], dict) is True - assert isinstance(data[0][1], dict) is True - assert isinstance(data[0][1]['Name'], str) is True + + # See if the England area type is there + assert 15 in data[0] + assert data[0][15]["Name"] == "England" + + # Check the correct URL is being used assert data[1] == 'http://fingertips.phe.org.uk/api/area_types' From 202bfb2b62f9a4e4d8db4588aad3e86b91846c4f Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Fri, 27 Jan 2023 22:27:40 +0000 Subject: [PATCH 13/34] Updated test for 'get_all_data_for_indicators()' as the number of columns had changed since test was written. --- fingertips_py/unit_tests/tests.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index 68833d1..d4fd642 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -61,8 +61,17 @@ def test_get_all_areas(): def test_get_all_data_for_indicators(): data = get_all_data_for_indicators([92949, 247], area_type_id=102, is_test=True) + + # Check that what the functon returns a pd dataframe assert isinstance(data[0], pd.DataFrame) is True - assert data[0].shape[1] == 26 + + # Check one of the columns is named "Indicator ID" + assert "Indicator ID" in data[0].columns + + # Check that only 92949 and 247 are in the "Indicator ID" column + assert all(data[0]["Indicator ID"].isin([92949, 247])) + + # Check the correct URL is being used assert data[1] == 'http://fingertips.phe.org.uk/api/all_data/csv/by_indicator_id?indicator_ids=92949,247&child_area_type_id=102&parent_area_type_id=15' From 80084f07383043c83477839a15556113326dc99e Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Fri, 27 Jan 2023 22:33:26 +0000 Subject: [PATCH 14/34] Updated test for 'get_data_by_indicator_ids()' as the number of columns had changed since test was written. --- fingertips_py/unit_tests/tests.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index d4fd642..98d7eee 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -77,8 +77,17 @@ def test_get_all_data_for_indicators(): def test_get_data_by_indicator_ids(): data = get_data_by_indicator_ids([92949, 247], 102, is_test=True) + + # Check that what the functon returns a pd dataframe assert isinstance(data[0], pd.DataFrame) is True - assert data[0].shape[1] == 26 + + # Check one of the columns is named "Indicator ID" + assert "Indicator ID" in data[0].columns + + # Check that only 92949 and 247 are in the "Indicator ID" column + assert all(data[0]["Indicator ID"].isin([92949, 247])) + + # Check the correct URL is being used assert data[1] == 'http://fingertips.phe.org.uk/api/all_data/csv/by_indicator_id?indicator_ids=92949,247&child_area_type_id=102&parent_area_type_id=15' From fed8f7aada32ccfa3eea5069ea9a131bdb0314ec Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Sat, 28 Jan 2023 22:31:26 +0000 Subject: [PATCH 15/34] Refactored 'get_metadata_for_all_indicators()' so all the columns are expanded out and the function uses bool inputs rather than strings. --- fingertips_py/metadata.py | 59 +++++++++++++++++++++++++++++++++------ 1 file changed, 51 insertions(+), 8 deletions(-) diff --git a/fingertips_py/metadata.py b/fingertips_py/metadata.py index 4e393ea..67d0d29 100644 --- a/fingertips_py/metadata.py +++ b/fingertips_py/metadata.py @@ -210,14 +210,14 @@ def get_metadata_for_all_indicators_from_csv(is_test=False, proxy=None): except URLError: metadata = deal_with_url_error( base_url + 'indicator_metadata/csv/all', proxy) - + if is_test: return metadata, base_url + 'indicator_metadata/csv/all' return metadata -def get_metadata_for_all_indicators(include_definition='no', - include_system_content='no', +def get_metadata_for_all_indicators(include_definition=False, + include_system_content=False, is_test=False, proxy=None): """ Returns the metadata for all indicators in a dataframe. @@ -229,12 +229,55 @@ def get_metadata_for_all_indicators(include_definition='no', :param proxy: proxy given to the get request used to access the API :return: dataframe of all indicators """ - url = 'indicator_metadata/all?include_definition={}&include_system_content={}' - url_suffix = url.format(include_definition, include_system_content) - metadata_df = get_json_return_df(base_url + url_suffix, proxy) + url_suffix = "indicator_metadata/all?include_definition=" + + if include_definition: + url_suffix += "yes" + else: + url_suffix += "no" + + if include_system_content: + url_suffix += "&include_system_content=yes" + else: + url_suffix += "&include_system_content=no" + + df = get_json_return_df(base_url + url_suffix, proxy) + + # Transpose to get the Indicator ID as a column + df = df.transpose() + df.reset_index(inplace=True) + df.rename(columns={'index': 'Indicator ID'}, inplace=True) + + # Detect columns that contain any dictionaries + dict_cols = [] + + for col_name in df.columns: + if any(df[col_name].apply(lambda x: isinstance(x, dict))): + dict_cols.append(col_name) + + # Expand the dictionary columns of the metadata df + expanded_dfs = [] + + for col_name in dict_cols: + + # Extract the Dict column + tmp_df = pd.json_normalize(df[col_name]) + + # Change the new column names to be unique + tmp_df = tmp_df.add_prefix(col_name + "_") + + expanded_dfs.append(tmp_df) + + # Remove the dictionary columns + df.drop(dict_cols, axis=1, inplace=True) + + # Combine all the columns together + df0 = pd.concat(expanded_dfs, axis=1) + df = pd.concat([df, df0], axis=1) + if is_test: - return metadata_df, base_url + url_suffix - return metadata_df + return df, base_url + url_suffix + return df def get_multiplier_and_calculation_for_indicator(indicator_number, proxy=None): From e1fa5cd1a32125a811f9ef87e552ae1ac43c4bca Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Sun, 29 Jan 2023 03:05:57 +0000 Subject: [PATCH 16/34] Updated 'get_all_areas_for_all_indicators()' to merge correctly. --- fingertips_py/retrieve_data.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/fingertips_py/retrieve_data.py b/fingertips_py/retrieve_data.py index 5fd4634..b0e3517 100644 --- a/fingertips_py/retrieve_data.py +++ b/fingertips_py/retrieve_data.py @@ -6,6 +6,7 @@ """ import pandas as pd +import numpy as np from urllib.error import URLError, HTTPError from .api_calls import base_url, get_json_return_df, deal_with_url_error from .metadata import get_area_type_ids_for_profile, get_csv, \ @@ -164,20 +165,27 @@ def get_all_areas_for_all_indicators(proxy=None): """ url_suffix = 'available_data' - df = get_json_return_df(base_url + url_suffix, transpose=False, - proxy=proxy) + df_avail = get_json_return_df(base_url + url_suffix, transpose=False, + proxy=proxy) - indicator_metadata = get_metadata_for_all_indicators(proxy=proxy) + df_meta = get_metadata_for_all_indicators(proxy=proxy) - df = pd.merge(df, indicator_metadata[['Descriptive']], - left_on='IndicatorId', right_index=True) + # Get the descriptive columns + df_meta = df_meta.loc[:, + df_meta.columns.str.contains('Descriptive_|Indicator ID')] + df_meta['Indicator ID'] = df_meta['Indicator ID'].astype(np.int64) - df['IndicatorName'] = df.apply(lambda x: x['Descriptive']['Name'], axis=1) + df = pd.merge(df_avail, df_meta, + left_on='IndicatorId', + right_on='Indicator ID') areas = get_all_areas(proxy=proxy) df['GeographicalArea'] = df.apply(lambda x: areas[x['AreaTypeId']]['Name'], axis=1) + + df.rename(columns={'Descriptive_Name': 'IndicatorName'}, + inplace=True) df = df[['IndicatorId', 'IndicatorName', 'GeographicalArea', 'AreaTypeId']] return df From 44ab2a974440832ef4a005f1d12febacf2d1aae4 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Sun, 29 Jan 2023 17:50:01 +0000 Subject: [PATCH 17/34] Updated tests for 'get_data_for_indicator_at_all_available_geographies()'. --- fingertips_py/unit_tests/tests.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index 98d7eee..cca0432 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -98,9 +98,17 @@ def test_get_all_areas_for_all_indicators(): def test_get_data_for_indicator_at_all_available_geographies(): + data = get_data_for_indicator_at_all_available_geographies(247) + + # Check that a pandas dataframe is returned by the function assert isinstance(data, pd.DataFrame) is True - assert data.shape[1] == 26 + + # Check one of the columns is named "Indicator ID" + assert "Indicator ID" in data[0].columns + + # Check that only `247` is in the "Indicator ID" column + assert all(data[0]["Indicator ID"].isin([247])) def test_get_metadata_for_profile_as_dataframe(): From 76cac54e6446eeb8bacafe2af39c3c3b95edc357 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Sun, 29 Jan 2023 18:00:04 +0000 Subject: [PATCH 18/34] Updated tests to match changes in API. --- fingertips_py/unit_tests/tests.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index cca0432..df2066c 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -105,10 +105,10 @@ def test_get_data_for_indicator_at_all_available_geographies(): assert isinstance(data, pd.DataFrame) is True # Check one of the columns is named "Indicator ID" - assert "Indicator ID" in data[0].columns + assert "Indicator ID" in data.columns # Check that only `247` is in the "Indicator ID" column - assert all(data[0]["Indicator ID"].isin([247])) + assert all(data["Indicator ID"].isin([247])) def test_get_metadata_for_profile_as_dataframe(): @@ -264,8 +264,12 @@ def test_get_value_note_id(): def test_get_metadata_for_all_indicators(): data = get_metadata_for_all_indicators() + + # Check that a pandas dataframe is returned by the function assert isinstance(data, pd.DataFrame) is True - assert data.shape[1] == 11 + + # Check one of the columns is named "Indicator ID" + assert "Indicator ID" in data.columns def test_get_metadata_for_all_indicators_from_csv(): From 7d7ab2e33efdb3dec2e3cc3af57c4088e09e105b Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Sun, 29 Jan 2023 18:28:25 +0000 Subject: [PATCH 19/34] Updated test for 'get_all_data_for_profile()' to match changes in API. --- fingertips_py/unit_tests/tests.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index df2066c..25c0f25 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -36,10 +36,16 @@ def test_get_json_return_df(): # need to think about this one def test_get_all_data_for_profile(): + data = get_all_data_for_profile(84, is_test=True) + + # Check output of the function is a pandas df assert isinstance(data[0], pd.DataFrame) is True - assert data[1] == base_url + 'all_data/csv/by_profile_id?child_area_type_id=154&parent_area_type_id=15&profile_id=84' - assert data[0].shape[1] == 26 + + # Check the df has some of the required columns + assert "Indicator ID" in data[0].columns + assert "Indicator Name" in data[0].columns + assert "Value" in data[0].columns def test_get_all_areas(): From cad84fbe567e5e9ce35eee1a78f4ff7358c3b3cb Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Sun, 29 Jan 2023 18:56:26 +0000 Subject: [PATCH 20/34] Corrected mistake in 'get_metadata()'. --- fingertips_py/metadata.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fingertips_py/metadata.py b/fingertips_py/metadata.py index 67d0d29..f1444f9 100644 --- a/fingertips_py/metadata.py +++ b/fingertips_py/metadata.py @@ -571,15 +571,15 @@ def get_metadata(indicator_ids=None, domain_ids=None, profile_ids=None, list_of_df = [] if indicator_ids: - list_of_df.append(get_metadata_for_profile_as_dataframe( - profile_ids, proxy)) + list_of_df.append(get_metadata_for_indicator_as_dataframe( + indicator_ids, proxy)) if domain_ids: list_of_df.append(get_metadata_for_domain_as_dataframe( domain_ids, proxy)) if profile_ids: - list_of_df.append(get_metadata_for_indicator_as_dataframe( - indicator_ids, proxy)) + list_of_df.append(get_metadata_for_profile_as_dataframe( + profile_ids, proxy)) return pd.concat(list_of_df) From 94ef5a64909c9702914c821f9958e66d7b11543f Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Mon, 30 Jan 2023 23:20:37 +0000 Subject: [PATCH 21/34] Rewrote 'deprivation_decile()' to fix errors. --- fingertips_py/area_data.py | 120 +++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 44 deletions(-) diff --git a/fingertips_py/area_data.py b/fingertips_py/area_data.py index f9a00ed..0bbb7b0 100644 --- a/fingertips_py/area_data.py +++ b/fingertips_py/area_data.py @@ -6,7 +6,10 @@ import pandas as pd import warnings -from .retrieve_data import get_data_by_indicator_ids +from .retrieve_data import get_data_by_indicator_ids, \ + get_all_areas_for_all_indicators +from .api_calls import get_json +from .metadata import get_metadata def defined_qcut(df, value_series, number_of_bins, bins_for_extras, @@ -73,7 +76,7 @@ def defined_qcut(df, value_series, number_of_bins, bins_for_extras, } -def deprivation_decile(area_type_id, year='2015', area_code=None, proxy=None): +def deprivation_decile(area_type_id, year=None, area_code=None, proxy=None): """ Takes in an area type id and returns a pandas series of deprivation deciles for those areas (with the areas as an index. If a specific area is @@ -87,48 +90,77 @@ def deprivation_decile(area_type_id, year='2015', area_code=None, proxy=None): :return: A pandas series of deprivation scores with area codes as the index. Or single value if area is specified. """ - warnings.warn('Caution, the deprivation deciles are being calculated on ' - 'the fly and might show some inconsistencies from the live ' - 'Fingertips site.') - - acceptable_deprivation_years_la = ['2010', '2015'] - acceptable_deprivation_years_gp = ['2015'] - acceptable_area_types = [3, 101, 102, 7, 153] - order_of_extra_values = [] - if not isinstance(year, str): - year = str(year) - if year not in acceptable_deprivation_years_la and area_type_id is not 7: - raise ValueError('The acceptable years are 2010 and 2015 for local ' - 'authorities and CCGs, please select one of these') - elif year not in acceptable_deprivation_years_gp: - raise ValueError('The acceptable years are 2015, please select this') - if area_type_id not in acceptable_area_types: - raise ValueError('Currently, we support deprivation decile for' - ' District & UA, County & UA, MSOA and GP area types') - if area_type_id == 3: - indicator_id = 93275 - area_dep_dec = get_data_by_indicator_ids(indicator_id, area_type_id, - parent_area_type_id=101, - profile_id=143, - include_sortable_time_periods=True, - proxy=proxy) + + # find all the indicator IDs that are deprivation indexes + search_url = "https://fingertips.phe.org.uk/api/indicator_search" \ + "?search_text=index%20AND%20deprivation%20" \ + "AND%20score%20AND%20IMD" + + ind_area_dict = get_json(search_url, proxy=proxy) + valid_ind = list(set([y for x in ind_area_dict.values() for y in x])) + + # Find the valid area types for the indicator IDs + df = get_all_areas_for_all_indicators(proxy=proxy) + df = df.loc[df["IndicatorId"].isin(valid_ind)] + + # Add in the year column + meta_df = get_metadata(indicator_ids=valid_ind, proxy=proxy) + meta_df["year"] = meta_df["Definition"].str.extract(r"(20[0-9]{2})") + meta_df = meta_df[["year", "Indicator ID"]] + + df = pd.merge(df, meta_df, + how='left', + left_on="IndicatorId", + right_on="Indicator ID").sort_values("year", ascending=False) + + # Check the users choices + if int(area_type_id) not in df["AreaTypeId"].values: + raise ValueError(f"Invalid Area Type: {area_type_id} is not a " + f"supported area type. The supported types are" + f": {', '.join(set(df['AreaTypeId'].values))}.") + + elif year is not None and str(year) not in df["year"].values: + raise ValueError(f"Invalid Year: {year} is not a " + f"supported year. The supported years are" + f": {', '.join(set(df['year'].values))}.") + + # Filter down to the right indicator ID + if year is not None: + df0 = df[(df["year"] == str(year)) + & (df["AreaTypeId"] == int(area_type_id))] else: - indicator_id = 91872 - area_dep_dec = get_data_by_indicator_ids(indicator_id, area_type_id, - proxy=proxy) - if area_type_id == 102: - order_of_extra_values = [0, 9, 1, 2, 3, 4, 5, 6, 7, 8] + df0 = df[df["AreaTypeId"] == int(area_type_id)] + + # Check the year, area type is a valid a combination + if df0.empty: + err_str = f"Invalid Combination: {year} and {area_type_id} are not " \ + f"a valid combination. The following are: \n\n" + err_str += df.to_string(columns=['GeographicalArea', + 'AreaTypeId', + 'year'], index=False) + raise ValueError(err_str) + + # Extract the indicator data from the API + area_dep_dec = get_data_by_indicator_ids(df0["Indicator ID"].values[0], + area_type_id, proxy=proxy) + + # Remove England from the data area_dep_dec = area_dep_dec[area_dep_dec['Area Code'] != 'E92000001'] - if not order_of_extra_values: - order_of_extra_values = extra_areas[area_dep_dec['Value'].count() % 10] - area_dep_dec = defined_qcut(area_dep_dec, 'Value', 10, - order_of_extra_values) - area_dep_dec.set_index('Area Code', inplace=True) - if area_code: - try: - return area_dep_dec.loc[area_code, 'decile'] - except KeyError: - raise KeyError('This area is not available at in this area type. ' - 'Please try another area type') - return area_dep_dec['bins'] + + # Create the decile column + area_dep_dec["decile"] = pd.qcut(area_dep_dec["Value"], q=10, + labels=[str(x) for x in range(1, 11)]) + + if area_code is None: + return area_dep_dec + + elif area_code in area_dep_dec["Area Code"].values: + return area_dep_dec[area_dep_dec["Area Code"] == area_code, \ + 'decile'].values[0] + + else: + raise LookupError(f"Area Code {area_code} not in the data. Possible " + f"areas are: " + f"{', '.join(area_dep_dec['Area Code'].values)}.") + From c0378b43d69db36c3fd39855d86668f70fab4b9b Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Mon, 30 Jan 2023 23:22:12 +0000 Subject: [PATCH 22/34] Removed uneeded dict 'extra_areas'. --- fingertips_py/area_data.py | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/fingertips_py/area_data.py b/fingertips_py/area_data.py index 0bbb7b0..c822fcb 100644 --- a/fingertips_py/area_data.py +++ b/fingertips_py/area_data.py @@ -62,20 +62,6 @@ def defined_qcut(df, value_series, number_of_bins, bins_for_extras, df = df.reset_index() return df - -extra_areas = { - 1: [0], - 2: [0, 5], - 3: [0, 3, 7], - 4: [0, 2, 6, 8], - 5: [0, 2, 4, 6, 8], - 6: [0, 1, 3, 5, 6, 8], - 7: [0, 1, 2, 4, 5, 7, 8], - 8: [0, 1, 2, 3, 5, 6, 7, 8], - 9: [0, 1, 2, 3, 4, 5, 6, 7, 8] -} - - def deprivation_decile(area_type_id, year=None, area_code=None, proxy=None): """ Takes in an area type id and returns a pandas series of deprivation deciles From 0d3f3e66b66d0dab99edd477bf9e0bbde750ea13 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Mon, 30 Jan 2023 23:24:39 +0000 Subject: [PATCH 23/34] Removed obsolete function 'defined_qcut()'. --- fingertips_py/area_data.py | 50 -------------------------------------- 1 file changed, 50 deletions(-) diff --git a/fingertips_py/area_data.py b/fingertips_py/area_data.py index c822fcb..8441a31 100644 --- a/fingertips_py/area_data.py +++ b/fingertips_py/area_data.py @@ -12,56 +12,6 @@ from .metadata import get_metadata -def defined_qcut(df, value_series, number_of_bins, bins_for_extras, - labels=False): - """ - Allows users to define how values are split into bins when clustering. - - :param df: Dataframe of values - :param value_series: Name of value column to rank upon - :param number_of_bins: Integer of number of bins to create - :param bins_for_extras: Ordered list of bin numbers to assign uneven splits - :param labels: Optional. Labels for bins if required - :return: A dataframe with a new column 'bins' which contains the cluster numbers - """ - if max(bins_for_extras) > number_of_bins or any( - x < 0 for x in bins_for_extras): - raise ValueError('Attempted to allocate to a bin that doesnt exist') - base_number, number_of_values_to_allocate = divmod( - df[value_series].count(), number_of_bins) - bins_for_extras = bins_for_extras[:number_of_values_to_allocate] - if number_of_values_to_allocate == 0: - df['bins'] = pd.qcut(df[value_series], number_of_bins, labels=labels) - return df - elif number_of_values_to_allocate > len(bins_for_extras): - raise ValueError( - 'There are more values to allocate than the list provided, please select more bins') - bins = {} - for i in range(number_of_bins): - number_of_values_in_bin = base_number - if i in bins_for_extras: - number_of_values_in_bin += 1 - bins[i] = number_of_values_in_bin - df['rank'] = df[value_series].rank() - df = df.sort_values(by=['rank']) - df['bins'] = 0 - row_to_start_allocate = 0 - row_to_end_allocate = 0 - for bin_number, number_in_bin in bins.items(): - row_to_end_allocate += number_in_bin - bins.update({bin_number: [number_in_bin, row_to_start_allocate, - row_to_end_allocate]}) - row_to_start_allocate = row_to_end_allocate - conditions = [df['rank'].iloc[v[1]: v[2]] for k, v in bins.items()] - series_to_add = pd.Series() - for idx, series in enumerate(conditions): - series[series > -1] = idx - series_to_add = series_to_add.append(series) - df['bins'] = series_to_add - df['bins'] = df['bins'] + 1 - df = df.reset_index() - return df - def deprivation_decile(area_type_id, year=None, area_code=None, proxy=None): """ Takes in an area type id and returns a pandas series of deprivation deciles From 7f5f5053206bcb02447d1273f11bf5b8ce96624b Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Mon, 30 Jan 2023 23:27:16 +0000 Subject: [PATCH 24/34] Removed uneeded import and cleaned description. --- fingertips_py/area_data.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fingertips_py/area_data.py b/fingertips_py/area_data.py index 8441a31..ddd76a3 100644 --- a/fingertips_py/area_data.py +++ b/fingertips_py/area_data.py @@ -1,11 +1,11 @@ """ area_data.py ================================== -Functions to retrieve data that are specific to areas and relevant to all indicators. For example: Deprivation decile. +Functions to retrieve data that are specific to areas and relevant to all +indicators. For example: Deprivation decile. """ import pandas as pd -import warnings from .retrieve_data import get_data_by_indicator_ids, \ get_all_areas_for_all_indicators from .api_calls import get_json From 468b6ac8e88d7e5c2fd70311c398d555654f88b2 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 31 Jan 2023 19:16:37 +0000 Subject: [PATCH 25/34] Updated unit test for 'deprivation_decile()'. --- fingertips_py/unit_tests/tests.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fingertips_py/unit_tests/tests.py b/fingertips_py/unit_tests/tests.py index 25c0f25..8d57c26 100644 --- a/fingertips_py/unit_tests/tests.py +++ b/fingertips_py/unit_tests/tests.py @@ -286,4 +286,11 @@ def test_get_metadata_for_all_indicators_from_csv(): def test_deprivation_decile(): data = deprivation_decile(7) - assert len(data.unique()) == 10 + + # Check one of the columns is named "Indicator ID" and one is called + # "Area Type". + assert "Indicator ID" in data.columns + assert "Area Type" in data.columns + + # Check that the only value in the "Indicator ID" column is "GPs" + assert all(data["Area Type"].isin(["GPs"])) From 8d0d46b04eb13ab2627ae9c306f7b0028f25c479 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 31 Jan 2023 22:05:55 +0000 Subject: [PATCH 26/34] Changed doc strings to render correctly in Sphinx. --- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 1910 bytes .../__pycache__/api_calls.cpython-311.pyc | Bin 0 -> 6341 bytes .../__pycache__/area_data.cpython-311.pyc | Bin 0 -> 5343 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 0 -> 24247 bytes .../__pycache__/retrieve_data.cpython-311.pyc | Bin 0 -> 9669 bytes fingertips_py/api_calls.py | 2 +- fingertips_py/area_data.py | 3 +- fingertips_py/metadata.py | 117 ++++++------------ fingertips_py/retrieve_data.py | 45 +++---- .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 182 bytes .../tests.cpython-311-pytest-7.2.1.pyc | Bin 0 -> 87657 bytes 11 files changed, 56 insertions(+), 111 deletions(-) create mode 100644 fingertips_py/__pycache__/__init__.cpython-311.pyc create mode 100644 fingertips_py/__pycache__/api_calls.cpython-311.pyc create mode 100644 fingertips_py/__pycache__/area_data.cpython-311.pyc create mode 100644 fingertips_py/__pycache__/metadata.cpython-311.pyc create mode 100644 fingertips_py/__pycache__/retrieve_data.cpython-311.pyc create mode 100644 fingertips_py/unit_tests/__pycache__/__init__.cpython-311.pyc create mode 100644 fingertips_py/unit_tests/__pycache__/tests.cpython-311-pytest-7.2.1.pyc diff --git a/fingertips_py/__pycache__/__init__.cpython-311.pyc b/fingertips_py/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96af0a989c1de834576c5c09fb027f4cad250ef9 GIT binary patch literal 1910 zcmeH{NsALf6vw-h%p?<&*|*HTk8!)`NklxTqaX?j9v&k_O}Y|G`=#6JPH=913-4aU zFW~1G1VQQ~c=9&j&6DqSr(?!JJm}G;`BBTOf4!xu-d3w+hrSCRJ~pZa$N9pY?925U z-`-Q>wbODu=Zy=F=XyEc#T?`?4|yy=!R4{MKZL_Dj72D72}(EuBUpxVGFR}=U9-kzywahBu>E;PQx_Lzzoj9EY86k&ci&`poR;ufQzt*OR$8?u#79P zf~&BKYp{mvu#OwBft#?2TdogD*7J5mhFUbF??<+TDwdv%rL7tj z8?CxZaQCZAA(CmSrDE|c3fgvpTRbInTg08vSGI!kxe`Xb=%^^J57~J(A=%Wd85j|o zpsC4n@zjiNd%7Xxz(lszS3Wo-@!q)5US!v@bo84GQEGY#dJ`7cwhb*DmQg<$s z?iDlhCJpgKLHfD17kCkN{8)#+R&)f~9v|OE$Ct4V+9xZKhC{pc!%3Xu0dg)m#Xs}S zL#v5;?;0dpzZ|i%e=tZlYDC?i!6wJG?%GLDg+_N%H$By$yKuk0Yl|YOyDKR?lD;&I+}-B0B!N6G)H_}RH} l^!xuf=epn?JO7l0A@>Ps{^wt0pyIgaj-2}G-<+pP{{UCWO6&jt literal 0 HcmV?d00001 diff --git a/fingertips_py/__pycache__/api_calls.cpython-311.pyc b/fingertips_py/__pycache__/api_calls.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e41a38f76ee5ae20a33fd0f7d4ef1fbf9c63d03 GIT binary patch literal 6341 zcmds5+iw)t89#H``_0DYW|MeaZdp>+7z9DKAvKsg0TeqCwVbTRJG1sU>)p+nS+L#R zXchHgi5$gLu5i^f+C&IKNh|(=KG63{UbHIiNR}d1sLGow8VT{#?>oCYJ8KM~EfG@B z?tJH*nR7qi@4MX$1iS>&nJa&bbq5LgJ639muNEFoK;aru$S_ejg->w99LxD(p5?-@ z2)U4OOge|1T&0a`*roUt@t54NTL~x*$URC>aY62dx*KvI1pqwA57kUX^f^aX(<(#;+bU3&{9cVGE&lq8I?{;#<(gS*OFr@ zHMF!Y!QhgdR3xezR8udhk|GE7H=y-xt4B`wIZ29_$rR+5Im1(*V8T%=XN3t|IZH)Xtz^#?@dm8^wzY%C zT29nR&XE-d$a`CI&aAWOw)d@-v)rm)uBkgOj1Ty6?`wpVyX_q!RP)9rz+!AM(u%hDO$`xUct}x zWgu_Kx}J(@vH_zYcd?GQIMapGYN~$x7H>K)sZ@(kQ@n=9j*JoCeK71X-POJ7rU2_P zz3Nmi3{4T2 zWjfeyO##L>1K2l8RXq(DQB4t-XNsDkPMTs;o>X0g1(Sf&5 zy?borgl3$~jE-D5IWQQFTbPQbr$-uVb_AP#yhoUm-6Gur6M(QG`tO0{$x2Xg99j-; zm`yC~``WP>jFf_raxhX53c{mhUrX8dYT37Qg>a5Tby96!%-m5IgMFo7Upd%^9SXvV z01Y2Kdi0=m)BNcL{qtYk@94hQ(S2uUsiUXd(Nk*eEw}dO-&*no@&ijvudEQ>(Z)zY zTne>(HucHWf_UYl*^i*Qese)A3|;XSyi2}N{>;M=EcfFLo5^op?{^7zogC1Zg;)4y zNrDxqJW~>IPe=m(g-8PK2}!^|ha}+tM@b-L1%~5mc9=acj$a%c`z4Sd2;0+x=g� z(FrwHkr)((-f@aTj-o6KyD4ft>O3<@N)mrZ>t> zZ{$xc`C1pnR{9F8U}$Y^^+%BF&*agUq^&@I+B8XBUllEF1$(kmR#;ni-GCOityZga zkeECIS{E<5nn1(u2Mzne=N((E{X{z&vm9;Bibb1tuC0fV#`WjKtOy7bXa4%%Ak3h0 z5`?|3_DEJyXId!^3RjKT$9!>U900Y##s{^UR4LPhahjT}ptGiaDwEp)8uqS*O_NV6 zrU!>Sj!QN@I8qd~FGH>AeOFFo)QWEOSepzxD(Kw-=W2s6uf%nf2#DP(c-Pgy3pxrd zhNu#!uR)V8c=R%mA4^NEh=OD9av(H2azC*3USMnS=*^Q~o&56j_0y$5S2@sC;0rt` z!S$&5_ST8L$KcJ2UtRoi`1)}1Y$?!P4s>Im0*`udFX+KH$0NP7IAX*h6UNLCnl0+$AAiE7G< zigR4kangqUql97mk3gZi|8+So%PFMJ zBv9k(wKxyEYk_O$zr%B3W75~56y_<8VseIkb94{9d(K_qCFt9Lz^+2OD*s~hT=QJ_ zeCynY3(fP!oZtFDyP@IQf_N<>$@FTvmedV783W%#H)u`nT2>S7fB{Vb&V04tZGPfT z=s{?E6dwIgKwg&l#BRQ*!6lcxd&=HD`J>CO=DDqN^85}stnlv!ORmnct8;}2j+P~M zpv4%RUn#V!3^n(zZ$s+}US@u+Ek7gwvHYw@26BAz;;N{D<@ryDaA+)nP1EtrsKFDy zf_(zQ(31+ZKz||3hk2xy_fl#QX32R(qW9=P*=tv{b8*9wJ z_~K>D!ZdjHGMG;Bn$I88FG+DNp|XY9#No`F5SXBZb zjN2npad>BpYkDpG5DEM1W{@cw>XcD;R7@x6frK_{I@n;Q=j71Pg{tjytQIYxKY^pg zV1lefVU-j)BrL4*W^{aO89^?@BDVb*ynP2A{SQD8fo{in?nwu|9Nfoz^apky{RoHF zMvboJrk8{L6;J(vuX(nw>;n+-Fut8G2RAPH-}HCmoA`sX zy}zC+3RiRUxsq>t*|&XB+^#bhz5P}4#h(6s!ri8=KpOyvQW-b>@H&udPY|IS+z8;`cghr*F6YL?ktkB5HInhAJvzqF_%B~8xL2wPjW8%!>)7T!PT@|ei zF-_^6x6ew93#3sQz2H<*f_PDd;dJ{DFV4pAuX_;^v+XeshU;MbT?uai;~N-Ai-Vr6 z`Wkju+*RjudH~L(;(Oy2F%G70LMiNA#kVG>(@of9ClDPi4PatO6;HfHQRPGwmkWlvQD`)dtxp5Vlkfe+*E0LlIlZ|5&h|y`!IJl2*?SPAyxUheI(ueeW69lFc6a9c zApkYkf2DV}H$SlK@y)i+4V64?WlvlF2(zJ?s+{Q@H;i;oS64j(7D;-8Y$1G70rCJqg{=pwRyU1pESyTj51cTp>vOglo!&@V7*K zdG=c(EsM4P64|)e_+KJ{Jo~LUn>g?-8p#eH2hK_(+0x7fS4bmyEyT5~kVdktiQ9qW U*~tzs_H86>#NU;7T>tLs3ZMcSrAiz-RE zu|^GAk&g_>hr4d5*R`lNteLyGfIl-}1M=BV$skaVSb+e=KJup^DF){VvGBraB4#6oqmYp-s zW!H?0La=tp?qz0%A#=CvS!QQgn0o}~7B%A)=xG#U(;Hr175SLJ>wGx5>OK9!%X>MM zi0hJ)&^TS;R8dzYaYf`X0#0A#bq?@xT2hQl^HLmxVEh`#Cjmpo~k$CrX#@D$fwu;}$Ypxth1tcXwfWud&#{M12b7=u}=aA7clv#kQ21F61y8SZ)tRrm~}H&x*cH&Ao!lHOx@1b6ks zlBW!xtKqV|2RdQuX~AjFD7?l`fnA`hm@*!{wR&y|TZUW)1F&AfDX^OjcR|j36|`R6PVx^86_70|o^YT7M+>&&63!xqkJ%+>d|- z>v;SjX>O1>tJmHS+0KSfLqt?{kYN)C2+bM`yckFAd4pYoylh|UPlX`S+)Kpz`#y1H zyoT3cay2$7!y>eRgtos>;DP(=Jutlop^UfIn+$Kg{@$bXo+=)L71%0ARi6~vtGkAs z4ZvUTReUznV8EZyQH2sZZ;-duolHYrr0p$Jg>zk1DB*y>-9mb({1#%lTR2!R)$TmD z`SRU5ZUEyU676)BHX5dp0b?z1Rk>D>dSEx_25nncI5c0AC#q*^buo?fBQ>1%7&Q1} z@Avuo_i<5gk>`7K=rErEC-ri0y}{oQHBL%E?IT5y(^r!sCkdrmsHaq@p*)v_(g+1o z6QPi5oH7p;Z+G?62tKG}P+=8KES1#0cO`uhcFJo~Wr3a`-VAfmc|ct$!?+Z3l8r_c z-${v@E(-meq~iik_*hD5P?rJMcd2tLyqtmxOqdu+@+!YfIEZ0+pyZBl=P~+TaZ@71nyF>LZCeWEfJk@ zDGj8;Jxx3=YR~||>xx9SCP5iLY*8YZ#u3{QhB5o#2Lv18sARz@wVrheENYvvY*$eT zlLKjWQP-2&$iTpSMbqKrq8L`xg>dS|0H2fwD(z2918v6_&)SceF5c8n6N){@2hU%P zz*yq}l|90BWfi>=fyT*2lohXZCJ*D_?AX-Q*yN>HjQmoWaj><}$m$ftDD%{J!fQHj-7UkQ< z>^nz2c-@{opw_!9+c0?ofXHfymYdk90DbA6s-B@2RdLs2c_Sk5DPf;YH})MLe0%Wd z@bzCE&x9-|_WyKa1qBz4SWa1-*Fi6iMde+K!HbxZuso`?u!v`uLGdiF#YG^SSg^e3 z!6n{+IE)JEz0m|jD&!Zu$KlNpF8wNmJqOW<10j`6Dk_dk;zu}8!rU9+!qpde4}4L@ zC+U9f85O>o_Lb4%Fope}JP#ulWH&OrS4P%aMsiVEo|6)!wFg`-k_!PPkSuX&ivV^j zgV|{36I!x`=o{_d)CXWUE@ckYKt$(@@sRNY6wu7>M<`cBJq$+;=Z zq3LRfR>LXAfnW`g5X+##yCiTJUu`AdAb3kGn_{t5fOPkk}H)%^Lj&1;n{6}KHK z4x~pUyl9Jh$8yX3oG5FS+xGl4@fo56F5OGC4mFCTe*6*0y{2fIGzS?IY=TP)c7{+; zbpujxPKYUxO4KbksS28kb!0gpm@KCRsa9n$2Z!(`1F1#jC$bDyrpNQly0C5|@+us>SL`4AciES8-agobSX_y5&-NC?;0Jq@vtN zCCRZ+qt%FcE!QLB01za23n$l76qXWRN|i~JlF!2!e1Pf}3;aj|{*1I}Vcuf!$6yR5 z4q<)}q)=7NM~Mbx5}ZLaY*I*8m5Z3vYWZ%WQ6m6}?X7(ScFCe*7u|9sJMpatwRW!0 zY^3sm6NSJDGjJk%N?63`Yf@}2JY17~RmA`k}-Y-zv&XX+;6PLRM%(?K zyzgAWch2;k%Z}{?JJ)41c*G12d=)&o9XxrzsSq4DgX7t;+n0Ycwc~4DTUq~gJ{UHA z1KF|v0)c&N2iF#Mf*m{i5AU>xij2d1InJ3$pa$m`3qZJ)$*hyEyiEN!S; zy_;!s;9R~7-zCBqsf|Mz&qadmB2`OxWpl#pKV9fMWA>dXbe%Q3&SJV{Nc$9~8zFQf z7y}EV7kL`<%u72yKWOXP?_c@Mk&FD9{VTiO650s_*92gZ#@mSR*Q&n9W2t+-V20% z{463oZq3@y+VM66I9dPN@efCTHwrw4j#Y<;ubwWtP=Et50%t*cfwM4U&)#ORzqGBt zRPc41zV5uI8`goN8`E1|=FxNJ(XlTn^XSCR(cuTJMF$larye6bf)FrfCqeZAF4ws6 zw#g0Oe|wu7H}^)flYpX&`}h~R*{#E7&&d6`9g@xd_2z?P59arR(a+bT~>sYES^y(V2PVC z?E@G_nEpSe CaXl~q literal 0 HcmV?d00001 diff --git a/fingertips_py/__pycache__/metadata.cpython-311.pyc b/fingertips_py/__pycache__/metadata.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a03fbb4abffe9e6cbf11ec551d761fc546c6b7c GIT binary patch literal 24247 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 literal 0 HcmV?d00001 diff --git a/fingertips_py/__pycache__/retrieve_data.cpython-311.pyc b/fingertips_py/__pycache__/retrieve_data.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71d66bde7afa2939d9c0f04c8fe27733720c5b04 GIT binary patch literal 9669 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 literal 0 HcmV?d00001 diff --git a/fingertips_py/unit_tests/__pycache__/tests.cpython-311-pytest-7.2.1.pyc b/fingertips_py/unit_tests/__pycache__/tests.cpython-311-pytest-7.2.1.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79f08017495a203365c6fead78c929e3015dc2f1 GIT binary patch literal 87657 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 L>!~PEwaxzr?)C6u literal 0 HcmV?d00001 From 8cbc9ba58df825b4568d311003426e3bf82b9a53 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 31 Jan 2023 22:21:44 +0000 Subject: [PATCH 27/34] Added more to the .gitignore file. --- .gitignore | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 157 insertions(+), 4 deletions(-) diff --git a/.gitignore b/.gitignore index de0d65e..b0b6f3a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,160 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class -.idea -*.iml -out -gen +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ \ No newline at end of file From 4c4e8be49eaa0e60375972b6400cde5514d7a81a Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Tue, 31 Jan 2023 22:27:24 +0000 Subject: [PATCH 28/34] Removed *.pyc files. --- .../__pycache__/__init__.cpython-311.pyc | Bin 1910 -> 0 bytes .../__pycache__/api_calls.cpython-311.pyc | Bin 6341 -> 0 bytes .../__pycache__/area_data.cpython-311.pyc | Bin 5343 -> 0 bytes .../__pycache__/metadata.cpython-311.pyc | Bin 24247 -> 0 bytes .../__pycache__/retrieve_data.cpython-311.pyc | Bin 9669 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 182 -> 0 bytes .../tests.cpython-311-pytest-7.2.1.pyc | Bin 87657 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 fingertips_py/__pycache__/__init__.cpython-311.pyc delete mode 100644 fingertips_py/__pycache__/api_calls.cpython-311.pyc delete mode 100644 fingertips_py/__pycache__/area_data.cpython-311.pyc delete mode 100644 fingertips_py/__pycache__/metadata.cpython-311.pyc delete mode 100644 fingertips_py/__pycache__/retrieve_data.cpython-311.pyc delete mode 100644 fingertips_py/unit_tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 fingertips_py/unit_tests/__pycache__/tests.cpython-311-pytest-7.2.1.pyc diff --git a/fingertips_py/__pycache__/__init__.cpython-311.pyc b/fingertips_py/__pycache__/__init__.cpython-311.pyc deleted file mode 100644 index 96af0a989c1de834576c5c09fb027f4cad250ef9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1910 zcmeH{NsALf6vw-h%p?<&*|*HTk8!)`NklxTqaX?j9v&k_O}Y|G`=#6JPH=913-4aU zFW~1G1VQQ~c=9&j&6DqSr(?!JJm}G;`BBTOf4!xu-d3w+hrSCRJ~pZa$N9pY?925U z-`-Q>wbODu=Zy=F=XyEc#T?`?4|yy=!R4{MKZL_Dj72D72}(EuBUpxVGFR}=U9-kzywahBu>E;PQx_Lzzoj9EY86k&ci&`poR;ufQzt*OR$8?u#79P zf~&BKYp{mvu#OwBft#?2TdogD*7J5mhFUbF??<+TDwdv%rL7tj z8?CxZaQCZAA(CmSrDE|c3fgvpTRbInTg08vSGI!kxe`Xb=%^^J57~J(A=%Wd85j|o zpsC4n@zjiNd%7Xxz(lszS3Wo-@!q)5US!v@bo84GQEGY#dJ`7cwhb*DmQg<$s z?iDlhCJpgKLHfD17kCkN{8)#+R&)f~9v|OE$Ct4V+9xZKhC{pc!%3Xu0dg)m#Xs}S zL#v5;?;0dpzZ|i%e=tZlYDC?i!6wJG?%GLDg+_N%H$By$yKuk0Yl|YOyDKR?lD;&I+}-B0B!N6G)H_}RH} l^!xuf=epn?JO7l0A@>Ps{^wt0pyIgaj-2}G-<+pP{{UCWO6&jt diff --git a/fingertips_py/__pycache__/api_calls.cpython-311.pyc b/fingertips_py/__pycache__/api_calls.cpython-311.pyc deleted file mode 100644 index 2e41a38f76ee5ae20a33fd0f7d4ef1fbf9c63d03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6341 zcmds5+iw)t89#H``_0DYW|MeaZdp>+7z9DKAvKsg0TeqCwVbTRJG1sU>)p+nS+L#R zXchHgi5$gLu5i^f+C&IKNh|(=KG63{UbHIiNR}d1sLGow8VT{#?>oCYJ8KM~EfG@B z?tJH*nR7qi@4MX$1iS>&nJa&bbq5LgJ639muNEFoK;aru$S_ejg->w99LxD(p5?-@ z2)U4OOge|1T&0a`*roUt@t54NTL~x*$URC>aY62dx*KvI1pqwA57kUX^f^aX(<(#;+bU3&{9cVGE&lq8I?{;#<(gS*OFr@ zHMF!Y!QhgdR3xezR8udhk|GE7H=y-xt4B`wIZ29_$rR+5Im1(*V8T%=XN3t|IZH)Xtz^#?@dm8^wzY%C zT29nR&XE-d$a`CI&aAWOw)d@-v)rm)uBkgOj1Ty6?`wpVyX_q!RP)9rz+!AM(u%hDO$`xUct}x zWgu_Kx}J(@vH_zYcd?GQIMapGYN~$x7H>K)sZ@(kQ@n=9j*JoCeK71X-POJ7rU2_P zz3Nmi3{4T2 zWjfeyO##L>1K2l8RXq(DQB4t-XNsDkPMTs;o>X0g1(Sf&5 zy?borgl3$~jE-D5IWQQFTbPQbr$-uVb_AP#yhoUm-6Gur6M(QG`tO0{$x2Xg99j-; zm`yC~``WP>jFf_raxhX53c{mhUrX8dYT37Qg>a5Tby96!%-m5IgMFo7Upd%^9SXvV z01Y2Kdi0=m)BNcL{qtYk@94hQ(S2uUsiUXd(Nk*eEw}dO-&*no@&ijvudEQ>(Z)zY zTne>(HucHWf_UYl*^i*Qese)A3|;XSyi2}N{>;M=EcfFLo5^op?{^7zogC1Zg;)4y zNrDxqJW~>IPe=m(g-8PK2}!^|ha}+tM@b-L1%~5mc9=acj$a%c`z4Sd2;0+x=g� z(FrwHkr)((-f@aTj-o6KyD4ft>O3<@N)mrZ>t> zZ{$xc`C1pnR{9F8U}$Y^^+%BF&*agUq^&@I+B8XBUllEF1$(kmR#;ni-GCOityZga zkeECIS{E<5nn1(u2Mzne=N((E{X{z&vm9;Bibb1tuC0fV#`WjKtOy7bXa4%%Ak3h0 z5`?|3_DEJyXId!^3RjKT$9!>U900Y##s{^UR4LPhahjT}ptGiaDwEp)8uqS*O_NV6 zrU!>Sj!QN@I8qd~FGH>AeOFFo)QWEOSepzxD(Kw-=W2s6uf%nf2#DP(c-Pgy3pxrd zhNu#!uR)V8c=R%mA4^NEh=OD9av(H2azC*3USMnS=*^Q~o&56j_0y$5S2@sC;0rt` z!S$&5_ST8L$KcJ2UtRoi`1)}1Y$?!P4s>Im0*`udFX+KH$0NP7IAX*h6UNLCnl0+$AAiE7G< zigR4kangqUql97mk3gZi|8+So%PFMJ zBv9k(wKxyEYk_O$zr%B3W75~56y_<8VseIkb94{9d(K_qCFt9Lz^+2OD*s~hT=QJ_ zeCynY3(fP!oZtFDyP@IQf_N<>$@FTvmedV783W%#H)u`nT2>S7fB{Vb&V04tZGPfT z=s{?E6dwIgKwg&l#BRQ*!6lcxd&=HD`J>CO=DDqN^85}stnlv!ORmnct8;}2j+P~M zpv4%RUn#V!3^n(zZ$s+}US@u+Ek7gwvHYw@26BAz;;N{D<@ryDaA+)nP1EtrsKFDy zf_(zQ(31+ZKz||3hk2xy_fl#QX32R(qW9=P*=tv{b8*9wJ z_~K>D!ZdjHGMG;Bn$I88FG+DNp|XY9#No`F5SXBZb zjN2npad>BpYkDpG5DEM1W{@cw>XcD;R7@x6frK_{I@n;Q=j71Pg{tjytQIYxKY^pg zV1lefVU-j)BrL4*W^{aO89^?@BDVb*ynP2A{SQD8fo{in?nwu|9Nfoz^apky{RoHF zMvboJrk8{L6;J(vuX(nw>;n+-Fut8G2RAPH-}HCmoA`sX zy}zC+3RiRUxsq>t*|&XB+^#bhz5P}4#h(6s!ri8=KpOyvQW-b>@H&udPY|IS+z8;`cghr*F6YL?ktkB5HInhAJvzqF_%B~8xL2wPjW8%!>)7T!PT@|ei zF-_^6x6ew93#3sQz2H<*f_PDd;dJ{DFV4pAuX_;^v+XeshU;MbT?uai;~N-Ai-Vr6 z`Wkju+*RjudH~L(;(Oy2F%G70LMiNA#kVG>(@of9ClDPi4PatO6;HfHQRPGwmkWlvQD`)dtxp5Vlkfe+*E0LlIlZ|5&h|y`!IJl2*?SPAyxUheI(ueeW69lFc6a9c zApkYkf2DV}H$SlK@y)i+4V64?WlvlF2(zJ?s+{Q@H;i;oS64j(7D;-8Y$1G70rCJqg{=pwRyU1pESyTj51cTp>vOglo!&@V7*K zdG=c(EsM4P64|)e_+KJ{Jo~LUn>g?-8p#eH2hK_(+0x7fS4bmyEyT5~kVdktiQ9qW U*~tzs_H86>#NU;7T>tLs3ZMcSrAiz-RE zu|^GAk&g_>hr4d5*R`lNteLyGfIl-}1M=BV$skaVSb+e=KJup^DF){VvGBraB4#6oqmYp-s zW!H?0La=tp?qz0%A#=CvS!QQgn0o}~7B%A)=xG#U(;Hr175SLJ>wGx5>OK9!%X>MM zi0hJ)&^TS;R8dzYaYf`X0#0A#bq?@xT2hQl^HLmxVEh`#Cjmpo~k$CrX#@D$fwu;}$Ypxth1tcXwfWud&#{M12b7=u}=aA7clv#kQ21F61y8SZ)tRrm~}H&x*cH&Ao!lHOx@1b6ks zlBW!xtKqV|2RdQuX~AjFD7?l`fnA`hm@*!{wR&y|TZUW)1F&AfDX^OjcR|j36|`R6PVx^86_70|o^YT7M+>&&63!xqkJ%+>d|- z>v;SjX>O1>tJmHS+0KSfLqt?{kYN)C2+bM`yckFAd4pYoylh|UPlX`S+)Kpz`#y1H zyoT3cay2$7!y>eRgtos>;DP(=Jutlop^UfIn+$Kg{@$bXo+=)L71%0ARi6~vtGkAs z4ZvUTReUznV8EZyQH2sZZ;-duolHYrr0p$Jg>zk1DB*y>-9mb({1#%lTR2!R)$TmD z`SRU5ZUEyU676)BHX5dp0b?z1Rk>D>dSEx_25nncI5c0AC#q*^buo?fBQ>1%7&Q1} z@Avuo_i<5gk>`7K=rErEC-ri0y}{oQHBL%E?IT5y(^r!sCkdrmsHaq@p*)v_(g+1o z6QPi5oH7p;Z+G?62tKG}P+=8KES1#0cO`uhcFJo~Wr3a`-VAfmc|ct$!?+Z3l8r_c z-${v@E(-meq~iik_*hD5P?rJMcd2tLyqtmxOqdu+@+!YfIEZ0+pyZBl=P~+TaZ@71nyF>LZCeWEfJk@ zDGj8;Jxx3=YR~||>xx9SCP5iLY*8YZ#u3{QhB5o#2Lv18sARz@wVrheENYvvY*$eT zlLKjWQP-2&$iTpSMbqKrq8L`xg>dS|0H2fwD(z2918v6_&)SceF5c8n6N){@2hU%P zz*yq}l|90BWfi>=fyT*2lohXZCJ*D_?AX-Q*yN>HjQmoWaj><}$m$ftDD%{J!fQHj-7UkQ< z>^nz2c-@{opw_!9+c0?ofXHfymYdk90DbA6s-B@2RdLs2c_Sk5DPf;YH})MLe0%Wd z@bzCE&x9-|_WyKa1qBz4SWa1-*Fi6iMde+K!HbxZuso`?u!v`uLGdiF#YG^SSg^e3 z!6n{+IE)JEz0m|jD&!Zu$KlNpF8wNmJqOW<10j`6Dk_dk;zu}8!rU9+!qpde4}4L@ zC+U9f85O>o_Lb4%Fope}JP#ulWH&OrS4P%aMsiVEo|6)!wFg`-k_!PPkSuX&ivV^j zgV|{36I!x`=o{_d)CXWUE@ckYKt$(@@sRNY6wu7>M<`cBJq$+;=Z zq3LRfR>LXAfnW`g5X+##yCiTJUu`AdAb3kGn_{t5fOPkk}H)%^Lj&1;n{6}KHK z4x~pUyl9Jh$8yX3oG5FS+xGl4@fo56F5OGC4mFCTe*6*0y{2fIGzS?IY=TP)c7{+; zbpujxPKYUxO4KbksS28kb!0gpm@KCRsa9n$2Z!(`1F1#jC$bDyrpNQly0C5|@+us>SL`4AciES8-agobSX_y5&-NC?;0Jq@vtN zCCRZ+qt%FcE!QLB01za23n$l76qXWRN|i~JlF!2!e1Pf}3;aj|{*1I}Vcuf!$6yR5 z4q<)}q)=7NM~Mbx5}ZLaY*I*8m5Z3vYWZ%WQ6m6}?X7(ScFCe*7u|9sJMpatwRW!0 zY^3sm6NSJDGjJk%N?63`Yf@}2JY17~RmA`k}-Y-zv&XX+;6PLRM%(?K zyzgAWch2;k%Z}{?JJ)41c*G12d=)&o9XxrzsSq4DgX7t;+n0Ycwc~4DTUq~gJ{UHA z1KF|v0)c&N2iF#Mf*m{i5AU>xij2d1InJ3$pa$m`3qZJ)$*hyEyiEN!S; zy_;!s;9R~7-zCBqsf|Mz&qadmB2`OxWpl#pKV9fMWA>dXbe%Q3&SJV{Nc$9~8zFQf z7y}EV7kL`<%u72yKWOXP?_c@Mk&FD9{VTiO650s_*92gZ#@mSR*Q&n9W2t+-V20% z{463oZq3@y+VM66I9dPN@efCTHwrw4j#Y<;ubwWtP=Et50%t*cfwM4U&)#ORzqGBt zRPc41zV5uI8`goN8`E1|=FxNJ(XlTn^XSCR(cuTJMF$larye6bf)FrfCqeZAF4ws6 zw#g0Oe|wu7H}^)flYpX&`}h~R*{#E7&&d6`9g@xd_2z?P59arR(a+bT~>sYES^y(V2PVC z?E@G_nEpSe CaXl~q diff --git a/fingertips_py/__pycache__/metadata.cpython-311.pyc b/fingertips_py/__pycache__/metadata.cpython-311.pyc deleted file mode 100644 index 1a03fbb4abffe9e6cbf11ec551d761fc546c6b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24247 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 diff --git a/fingertips_py/__pycache__/retrieve_data.cpython-311.pyc b/fingertips_py/__pycache__/retrieve_data.cpython-311.pyc deleted file mode 100644 index 71d66bde7afa2939d9c0f04c8fe27733720c5b04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9669 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 diff --git a/fingertips_py/unit_tests/__pycache__/tests.cpython-311-pytest-7.2.1.pyc b/fingertips_py/unit_tests/__pycache__/tests.cpython-311-pytest-7.2.1.pyc deleted file mode 100644 index 79f08017495a203365c6fead78c929e3015dc2f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87657 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 L>!~PEwaxzr?)C6u From cd1c6d1a675bf92d9da63876acf7961e03447358 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 1 Feb 2023 01:12:15 +0000 Subject: [PATCH 29/34] Updated the documentation files. --- build/doctrees/environment.pickle | Bin 24717 -> 45694 bytes build/doctrees/index.doctree | Bin 176798 -> 205420 bytes build/html/.buildinfo | 2 +- build/html/_sources/index.rst.txt | 62 +- build/html/_static/basic.css | 19 +- build/html/_static/css/badge_only.css | 2 +- build/html/_static/css/theme.css | 4 +- build/html/_static/doctools.js | 381 +++------ build/html/_static/documentation_options.js | 4 +- build/html/_static/jquery.js | 4 +- build/html/_static/js/theme.js | 2 +- build/html/_static/language_data.js | 102 +-- build/html/_static/pygments.css | 34 +- build/html/_static/searchtools.js | 820 +++++++++++--------- build/html/genindex.html | 167 +--- build/html/index.html | 636 +++++++-------- build/html/objects.inv | Bin 635 -> 632 bytes build/html/py-modindex.html | 157 +--- build/html/search.html | 163 +--- build/html/searchindex.js | 2 +- source/index.rst | 62 +- source/index.rst.bak | 127 +++ 22 files changed, 1184 insertions(+), 1566 deletions(-) create mode 100644 source/index.rst.bak diff --git a/build/doctrees/environment.pickle b/build/doctrees/environment.pickle index 031eb614d39911b6b07ae24fd4bbffe311c00ce3..9cdf04715fc64566d88d188d93421103e38df992 100644 GIT binary patch literal 45694 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 JAvdZm{eO&9T{8dx literal 24717 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 diff --git a/build/doctrees/index.doctree b/build/doctrees/index.doctree index 2d29590c804fc2ec9a3ef68a16d235ad9fcd2d87..04cad2d55abd7db6e6a9970a9b60e9ab65942eb9 100644 GIT binary patch literal 205420 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¥Oi zw&;mLp681}%7*hm9pc*D>+Fw2%3*~#X0C`^**Y0H~?Ja z1v;JuZ86aCqj-fs1?YHkvNJZJ#?zq^hZZBrGCmICKBZx);veJu_Tc z0!|yx+*lqR8!J<+!oet7!RToMr|f>wRX^fU`^>dCN~XXjZ~W*rKkIP-LgQAu2}dD~ z3@|?p6fABBO{2#>Irb=KvRvDg{y+ROs$ekuBK%1~MZqC(XbJ?;|n!j08gP(0Yu;NuP)IZUrA zm*Lo?>i9ICawcP|Sse4)9b<9Wxch-LGm1Ocdq|5zKIc%;1Po9<+{4l1TsW1qM!7Z% z0|n{T6Lse}p!cND^pF&XhYD2GjSu$+;k(s?39jy&sAz(^<-%eFhai z4j}&Ld2r12{cM-M<-;co#E%?hvz~(cr$DLd5vE30DYh0%aI%}ecW|=)M?$3xF`I(463rh7QMRv@NZ0wmW`)Fo_Z19 z%e%aES`@9HXqBiJN~|Oro`Ax&pv2}U`5bEo#6=7uj(t)B(+?9LwiJNiGIrNwce90E zC%C%7Qo(@?4^#0uLWZxi(BdTiYDSGOGW=9q`z{cYw{L)u9>{Rn)=v*GBn~8NS=bj0+i_&Zd-C+S+$1g|}}gB^4R|ZCfursDyQ%Q6=fcIWlbZII4Dd1aOfT zGJG<$#gO3#@CttlWO$vYYc^rx6QBhS6EDWgWSCgtd$$POReupV9@2`P4RV5xZAu-` zAE#?L zX)5BoQdxFx<^w#&=5LNV#_mcxqafxH54mwn;@_xf0tO`?K5LHImgGls-4mEFa;2x4 z%3)dndIBbY;2}?rOZ+Ppbpw-+161q8LaLh*X8;aT(F6;U51%lo7IKu$dXDjsWd`f% z53GH)2NT?-T;VbZ`LK_$Hqwwyg*!aBH&p2KDIo_YzvJOnIC_QCTN=9bC_9Pov&;ki zOgmtRt&6=eq;UPY*V-#N|9lMQ;Ba|Xw%e47a1msGaJt34I0FD?! z`9ZuQgp#i25uxmUeO!FRuLpecQeS-1)<+)b^R$4HT;dgj_3Fjai2c zb2L6T*^M}MJ%%vQxM%Y9a|>Ti!0taR6&z^ePpG(wHqIW=T6KDNEbOFufGT*Ot#`7m zeHWs|+s}q*t+(~k1ER$`Po8>WAR|*rdU1|uSUiCn1JriMz%-*15MU$8mTI$O>3|ip8At zkqO@}Asp*4bm&0+USxtPXzo$0@pMrM6l)CW8WNs6FBI!p!g%?&(am@C@nfL0l?*-u zvrB#c-1t&@L0FmED2uQ8vyHNR-Y`BXVN3!XvNG;TgQ5xVg&rc}+2!3-Gy!gq4{ywy zM@es#d(&W#NO!i3^w}N~;~D8eD(Z%$`U5Kbi3by0?Qf@|32K)Q`v@u^4cS!qhaTJ; zDpd2J1*jCDLffNNo^YbK@k}`PQPJFXJAKE4NDeA|6N;v}L=9Bfq z83K(s4X+4|psRUABiQbuPOV*?s#Sw#u~aV?$4a%aPOXGH^ytg867TYSIrb_SDB;;v z9@qp!T0A?{cEYfCa5i9!F%LM!Hqd>10oD_zxB#lM@fOX@D^B4lQ!8Atf#3@77T9Nw zvsIGLjbgcLtpfG}FO-18T_|e{cmW@@<(~nU@7XH5u^|}UuV-|_81^y{Y;->`dA-xZ zs}mY{x}}1iHpQ~%+o*WnfJVncgp=yK7#Y6%re17o-vwy!_Ok&RzhUd82S9^$o;-V5 zRgzwu0~%J7R<*-Tz(rnw#%^ef0UCdfSNKx^8Y5Y}fQf5}kq80DdC(#{z*JmAp7Bp_ zWJ>1)?_!k;+H{9o(JPIz5rN6^Ef0*#r!hHj!v~Oy!SI9dCq5DALs1|Yhp(##Cf=ts zGWS5nr_&`SfQ(NfT|>f)gPe0YFYa;m-rx5pJQ4mn6?J17kAv+sN1vJMd&KsdRa7*=Hsr%6%=Q}OD4X>h2TLwdjL4c!IhO^jtzU=n3eH|B?fZg5yg)h~-XUn@jQX z;VEt^W$#f+L6}Rh&1|CI>cNd6dZ#ZC2-a6U+yMtEaGLQ1DL%nGM_$`v+8(TP1nVx8 zYsy@xAz0V!EVMgQwSZpLOAnp!D@+<}FJA5wR+v+3%8qhs5bW)xF?&njO!FcSp>xYX zp=YuTw`p?tN`zaP;42X|D;wwuzIqpM#5U8s8?OkyqN{m?uP($i0zA%mwH6ddr(sjH zCq^~wz^IJ&@&KZ?byF$&sFocsU9ICzedVGB3*?a^YZE9J11#~m95Uqi|DNp8G;vSZ z>Elq9`Q>POK4B*zGt#paTUyg4XdxBL6H^{vvC6{>B~tPTzl@@>phRa2+MW95>fW|U zQ#WoGA?vP|>9P5SUHmCb^ZG55#h+MMbiyn@v{cYD(ijr)uTB@_4uI3|l`vphT?u2k3q zIww3J#8V%IYB*1%qI1twyNh=Y~tSfw!5sJBbiI-ZUOX9iEw8dae* z+UT_T0sO52g!Ed$U7eslhKHt!31Ck9kbX9N0mutjf1bspbk8ZUygtvLK71Yq|Xqzk_Ci8i!uPhNoCUNxIyMh%;Ca^GpB&%b=5k$y{>3PoXm<{=QCe*ZBQ zO~75`!z*UZk|Z#ieOq8(NLjWd{_P$z;Ys`-Qc*YhHn;f6S3HR23j6{UO;DhGm;#F^ z?W7b0(PNw0ME^MtZZe4eaR7WCadvlD8FSPE`225|{^Y|a4Dg8@WwV}NWwjm^y;zWV zfxf-Pqg9Tv;GE%!vD`;RbK5_*-NTGH`gRc%O`F&>^lfAOw5;yP2iG+Dye6WZjJ1?k z$ygD*%pT+?)26TMJcPwHio(jIQMXBP)J()YnNTwk%_`mXgqn4LBZitCz^flEhJWa4 z9#ON4Vln*wVA>NlTbBSnbvKv?Zgy^Wv+_+cpn1M_XuaBEubxoZE1@bI9MQA;1eJlH ztXSF6-NF^#!}dtJ2#Q`rkRnc zN-)xBPKRbtu zCaU9!4|ADI_sgp!3%+h z0&j;m@RM}tmv|xWDnk29g-}5->1guCtJT--6Dex$*Bq$$S)$_PC ziyaKF_uz-4MZ2kJKY_ZtJ&5JPpQfS-!j}(I@HZvy$C#;a?cn0U2-_uxu4Hn{Y7++w&kK5sqPwT9?9!=BNX(&%Z-CW`cPB)0dV+W!0gf2N^HaR~5kfq4HIEQae9KWC=4DTeXT1u(i&N7h zVgnz&u_2~R*n)#C<^l3-jAb%JsptoP%oofvFocF^hKimr&r+z$21xXrKEXUp9Slq< zXu(?)U$AEd*=u#yXVRmPyFI}w6)&VmNhLfU1!O^bj!#lFdCeHqvqCRS1309S)7w2e?)r3{;a3OG!7us_Yw8hY#m*5rt6ll+JHXpfe29nosDU5ZPufza@ z*?JLFL}!!=_gJ>X#NZzE75J_}D=0N#_szya8@|{AzefT6nF_|LJJM%=UnXOn654ekz)f5z2=z!}oYdgJ+cQrlRg- zzCY*pJnX>)SLrvYXo5=R!#Z2|6#^9aQ;$}8Du=GaGnM;oDw-Q8 zaPn}f;}`zz1Sp#3-~JaA(6-lFF^$1+Bg!!oD6rl`N!*f9NtrCkZOR-J5L0d@P(XxJ z%4T{31)c^RF;L)kydqG5uI3RGxB$b*R&b~|4ln8Xzbkc)0}#+!%L5G95~mQ`cfK<- zm+wg3WieP!L|_uCve6M8oKHl+(1!&LSRE6vKqtHI%V>mRr59Kw;e`SyNrcZwp;%CW z(^IuY-`_z0r2(>48Y@Us88DZ=>Y{`-6u~19=e(RHk|L+m~p)g^^I&w`Khgamr{89 zhEh`BhWfRwmmXBYI?t$*^x_yyog0>hiQ&K2vHr>FvT{pc+Ux2mbhgBYmB(fX*|K zTqdfy2SzSQ7m7$6wjo_ZViL;>7`dFyV$Qdbn!yy{YC*lt_FaKlsAG@$%xLUO5EC8; zLBvmK5j3Sg)q``ME8k2-6LMwwaBJeLM^5@BRZ))(fXN^YdM=_IK@!|?qX+jqSH7N# zy5Ww;!J95G@Zgy1`?*v!LErM>6Xs19IM|G0yW_wC`Rmg7B+PC-7VZdWpy5p6Jr~P?fP9HRl^$LKRqmr2!>Vfhp;? zslgY%+mlZ`tpY&cPv+btCw5Ynww ze2yTbwuKfa@l%W%UkK?%w)S0U1#jO#D?A{i*Vy{$0k2@)C;Rmngk;mr>>;Fg*qCua zNN>%iln>b2cPWLpZzv@dLi)I^mmXBYI?t$*^x_;svU(C#I~)Nn@`8}AgSHri^sjh@ zKLv!eLOD(oJ-P-8ar9_2UizR%r%Lpwj)$AzOAO-c^Wfnmc$8L5y1DQt*fV^h8vexR zD&293jWzw6jex`-C>hN?Y_#y)RCx&4=)aM!Au(Bj6m!{6GXm;F%;*+tz+D)=s?>r# zT0tG&z^fhz#3Gr25~WOTCws8S)5GJbXaZg!9}fA_Dy=W_t^)eUe)KR$%)RmKm(4KN!%I2NT>NYA%D25BrD# zAr0A7SoPrEP@&VO2n=YoN2?rmz`4N_cK8()%?$(kBM%}u2J}{xYsv(sVL-j2`0R~@ z9&4*9qsInd0{IK%Q^OI=H$l3i9oS{*Aw;fe6k;Y#yG@M)Od{sV1TcwUQt7lOfayEH z5!=x8FkTVBL|5|&FwybP2THY0P^>rFf&Z2!*YVFrdwIZ3^e&ds>ahCNC-CVpi|KlT zPrrn!Y@E#R@y|+Tpl2%vMXT|#V$7{ro=BHLh}4P=-2we@=!Hlrd4xwnD>g*xY(jjA2~4BT^Gu+=J%2!pNOiC6ejz*h9? zsB%s;_3AIA9R+1Mdi8TYVWhs0wn?H_1!}o~lX@J-QconDmARgDjNyBc%)#)_;g1i# zHLvG28`7l-4=8;X63n2$xrezvkuDYibA1fy8WJ;LUNF}gN(P8_JrzSeW)q?ZG6^fxk{g6F?F9@K`IEveU@^9CV8<=oyF_)kzT6S3PLw8SGc6 z=;I#3TCp*8q>2N3kEEgr+L8~SFc21Ul+AjUc*rt?_4EhAy3m6OK76;h3_?EaBZP%C zWK-cL5AF>WI(>?Ou)gTwRyeSMe%}+=_#5Vd^7`Ug-Gg-wVeLn`rc6#6gmtOsPF9+n z_W{cUi1GCEWV@8#ZYdzOPvRwTr*-Ywp+aJfZM39pS*Aii- zQglza);oYBhHL#XUJ*TTo}_<+#Rrurd@?d)@IPI~kdp-d=8uvCVn-;(Zb^Jb)KFtRR5@ z5Nx(eU@ab_M9W~udb1j|X7KR9Pe8@!G{*cTi5-UT0hy=n@T#0^k}zD^EN(=9FoHbjGuO=km2n^_;9;q7Mk{O#I8cH+?P+R#tz(b$b?Ry3m~uDSso4qm5J3YAD5wqEtBzM&#*tV!B#c4{ZtiRy}~g zdpGsR(9|z32c=r^V6|N-cAB*!9SP?;fJ>U~x|!(Qgz-3HX)_Oi`YcPk!$5WF$y>)K z5h?~=asg=rl!GlE=^lZeaP$JG$_M4$^X3`tny_q(JjNngAsp*7Q!d9?<>CcPE4hS6 zqlhdUC0ECEOoYV_-C6`?=)QT@mb?v-4qcmcud~qYglo^XRM2O^7@m1L6*sZw+2ffz zEkrn}-oeQ51(|QOweP|+dHX(irh+l=wDr;hjLAArj@PUzNiWV}OsjdS+TpLj)qB90 zv9FymWE%1KjCp85{6?w53lg2z%h@r3{Z0)o)|qaQ9Oq8PtrcTaPINA zS6Ec5j}qJ!&r_b4K~b2`IPrPmaTkL(V5c|X1s&4_aYd&I@drE2{Te#@bQE@z!cG0q zP9E9W@w~11&B*Ssn4)J!b~{vMMikvOe;JvSxFri)CLglxK=QX7+j_gLeOI={+s~G5z0cN5 z57`#$JlRQGRgzwuXIobDRJFrffQ#I+tx0H%Wm{juEBq<4t>wa(8HX2(5d*=c14$hc!#%GI>r^wtY7{0*`vXX>n)pfcR+~dK=8HT~MPN!6 zEaou}mUtxoODdWWiOYv;cd|69i#F*^qr@VhVr)l`F_alvf>ii4(qQ;=4-R-V{U{YZ z9226U&FPlK)o>;iO;Ce;*vEtjX~?F+f(Q483Y}IV5~4>u41>qZI9fg9<*zXt%4?mv z=)pP%ZSFw1rnnR>Av$R%9GzV+!&a#BI40pPg}*Q3KXl42IxTOylW` z$devybKM}@nRMee4xY>WGpJEFQYXnGml5-i(n3$U%IBJi=ldEI`4+6%*1;C?u(MH z=c>F-3znRRUU@LYDq;l76X^&j5BgiHM7;7KC6Vx>D4coCgZ|kswzcodgLwPd@}QOHb%!@$4|x#lJlVm=@*t*?^x`}ZvYMx= z9sUW(Dz`l7}oLp8Y!xZ?+rpiGN8ANSyvs|2~tq!PDH z@I>gmEF_CWNK89Q_&p^;{{eloMCehxqC|+U<}neXfH`b6>c06;()Lu@P#$T|37GZ} zRRG`3-%h&~Te{;k&ur&NsLD*g_frRZ%XUyq);GS76hai^TiuZ3nNpgQtZaLwG>Yx; zM3lh1rZneS=yoOt8!Z*|a4i-;ucP95r!>1QL^!FwhLPc$(mc)9zAL5S?Pp7A0$VRV zq%^GaWLIrfNqTXf(pb$?)eaW{7rCW0r$A#YrMU;M@TW*==(JDfW%c)f#gKuia|x72 z|Ix2Z<~N~#&$XRbBdJ4TydS=q%%6I#$JP|<`CT0Wd*CWGzh(UG#lq)g^*9vtv6 z_z$S);h4#M*@FqLhJT`>32KlJ`&KJSBMk(bs?PjUonrgIy9k(_+!TjYqWsB{4<~sYJDzm!ix%0b+ zEv^^K($3M{f)<{^_DK2#%7j{0p?GCNN+@9yhsxD^02Lamr8j1rb_lU>PjW_ z!&J$C*m~(fC9Ly|DoHQS6IZJ@QMJQo0vEX@t{rHMC9cO@09W`^B(BGHdsA~Ut_g+F z*FpSrCtmh3g*^?3_e^0=hN2MuaN-Z&6n47@OFVbFkcuYcPV(U_Q&?pUqU%ox+|WXApeTPX2&RUgG5!_F7BqWjbw|;YVI+cTE3K_8^#xd><7}5V?GK zoSjP9Ym`s`MijP@P26{SP@h5E{dqm^RUS-m6}-Zw0{O6yhyl`&O@%M>;NDQ7a}Wx| zV53K?JXJ;K=$WdXKt*#y4F1l8NWS*@w@@_AgKLPv(AB~}6efat(1g#hmDy`@gdo5d zM5o}K5cN)+cX>68y{o{${xVXZ32OL)hiJI|P&AqJ=Qbb?H4J7USwIaUBv6{_32Iol zRX`0#;1xj)bTyAq!xntk0Frll)4&&GI4cQc&>PDGUKrLJWLrc_?RIkq2Eg-&DVzk_ ziAP|bn8I49%0@(VVE!-#U24`f)D>n4_J*8!Q+fbG5Y}5o;DsP45rped8WsfML_!d( zn#~V9xWdAMGxfgIQo#WpY@^~Pc(7dZWWx;><5QVu(+^YXw_7N1l6)(p!51wUx3%v| zO?ms-Qq#7rmmX46)_Jm5kD&!Neas#$xX;Fn3oW=en@ZkbYu}|3-hMWfyu;Q@4=Q1u zXH-dgagG*PJ%_3t9t~XNh8Apq#u!@gNxZ_J0xejjdrK21SO>*8PH-$<_7Nxe67(OR zrF3_tZQA`OBy~u*W2lwO_sQ~qjq#@*Eb)x#$5b>SX_XJx?wr+YjM$DI-zr;7!U=xp z!2!>DzDGsfIKd{IBoHFFwE{1Q!gY1D1IMM)p*-~h=cEhM z4T(#AEfr0Wx_mg~ORb#!BJV1Ybznc)v~sKmhZ(feA2{I}4<@*pcDmFgANCPWKpL{C z@G=kX4HY`as(=$7_86`_9Yr7NnU4M=8`*iiTza<$>l{vaHp(@{(Q9zRxurt6I@T8N zl`01VZ=AxX-CK>ZDj^JrN{YBOQyn$HGgX5@{;HUTIN$7~H^^VqhM)SwIUSicnhX30n9daKv^o`~_YSv_Mx`poQcUjnA;2Xe^GKr8hg(QLN(V z)vi;Gdp;?~=qTl6W23D2qJ}vA6(XP6oo;-l{d8lq)9|C9gIS$${3N46;8={l?gw&+ zg_ZwD6iX4fR7|k1dWMiX{s_UPYj#S zE|r>o$kgjR=$lt@_>^x+lG2L}V(jqpZmp0Etmd|K}q8Yi)Mdm%t{#@iI<7z9M zbY3hqgHo#qU#O;EQco=x?kLnvB*Q_;mzvn4@t9uLaCMXiCb=P%o2h2w&@^F`;v>u} z_3a`jyEqU7+g(Un4}o*XT+}_nJ@LuaP?Zn*-|Q8iG*#e!qunf@o{kc=V4QL2$pi}HPlwH;mzR)93C8#@llpBI>YZ5O1ymvQ#R_-X z+IIm{y!~vz)UCE&dH|+a=gDDO3@hAh=~l;1L~#yGS=FsN3kRS%4`Avfha)f#Gd>F% zWZ+Z>ukfb;r|2jRm(Mc+D`B26;je&JaO_*(%^23wg6nRU=l$ZG!Vcqvw=JPpHQB;x zz>p-saWqvmwZb%9D~y8E-(PMVtg9~#&gxz%&{iuHFtP_vr;pdxSe;D@6kZ=s?I;FWyXM^pr9&=W}IVUpm+ zH+gW+b6(V@9ynT>3?F5Oy}p8q=C&Q;a~?!;{NgiEG=s_QxOz73NldS^Y(=`HXqF9u zEBH3@pJ_wIH#~&PEdYg^$pW1A7jo1?c&|*~aS~IJ(sfU$$BJzN^;n5lgnH0b7SyA6 zM1Vd5bBzd3ajK+Tr?))kB1do_^BhYbd89ZmcJZLt*-*fQuGpTQ!q2cnwhce)5Swc^ zcbvC%1D;LS4w}W$Y4&KWQ4U&s3rDq8Y{L z=F-H7@7Q}O1FCC!Y^GuHrw}{nw@exBvB=1okX>u3U`s+SVzcs9RNPD>SLkEU!a(

@e{&rI%~V!F8ynRT2z!HWdgVS6Vex_O)Cj!`nABvxFiJ!3qCm^0DyZ?%<%8;|*E&v(nA%;lUGa%(#>?NEN){!C_nb zE~W7H4W*+mSf5GhlkI%VgIjJp z|KhS8`S60C7?VUrz10UzBL&$s{g4Om88ltBC48vr8>jGN=J@@-T6MD8mV1}k{vNoE z&ZRX%CIO3#twKSgu+9zkjFKCI{h<^(S;A4GUY6i0K=IM@)xBY^Rp& zS6V9Q*->oya5)t>m#*h;)pwnRSSNR9Gje@beJ`@L?^+7s?HfxW&Q;%QY(4a_48l52 zo)bOPwx-Kra@#c4=}mmj1GIaVjYHRR)ibi`sAg;5r6b zo>%AZw{h;$->b9f?=80WUHaqgXVc%iY`yfLKi2uI^q1S}{DU^0T$=eY+xqE2H>~?v>1Ot;^N-n>aVh1O*_3kBrIrcZr4-)2p_Ej2cY>{#9#q0Q z(T@98p^5K;ddau%XM}BF=&vj&Tj_+h4@pf&Yzf=tE|&Ms3Jm6NT@W@cVC5?wtxG4{ba5S|>MH7}`=CT(sBjhHV8U3Y)9J82_4J9?rDW~Oqs~Ops z@VQH|Ka{#5pYjtAad5Nxq06k~!<&^^<;J)qIhu>s!HkglY-aR554mM9qsPGt|M5Gz zbE#PHDt3Y#OGOiAANg=@SKgJ)%xynlJ;+fu>sjL=%M8}jpB4TqJ(%FG<1&{)$cKGg z;YS*>sqhjH?hO^HRNJy=RjlxjdAJq628@}H=Nj;hR5Z60{%3oz{tH;5fuV5_<(iV7 zX)F9s*{Qz#fjiq&^kp8o5l`9+cmsAhP4jndAsU;Ss#SwBn>4`_%|Xk`!^}bBAiGz_ zY%+ZZ!OJ}q!>tDulgWDA=F4{w2$Uex4gvw~C_CwC2f_P*BesL!{dh$?2Lrfngx_K?ROf;T18Z*b%Lda{C1#KwX8SglhIimgVoT^fZ& z+jey_C{6{n%OLXHT<{N2mCYj2EBmv#Ai**$y9-W8RJGVN^VXIY4Ka#x@V-Y=AHv9<47 zvf}LsW|!5ZM?Y_6mQF>oe5j}F75F4 z4eg{ZD0XbU^q?Wu`K&Z_Mm2TDwkhotXEmw;UL>WI=~iB46N*cxQY~*k zn`-~q)=LknWu4DTwYhDr_*)xKF3tRPHqCs_*1k(KynRD69$PEEVe6*{-LURwrJLDr zt@wqF8JALimQ5*3FSpF{E~W7H4W*=d!eec{^q>;fc}A6_7w20mtWm709sV7JUAb

') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, + }; - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // 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'); - if (prevHref) { - window.location.href = prevHref; - return false; + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); } break; - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); } break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/build/html/_static/documentation_options.js b/build/html/_static/documentation_options.js index 84728ea..081dc3c 100644 --- a/build/html/_static/documentation_options.js +++ b/build/html/_static/documentation_options.js @@ -8,5 +8,7 @@ var DOCUMENTATION_OPTIONS = { LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/build/html/_static/jquery.js b/build/html/_static/jquery.js index b061403..c4c6022 100644 --- a/build/html/_static/jquery.js +++ b/build/html/_static/jquery.js @@ -1,2 +1,2 @@ -/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.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(e,n){S.fn[n]=function(e,t){return 0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.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(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}t.length>0&&($(".wy-menu-vertical .current").removeClass("current"),t.addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l1").parent().addClass("current"),t.closest("li.toctree-l1").addClass("current"),t.closest("li.toctree-l2").addClass("current"),t.closest("li.toctree-l3").addClass("current"),t.closest("li.toctree-l4").addClass("current"),t.closest("li.toctree-l5").addClass("current"),t[0].scrollIntoView())}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t { + const [docname, title, anchor, descr, score, filename] = result + return score }, */ @@ -28,9 +30,11 @@ if (!Scorer) { // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object - objPrio: {0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5}, // used to be unimportantResults + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, // Used when the priority is not in the mapping. objPrioDefault: 0, @@ -39,452 +43,495 @@ if (!Scorer) { partialTitle: 7, // query found in terms term: 5, - partialTerm: 2 + partialTerm: 2, }; } -if (!splitQuery) { - function splitQuery(query) { - return query.split(/\s+/); +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings } /** * Search Module */ -var Search = { - - _index : null, - _queued_query : null, - _pulse_status : -1, - - htmlToText : function(htmlString) { - var virtualDocument = document.implementation.createHTMLDocument('virtual'); - var htmlElement = $(htmlString, virtualDocument); - htmlElement.find('.headerlink').remove(); - docContent = htmlElement.find('[role=main]')[0]; - if(docContent === undefined) { - console.warn("Content block not found. Sphinx search tries to obtain it " + - "via '[role=main]'. Could you check your theme or template."); - return ""; - } - return docContent.textContent || docContent.innerText; +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; }, - init : function() { - var params = $.getQueryParameters(); - if (params.q) { - var query = params.q[0]; - $('input[name="q"]')[0].value = query; - this.performSearch(query); - } + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); }, - loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, - dataType: "script", cache: true, - complete: function(jqxhr, textstatus) { - if (textstatus != "success") { - document.getElementById("searchindexloader").src = url; - } - }}); - }, + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), - setIndex : function(index) { - var q; - this._index = index; - if ((q = this._queued_query) !== null) { - this._queued_query = null; - Search.query(q); + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); } }, - hasIndex : function() { - return this._index !== null; - }, + hasIndex: () => Search._index !== null, - deferQuery : function(query) { - this._queued_query = query; - }, + deferQuery: (query) => (Search._queued_query = query), - stopPulse : function() { - this._pulse_status = 0; - }, + stopPulse: () => (Search._pulse_status = -1), - startPulse : function() { - if (this._pulse_status >= 0) - return; - function pulse() { - var i; + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { Search._pulse_status = (Search._pulse_status + 1) % 4; - var dotString = ''; - for (i = 0; i < Search._pulse_status; i++) - dotString += '.'; - Search.dots.text(dotString); - if (Search._pulse_status > -1) - window.setTimeout(pulse, 500); - } + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; pulse(); }, /** * perform a search for something (or wait until index is loaded) */ - performSearch : function(query) { + performSearch: (query) => { // create the required interface elements - this.out = $('#search-results'); - this.title = $('

' + _('Searching') + '

').appendTo(this.out); - this.dots = $('').appendTo(this.title); - this.status = $('

 

').appendTo(this.out); - this.output = $(' @@ -240,15 +149,17 @@

G

  • get_area_types_for_profile() (in module fingertips_py.metadata)
  • get_areas_for_area_type() (in module fingertips_py.metadata) +
  • +
  • get_csv() (in module fingertips_py.api_calls)
  • get_data_by_indicator_ids() (in module fingertips_py.retrieve_data)
  • get_data_for_indicator_at_all_available_geographies() (in module fingertips_py.retrieve_data) -
  • -
  • get_data_in_tuple() (in module fingertips_py.api_calls)
  • - - - -
    - - -
    - - - - - - - - + + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); - - + gtag('config', 'UA-XXXXXXX-1', { + 'anonymize_ip': false, + }); + \ No newline at end of file diff --git a/build/html/objects.inv b/build/html/objects.inv index 5bf3ee146ef18321fc609576fa681b6db7addc7e..3f4b4f73f040df3b380ef2715d6af348f6ab37f7 100644 GIT binary patch delta 479 zcmV<50U-YS1o#Aye=^)45XbNP6iAKK)2^Cp-k^s{k$UJ6O<-)(U?6-dsH~a0px~5%)lU?G;%eoxz(~()OTC$c?QwtmW;j0+g*$VUSb_h}MVCV3sCu zCxrT1LOYR@Cc9Qhks6tYmq@ydj(yTHNBc0=^zsGe z5yw3+rY39Dj;p6zW>m=E`uUXEtM_w~MfYR_lHQb_YJ-AMNG|*c#lZAyS??{W99dFreo&4DM{CRkDlU8J> zg~u<{!qSzAmaU@y8W=gJ9!;Fu#(_%b!g6jr&OZw8N2$89@Z#?WvimW1w8@n^Ab8QO Vg~e7hKg<7ndJG;0UH}F`<&=`i^)mnf delta 482 zcmV<80UiGM1p5S#e=_7C49D;D6iB<$o@Ufu`vyI%RA~=;L@qc9TLP4iZ1eUtp_wMz z(N+`ETV(kEFt)MNk+BsRcEgmB_;TuEufG-B@jE*nn#;C6ZIEkg4&|<38ZC$2;S`z}2@B+KHSr*|kFQ)W|&kMABt+>=TyR+sCn{ zmoF$!IPQTlHBqB>Ts_?~qeA}P&#$D=uaQ?c;I{vim3loTD?7@6W%9=twI_5#H~vVR zXt})4Z=R;(4#`{eKM(KQ zq!oG7V#jaP!qSt8maV-15g2VwJ(@VRjRTd=h2z|KoEHl3XQ{e!@M857*~1t+y5ve7 Y5WMKt!eT3$UuFFXfqn)LuY!~3eixYZT>t<8 diff --git a/build/html/py-modindex.html b/build/html/py-modindex.html index 9a77b21..34a6769 100644 --- a/build/html/py-modindex.html +++ b/build/html/py-modindex.html @@ -1,44 +1,22 @@ - - - - Python Module Index — fingertips_py 0.2 documentation - - - - - - - - - - - - - - - - - + + - - + - - - - + + @@ -46,29 +24,13 @@ - - - +
    - -
    - - -
    - - - - - - - + - - - + gtag('config', 'UA-XXXXXXX-1', { + 'anonymize_ip': false, + }); + \ No newline at end of file diff --git a/build/html/search.html b/build/html/search.html index b57e0e3..377109e 100644 --- a/build/html/search.html +++ b/build/html/search.html @@ -1,74 +1,36 @@ - - - - Search — fingertips_py 0.2 documentation - - - - - - - - - - - - - - - - - + + - - + - - - - - - + + + + - - - +
    - -
    - - -
    - - - - - - - + - - - - - + diff --git a/build/html/searchindex.js b/build/html/searchindex.js index 7080279..7dd3db0 100644 --- a/build/html/searchindex.js +++ b/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index"],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.ext.todo":2,sphinx:56},filenames:["index.rst"],objects:{"fingertips_py.api_calls":{deal_with_url_error:[0,1,1,""],get_data_in_tuple:[0,1,1,""],get_json:[0,1,1,""],get_json_return_df:[0,1,1,""],make_request:[0,1,1,""]},"fingertips_py.area_data":{defined_qcut:[0,1,1,""],deprivation_decile:[0,1,1,""]},"fingertips_py.metadata":{get_age_from_id:[0,1,1,""],get_age_id:[0,1,1,""],get_all_ages:[0,1,1,""],get_all_areas:[0,1,1,""],get_all_profiles:[0,1,1,""],get_all_sexes:[0,1,1,""],get_all_value_notes:[0,1,1,""],get_area_type_ids_for_profile:[0,1,1,""],get_area_types_as_dict:[0,1,1,""],get_area_types_for_profile:[0,1,1,""],get_areas_for_area_type:[0,1,1,""],get_domains_in_profile:[0,1,1,""],get_metadata:[0,1,1,""],get_metadata_for_all_indicators:[0,1,1,""],get_metadata_for_all_indicators_from_csv:[0,1,1,""],get_metadata_for_domain_as_dataframe:[0,1,1,""],get_metadata_for_indicator:[0,1,1,""],get_metadata_for_indicator_as_dataframe:[0,1,1,""],get_metadata_for_profile_as_dataframe:[0,1,1,""],get_multiplier_and_calculation_for_indicator:[0,1,1,""],get_profile_by_id:[0,1,1,""],get_profile_by_key:[0,1,1,""],get_profile_by_name:[0,1,1,""],get_sex_from_id:[0,1,1,""],get_sex_id:[0,1,1,""],get_value_note_id:[0,1,1,""]},"fingertips_py.retrieve_data":{get_all_areas_for_all_indicators:[0,1,1,""],get_all_data_for_indicators:[0,1,1,""],get_all_data_for_profile:[0,1,1,""],get_data_by_indicator_ids:[0,1,1,""],get_data_for_indicator_at_all_available_geographies:[0,1,1,""]},fingertips_py:{api_calls:[0,0,0,"-"],area_data:[0,0,0,"-"],metadata:[0,0,0,"-"],retrieve_data:[0,0,0,"-"]}},objnames:{"0":["py","module","Python module"],"1":["py","function","Python function"]},objtypes:{"0":"py:module","1":"py:function"},terms:{"0":0,"05ii":0,"15":0,"1i":0,"2":0,"2000":0,"2015":0,"2\u00bdyr":0,"3":0,"55":0,"7":0,"90362":0,"92543":0,"boolean":0,"case":0,"default":0,"function":0,"import":0,"int":0,"new":0,"public":0,"return":0,"true":0,"try":0,A:0,At:0,For:0,If:0,It:0,Or:0,The:0,about:0,access:0,ag:0,age_id:0,agreement:0,all:0,allow:0,an:0,ani:0,api:0,appli:0,ar:0,area:0,area_cod:0,area_type_id:0,assign:0,associ:0,attr:0,attribut:0,audienc:0,author:0,avail:0,base:0,better:0,bin:0,bins_for_extra:0,birth:0,breakdown:0,calcul:0,call:0,can:0,categori:0,ccg:0,children:0,cluster:0,code:0,column:0,com:0,compil:0,contain:0,content:0,convent:0,creat:0,csv:0,data:0,datafram:0,deal_with_url_error:0,decil:0,defin:0,defined_qcut:0,definit:0,denot:0,depend:0,depriv:0,deprivation_decil:0,df:0,dict:0,dictionari:0,domain:0,domain_id:0,each:0,eg:0,either:0,en:0,england:0,error:0,etc:0,exact:0,expect:0,fals:0,field:0,filter:0,filter_by_area_cod:0,fingertip:0,fingetip:0,follow:0,form:0,format:0,framework:0,friendli:0,from:0,ftp:0,further:0,gener:0,geograph:0,geographi:0,get:0,get_age_from_id:0,get_age_id:0,get_all_ag:0,get_all_area:0,get_all_areas_for_all_ind:0,get_all_data_for_ind:0,get_all_data_for_profil:0,get_all_profil:0,get_all_sex:0,get_all_value_not:0,get_area_type_ids_for_profil:0,get_area_types_as_dict:0,get_area_types_for_profil:0,get_areas_for_area_typ:0,get_data_by_indicator_id:0,get_data_for_indicator_at_all_available_geographi:0,get_data_in_tupl:0,get_domains_in_profil:0,get_json:0,get_json_return_df:0,get_metadata:0,get_metadata_for_all_ind:0,get_metadata_for_all_indicators_from_csv:0,get_metadata_for_domain_as_datafram:0,get_metadata_for_ind:0,get_metadata_for_indicator_as_datafram:0,get_metadata_for_profile_as_datafram:0,get_multiplier_and_calculation_for_ind:0,get_profile_by_id:0,get_profile_by_kei:0,get_profile_by_nam:0,get_sex_from_id:0,get_sex_id:0,get_value_note_id:0,gid:0,git:0,github:0,give:0,given:0,gpl:0,group:0,group_id:0,ha:0,have:0,health:0,healthi:0,healthy_life_data:0,help:0,here:0,how:0,http:0,id:0,identifi:0,improv:0,includ:0,include_definit:0,include_sortable_time_period:0,include_system_cont:0,index:0,indicator_id:0,indicator_meta:0,indicator_numb:0,inform:0,integ:0,interact:0,io:0,is_test:0,json:0,just:0,kei:0,label:0,latest:0,least:0,licens:0,life:0,limit:0,line:0,list:0,load:0,local:0,major:0,make:0,make_request:0,mani:0,match:0,messag:0,metad:0,method:0,mixtur:0,modul:0,more:0,multipli:0,name:0,need:0,none:0,note:0,noth:0,number:0,number_of_bin:0,object:0,one:0,onli:0,opensourc:0,option:0,order:0,org:0,organis:0,other:0,otherwis:0,outcom:0,packag:0,page:0,panda:0,paramet:0,parent:0,parent_area_type_id:0,pars:0,part:0,period:0,phds_fingertips_pi:0,phe:0,phof:0,phof_ind:0,phof_meta:0,pip:0,popul:0,practic:0,present:0,print:0,profession:0,profil:0,profile_id:0,profile_kei:0,profile_nam:0,project:0,proport:0,publichealthengland:0,python:0,queri:0,r:0,rais:0,rang:0,rank:0,rate:0,readthedoc:0,relat:0,releas:0,relev:0,repositori:0,repres:0,request:0,requir:0,research:0,respons:0,result:0,retreiv:0,retriev:0,score:0,search:0,see:0,select:0,sensit:0,sequenc:0,seri:0,set:0,sex:0,sex_id:0,should:0,singl:0,site:0,sort:0,sourc:0,specif:0,specifi:0,split:0,ssl:0,standard:0,still:0,str:0,string:0,stub:0,suggest:0,system:0,take:0,term:0,test:0,thi:0,those:0,through:0,tier:0,time:0,tool:0,transpos:0,tupl:0,type:0,uk:0,under:0,uneven:0,upon:0,upper:0,url:0,us:0,user:0,valu:0,value_not:0,value_seri:0,varieti:0,varifi:0,view:0,wai:0,we:0,websit:0,when:0,whether:0,which:0,whole:0,wide:0,within:0,workflow:0,year:0,you:0},titles:["Welcome to fingertips_py's documentation"],titleterms:{api_cal:0,area_data:0,document:0,exampl:0,fingertips_pi:0,indic:0,instal:0,introduct:0,licenc:0,metadata:0,py:0,retrieve_data:0,s:0,tabl:0,usag:0,welcom:0}}) \ No newline at end of file +Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["Welcome to fingertips_py's documentation"], "terms": {"thi": 0, "i": 0, "python": 0, "packag": 0, "interact": 0, "public": 0, "health": 0, "england": 0, "fingertip": 0, "http": 0, "phe": 0, "org": 0, "uk": 0, "data": 0, "tool": 0, "major": 0, "repositori": 0, "popul": 0, "The": 0, "site": 0, "present": 0, "inform": 0, "mani": 0, "wai": 0, "improv": 0, "access": 0, "wide": 0, "rang": 0, "audienc": 0, "from": 0, "profession": 0, "research": 0, "gener": 0, "mixtur": 0, "avail": 0, "other": 0, "sourc": 0, "those": 0, "ar": 0, "through": 0, "user": 0, "agreement": 0, "organis": 0, "each": 0, "us": 0, "get_metadata_for_ind": 0, "function": 0, "can": 0, "load": 0, "api": 0, "further": 0, "should": 0, "pip": 0, "Or": 0, "compil": 0, "still": 0, "requir": 0, "git": 0, "github": 0, "com": 0, "publichealthengland": 0, "phds_fingertips_pi": 0, "import": 0, "line": 0, "standard": 0, "convent": 0, "It": 0, "suggest": 0, "whole": 0, "follow": 0, "ftp": 0, "return": 0, "varieti": 0, "type": 0, "depend": 0, "For": 0, "more": 0, "ani": 0, "you": 0, "help": 0, "name": 0, "view": 0, "here": 0, "readthedoc": [], "io": [], "en": [], "latest": [], "an": 0, "workflow": 0, "retriev": 0, "healthi": 0, "life": 0, "expect": 0, "birth": 0, "outcom": 0, "framework": 0, "profil": 0, "phof": 0, "get_profile_by_nam": 0, "phof_meta": 0, "get_metadata_for_profile_as_datafram": 0, "id": 0, "indicator_meta": 0, "str": 0, "contain": 0, "print": 0, "0": 0, "90362": 0, "1i": 0, "55": [], "92543": 0, "2": 0, "05ii": 0, "proport": 0, "children": 0, "ag": 0, "2\u00bdyr": 0, "r": 0, "we": 0, "see": 0, "ha": 0, "all": 0, "geograph": 0, "breakdown": 0, "get_data_for_indicator_at_all_available_geographi": 0, "healthy_life_data": 0, "project": 0, "releas": 0, "under": 0, "gpl": 0, "3": 0, "opensourc": [], "licens": [], "call": 0, "about": 0, "area": 0, "sex": 0, "valu": 0, "note": 0, "calcul": 0, "method": 0, "rate": 0, "get_age_from_id": 0, "age_id": 0, "is_test": 0, "fals": 0, "proxi": 0, "none": 0, "given": 0, "paramet": 0, "integ": 0, "test": 0, "tupl": 0, "url": 0, "get": 0, "request": 0, "string": 0, "get_age_id": 0, "search": 0, "term": 0, "param": 0, "code": 0, "repres": 0, "get_all_ag": 0, "dictionari": 0, "categori": 0, "get_all_area": 0, "A": 0, "get_all_profil": 0, "info": 0, "includ": 0, "domain": 0, "sequenc": 0, "get_all_sex": 0, "associ": 0, "get_all_value_not": 0, "list": 0, "get_area_type_ids_for_profil": 0, "profile_id": 0, "within": 0, "identifi": 0, "get_area_types_as_dict": 0, "relat": 0, "get_area_types_for_profil": 0, "have": 0, "relev": 0, "get_areas_for_area_typ": 0, "area_type_id": 0, "match": 0, "practic": 0, "7": 0, "etc": 0, "get_domains_in_profil": 0, "get_metadata": 0, "indicator_id": 0, "domain_id": 0, "datafram": 0, "object": 0, "At": 0, "least": 0, "one": 0, "otherwis": 0, "error": 0, "rais": 0, "option": 0, "number": 0, "noth": 0, "specifi": 0, "get_metadata_for_all_ind": 0, "include_definit": 0, "include_system_cont": 0, "definit": 0, "system": 0, "content": 0, "get_metadata_for_all_indicators_from_csv": 0, "csv": 0, "get_metadata_for_domain_as_datafram": 0, "group_id": 0, "indicator_numb": 0, "get_metadata_for_indicator_as_datafram": 0, "metad": 0, "group": 0, "get_multiplier_and_calculation_for_ind": 0, "multipli": 0, "get_profile_by_id": 0, "which": 0, "get_profile_by_kei": 0, "profile_kei": 0, "kei": 0, "stub": 0, "websit": 0, "give": 0, "form": 0, "page": 0, "gid": 0, "2000": 0, "exact": 0, "messag": 0, "profile_nam": 0, "try": 0, "specif": 0, "better": 0, "result": 0, "part": 0, "get_sex_from_id": 0, "sex_id": 0, "get_sex_id": 0, "case": 0, "sensit": 0, "get_value_note_id": 0, "value_not": 0, "queri": 0, "format": 0, "deal_with_url_error": 0, "base": 0, "ssl": 0, "verifi": 0, "set": 0, "get_csv": 0, "make": 0, "panda": 0, "df": 0, "file": 0, "get_data_in_tupl": 0, "get_json": 0, "pars": 0, "json": 0, "get_json_return_df": 0, "transpos": 0, "true": 0, "respons": 0, "make_request": 0, "attr": 0, "attribut": 0, "need": 0, "dict": 0, "geographi": 0, "get_all_areas_for_all_ind": 0, "get_all_data_for_ind": 0, "parent_area_type_id": 0, "15": 0, "filter_by_area_cod": 0, "eg": 0, "parent": 0, "default": 0, "limit": 0, "either": 0, "get_all_data_for_profil": 0, "onli": 0, "int": 0, "filter": 0, "appli": 0, "get_data_by_indicator_id": 0, "include_sortable_time_period": 0, "ccg": 0, "upper": 0, "tier": 0, "local": 0, "author": 0, "select": 0, "boolean": 0, "whether": 0, "sort": 0, "friendli": 0, "field": 0, "time": 0, "period": 0, "depriv": 0, "decil": 0, "deprivation_decil": 0, "year": 0, "area_cod": 0, "take": 0, "seri": 0, "index": 0, "If": 0, "just": 0, "denot": 0, "score": 0, "singl": 0, "modul": 0, "extract": 0, "particular": 0}, "objects": {"fingertips_py": [[0, 0, 0, "-", "api_calls"], [0, 0, 0, "-", "area_data"], [0, 0, 0, "-", "metadata"], [0, 0, 0, "-", "retrieve_data"]], "fingertips_py.api_calls": [[0, 1, 1, "", "deal_with_url_error"], [0, 1, 1, "", "get_csv"], [0, 1, 1, "", "get_data_in_tuple"], [0, 1, 1, "", "get_json"], [0, 1, 1, "", "get_json_return_df"], [0, 1, 1, "", "make_request"]], "fingertips_py.area_data": [[0, 1, 1, "", "deprivation_decile"]], "fingertips_py.metadata": [[0, 1, 1, "", "get_age_from_id"], [0, 1, 1, "", "get_age_id"], [0, 1, 1, "", "get_all_ages"], [0, 1, 1, "", "get_all_areas"], [0, 1, 1, "", "get_all_profiles"], [0, 1, 1, "", "get_all_sexes"], [0, 1, 1, "", "get_all_value_notes"], [0, 1, 1, "", "get_area_type_ids_for_profile"], [0, 1, 1, "", "get_area_types_as_dict"], [0, 1, 1, "", "get_area_types_for_profile"], [0, 1, 1, "", "get_areas_for_area_type"], [0, 1, 1, "", "get_domains_in_profile"], [0, 1, 1, "", "get_metadata"], [0, 1, 1, "", "get_metadata_for_all_indicators"], [0, 1, 1, "", "get_metadata_for_all_indicators_from_csv"], [0, 1, 1, "", "get_metadata_for_domain_as_dataframe"], [0, 1, 1, "", "get_metadata_for_indicator"], [0, 1, 1, "", "get_metadata_for_indicator_as_dataframe"], [0, 1, 1, "", "get_metadata_for_profile_as_dataframe"], [0, 1, 1, "", "get_multiplier_and_calculation_for_indicator"], [0, 1, 1, "", "get_profile_by_id"], [0, 1, 1, "", "get_profile_by_key"], [0, 1, 1, "", "get_profile_by_name"], [0, 1, 1, "", "get_sex_from_id"], [0, 1, 1, "", "get_sex_id"], [0, 1, 1, "", "get_value_note_id"]], "fingertips_py.retrieve_data": [[0, 1, 1, "", "get_all_areas_for_all_indicators"], [0, 1, 1, "", "get_all_data_for_indicators"], [0, 1, 1, "", "get_all_data_for_profile"], [0, 1, 1, "", "get_data_by_indicator_ids"], [0, 1, 1, "", "get_data_for_indicator_at_all_available_geographies"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"welcom": 0, "fingertips_pi": 0, "": 0, "document": 0, "introduct": 0, "instal": 0, "usag": 0, "exampl": 0, "licenc": 0, "metadata": 0, "py": 0, "api_cal": 0, "retrieve_data": 0, "area_data": 0, "indic": 0, "tabl": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "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.ext.todo": 2, "sphinx": 57}, "alltitles": {"Welcome to fingertips_py's documentation": [[0, "welcome-to-fingertips-py-s-documentation"]], "Introduction": [[0, "introduction"]], "Installation": [[0, "installation"]], "Usage": [[0, "usage"]], "Example": [[0, "example"]], "Licence": [[0, "licence"]], "metadata.py": [[0, "metadata-py"]], "api_calls.py": [[0, "api-calls-py"]], "retrieve_data.py": [[0, "retrieve-data-py"]], "area_data.py": [[0, "area-data-py"]], "Indices and tables": [[0, "indices-and-tables"]]}, "indexentries": {"deal_with_url_error() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.deal_with_url_error"]], "deprivation_decile() (in module fingertips_py.area_data)": [[0, "fingertips_py.area_data.deprivation_decile"]], "fingertips_py.api_calls": [[0, "module-fingertips_py.api_calls"]], "fingertips_py.area_data": [[0, "module-fingertips_py.area_data"]], "fingertips_py.metadata": [[0, "module-fingertips_py.metadata"]], "fingertips_py.retrieve_data": [[0, "module-fingertips_py.retrieve_data"]], "get_age_from_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_age_from_id"]], "get_age_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_age_id"]], "get_all_ages() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_ages"]], "get_all_areas() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_areas"]], "get_all_areas_for_all_indicators() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_areas_for_all_indicators"]], "get_all_data_for_indicators() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_data_for_indicators"]], "get_all_data_for_profile() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_data_for_profile"]], "get_all_profiles() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_profiles"]], "get_all_sexes() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_sexes"]], "get_all_value_notes() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_value_notes"]], "get_area_type_ids_for_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_type_ids_for_profile"]], "get_area_types_as_dict() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_types_as_dict"]], "get_area_types_for_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_types_for_profile"]], "get_areas_for_area_type() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_areas_for_area_type"]], "get_csv() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_csv"]], "get_data_by_indicator_ids() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_data_by_indicator_ids"]], "get_data_for_indicator_at_all_available_geographies() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_data_for_indicator_at_all_available_geographies"]], "get_data_in_tuple() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_data_in_tuple"]], "get_domains_in_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_domains_in_profile"]], "get_json() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_json"]], "get_json_return_df() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_json_return_df"]], "get_metadata() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata"]], "get_metadata_for_all_indicators() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_all_indicators"]], "get_metadata_for_all_indicators_from_csv() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_all_indicators_from_csv"]], "get_metadata_for_domain_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_domain_as_dataframe"]], "get_metadata_for_indicator() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_indicator"]], "get_metadata_for_indicator_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_indicator_as_dataframe"]], "get_metadata_for_profile_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_profile_as_dataframe"]], "get_multiplier_and_calculation_for_indicator() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_multiplier_and_calculation_for_indicator"]], "get_profile_by_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_id"]], "get_profile_by_key() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_key"]], "get_profile_by_name() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_name"]], "get_sex_from_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_sex_from_id"]], "get_sex_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_sex_id"]], "get_value_note_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_value_note_id"]], "make_request() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.make_request"]], "module": [[0, "module-fingertips_py.api_calls"], [0, "module-fingertips_py.area_data"], [0, "module-fingertips_py.metadata"], [0, "module-fingertips_py.retrieve_data"]]}}) \ No newline at end of file diff --git a/source/index.rst b/source/index.rst index caebc1e..a22414f 100644 --- a/source/index.rst +++ b/source/index.rst @@ -11,7 +11,7 @@ Introduction This is a python package to interact with Public Health England's -[Fingertips](https://fingertips.phe.org.uk/) data tool. Fingertips is a +`Fingertips `_ data tool. Fingertips is a major repository of population and public health indicators for England. The site presents the information in many ways to improve accessibility for a wide range of audiences ranging from public health professionals @@ -30,15 +30,15 @@ Installation This packaged should be installed using pip: -``` -pip install fingertips_py -``` +.. code-block:: console + + pip install fingertips_py Or it can be compiled from source (still requires pip): -``` -pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git -``` +.. code-block:: console + + pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git Usage ***** @@ -47,20 +47,18 @@ fingertips_py should be imported and used in line with standard python conventions. It is suggested that if the whole package is to be imported then the following convention is used: -``` -import fingertips_py as ftp -``` +>>> import fingertips_py as ftp The package returns data in a variety of types dependent on the function. For more information on any function, you can use: -``` -help(*fingertips_py function name*) -``` +>>> help(*fingertips_py function name*) + + +Or you can view the documents `here `_. -Or you can view the documents [here](https://fingertips-py.readthedocs.io/en/latest/). Example ******* @@ -69,32 +67,40 @@ This is an example of a workflow for retrieving data for the indicator on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes Framework* profile. -``` -import fingertips_py as ftp +.. code-block:: python + :linenos: + import fingertips_py as ftp -phof = ftp.get_profile_by_name('public health outcomes framework') -phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) -indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] -print(indicator_meta) + # Extract the metadata for a particular profile + phof = ftp.get_profile_by_name('public health outcomes framework') + phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) + + # Extract metadata for indicators containing the string "Healthy" + indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] + + print(indicator_meta) + +.. code-block:: + :linenos: + + Indicator ID Indicator ... + 90362 0.1i - Healthy life expectancy at birth ... + 92543 2.05ii - Proportion of children aged 2-2½yrs r ... - Indicator ID Indicator ... -0 90362 0.1i - Healthy life expectancy at birth ... -55 92543 2.05ii - Proportion of children aged 2-2½yrs r... ... -``` We can see that the *Healthy life expectancy at birth* indicator has an id of 90362. The data for this indicator at all geographical breakdowns can be retrieved using `get_data_for_indicator_at_all_available_geographies()` -``` -healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) -``` + +>>> healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) + Licence ******* -This project is released under the [GPL-3](https://opensource.org/licenses/GPL-3.0) +This project is released under the `GPL-3 `_ licence. .. automodule:: fingertips_py.metadata diff --git a/source/index.rst.bak b/source/index.rst.bak new file mode 100644 index 0000000..c4d1dc3 --- /dev/null +++ b/source/index.rst.bak @@ -0,0 +1,127 @@ +.. fingertips_py documentation master file, created by + sphinx-quickstart on Mon Feb 25 08:34:07 2019. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to fingertips_py's documentation +========================================= + +Introduction +============ + + +This is a python package to interact with Public Health England's +`Fingertips `_ data tool. Fingertips is a +major repository of population and public health indicators for England. +The site presents the information in many ways to improve accessibility +for a wide range of audiences ranging from public health professionals +and researchers to the general public. The information presented is a +mixture of data available from other public sources, and those that are +available through user access agreements with other organisations. The +source of each indicator presented is available using the +`get_metadata_for_indicator()` function. + + +This package can be used to load data from the Fingertips API into +python for further use. + +Installation +************ + +This packaged should be installed using pip: + +.. code-block:: console + + pip install fingertips_py + +Or it can be compiled from source (still requires pip): + +.. code-block:: console + + pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git + +Usage +***** + +fingertips_py should be imported and used in line with standard python +conventions. It is suggested that if the whole package is to be imported + then the following convention is used: + +>>> import fingertips_py as ftp + +The package returns data in a variety of types dependent on the +function. + +For more information on any function, you can use: + +>>> help(*fingertips_py function name*) + + +Or you can view the documents [here](https://fingertips-py.readthedocs.io/en/latest/). + + +Example +******* + +This is an example of a workflow for retrieving data for the indicator +on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes +Framework* profile. + +.. code-block:: python + :linenos: + + import fingertips_py as ftp + + # Extract the metadata for a particular profile + phof = ftp.get_profile_by_name('public health outcomes framework') + phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) + + # Extract metadata for indicators containing the string "Healthy" + indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] + + print(indicator_meta) + +.. code-block:: + :linenos: + + Indicator ID Indicator ... + 90362 0.1i - Healthy life expectancy at birth ... + 92543 2.05ii - Proportion of children aged 2-2½yrs r ... + + +We can see that the *Healthy life expectancy at birth* indicator has an +id of 90362. The data for this indicator at all geographical breakdowns +can be retrieved using `get_data_for_indicator_at_all_available_geographies()` + + +>>> healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) + + +Licence +******* + +This project is released under the `GPL-3 ` +licence. + +.. automodule:: fingertips_py.metadata + :members: +.. automodule:: fingertips_py.api_calls + :members: +.. automodule:: fingertips_py.retrieve_data + :members: +.. automodule:: fingertips_py.area_data + :members: + +.. toctree:: + :maxdepth: 3 + :caption: Contents: + + fingertips_py/readme.md + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` From 7b475a42348432bcca7cebc42ec341e85ce57827 Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 1 Feb 2023 20:15:49 +0000 Subject: [PATCH 30/34] Made sure the eadme.md and index.rst were consistent. --- build/doctrees/environment.pickle | Bin 45694 -> 45694 bytes build/doctrees/index.doctree | Bin 205420 -> 205296 bytes build/html/_sources/index.rst.txt | 29 ++++--- build/html/index.html | 26 +++--- build/html/searchindex.js | 2 +- readme.md | 43 +++++----- source/index.rst | 29 ++++--- source/index.rst.bak | 127 ------------------------------ 8 files changed, 63 insertions(+), 193 deletions(-) delete mode 100644 source/index.rst.bak diff --git a/build/doctrees/environment.pickle b/build/doctrees/environment.pickle index 9cdf04715fc64566d88d188d93421103e38df992..0fedb1d962db8b252d4f67cffe447ba08049b6c4 100644 GIT binary patch delta 47 zcmV+~0MP&b2Tlf1ZjRx1OFJm!*-Zi7}A>Ud3Jt$cI|fLxy%?koMLojZiZHp?Ux!O6A4l8nKdyVZ6wGe&QA)ly+(OqiUdeT*?>v!PBQ6Jy%u z#d?_+S%JD{i%!3&$fP^foza_fDkB3hw18l;V3zdOwT$`yr{}$8{COTgZZW&Q3RX705p24^Yn?FOuk!xG3T)` z7ERA&WuC^EGL4P-8FN)>(&US06}NM-GY2v<)=ZD#VAf}>+1|s!+{VaS3)E^qJpm+S zJ$(WPv*-2+T+GIdtaU)~LXfyNn3)Tbv!1@2m6>bu2Rni3zC6q_K%=sFn9~`nrW^7w M%WeO_!(1Z@03eT_-2eap delta 658 zcmexxnCHzA9+n2ysf-(0+7&owGBPkIfWTxyC0SMoOHauF%8FBRhO!pISx=Olpkivu zK2X*NMOmtuBsRH2*=X_;Rl&&zlnsSGgPr7=my(&BSdw3);OR0+#eA}Y3M-$Uo*oxi z($c`#%xJQjs+};Hix4+5H8Gx?uWGLZ6Q7d79y=vNu!kCkO27?mozgg^c8W#@YX)0} zSeEGIgR07ESwc(<3>_IyIy0X3u&1P^C6?xtOv!j&JEb&3HRDQ#dWJ@Zrgz9@ezl#< zj4_)}YN{|YCQg2*b&N4}^H%LbCdTy5>UxIWyn7-gYWBKHU?OfCQ{xPy`HDIa%N?I!cHGuSd3{shX;XhOGbbTgf&aI}*+gTWk zr@v)kp2nCuy@i$e8FO`M(qzWjirf3xm;)IZYo|Y8XVzz|-7dhv+{VaS2lR^l^gwoI z`N<2!c)(n1Fn3Z7_jEfBX8G+RT+GIdto1;3g$Q*ZZZ5Jq!Rhv_%v_TN`UIw5>!LphF diff --git a/build/html/_sources/index.rst.txt b/build/html/_sources/index.rst.txt index a22414f..abd72a2 100644 --- a/build/html/_sources/index.rst.txt +++ b/build/html/_sources/index.rst.txt @@ -68,25 +68,24 @@ on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes Framework* profile. .. code-block:: python - :linenos: - import fingertips_py as ftp + import fingertips_py as ftp + + # Extract the metadata for a particular profile + phof = ftp.get_profile_by_name('public health outcomes framework') + phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) + + # Extract metadata for indicators containing the string "Healthy" + indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] - # Extract the metadata for a particular profile - phof = ftp.get_profile_by_name('public health outcomes framework') - phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) - - # Extract metadata for indicators containing the string "Healthy" - indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] - - print(indicator_meta) + print(indicator_meta) -.. code-block:: +.. code-block:: console :linenos: - - Indicator ID Indicator ... - 90362 0.1i - Healthy life expectancy at birth ... - 92543 2.05ii - Proportion of children aged 2-2½yrs r ... + + Indicator ID Indicator ... + 90362 0.1i - Healthy life expectancy at birth ... + 92543 2.05ii - Proportion of children aged 2-2½yrs r ... We can see that the *Healthy life expectancy at birth* indicator has an diff --git a/build/html/index.html b/build/html/index.html index 3c5b50e..0e29faf 100644 --- a/build/html/index.html +++ b/build/html/index.html @@ -169,21 +169,21 @@

    Example
     1     import fingertips_py as ftp
    - 2
    - 3     # Extract the metadata for a particular profile
    - 4     phof = ftp.get_profile_by_name('public health outcomes framework')
    - 5     phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id'])
    - 6
    - 7     # Extract metadata for indicators containing the string "Healthy"
    - 8     indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')]
    - 9
    -10     print(indicator_meta)
    +
    import fingertips_py as ftp
    +
    +# Extract the metadata for a particular profile
    +phof = ftp.get_profile_by_name('public health outcomes framework')
    +phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id'])
    +
    +# Extract metadata for indicators containing the string "Healthy"
    +indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')]
    +
    +print(indicator_meta)
     
    -
    1     Indicator ID    Indicator                                               ...
    -2     90362           0.1i - Healthy life expectancy at birth                 ...
    -3     92543           2.05ii - Proportion of children aged 2-2½yrs r          ...
    +
    1Indicator ID      Indicator                                          ...
    +290362             0.1i - Healthy life expectancy at birth            ...
    +392543             2.05ii - Proportion of children aged 2-2½yrs r     ...
     

    We can see that the Healthy life expectancy at birth indicator has an diff --git a/build/html/searchindex.js b/build/html/searchindex.js index 7dd3db0..b83ed4b 100644 --- a/build/html/searchindex.js +++ b/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["Welcome to fingertips_py's documentation"], "terms": {"thi": 0, "i": 0, "python": 0, "packag": 0, "interact": 0, "public": 0, "health": 0, "england": 0, "fingertip": 0, "http": 0, "phe": 0, "org": 0, "uk": 0, "data": 0, "tool": 0, "major": 0, "repositori": 0, "popul": 0, "The": 0, "site": 0, "present": 0, "inform": 0, "mani": 0, "wai": 0, "improv": 0, "access": 0, "wide": 0, "rang": 0, "audienc": 0, "from": 0, "profession": 0, "research": 0, "gener": 0, "mixtur": 0, "avail": 0, "other": 0, "sourc": 0, "those": 0, "ar": 0, "through": 0, "user": 0, "agreement": 0, "organis": 0, "each": 0, "us": 0, "get_metadata_for_ind": 0, "function": 0, "can": 0, "load": 0, "api": 0, "further": 0, "should": 0, "pip": 0, "Or": 0, "compil": 0, "still": 0, "requir": 0, "git": 0, "github": 0, "com": 0, "publichealthengland": 0, "phds_fingertips_pi": 0, "import": 0, "line": 0, "standard": 0, "convent": 0, "It": 0, "suggest": 0, "whole": 0, "follow": 0, "ftp": 0, "return": 0, "varieti": 0, "type": 0, "depend": 0, "For": 0, "more": 0, "ani": 0, "you": 0, "help": 0, "name": 0, "view": 0, "here": 0, "readthedoc": [], "io": [], "en": [], "latest": [], "an": 0, "workflow": 0, "retriev": 0, "healthi": 0, "life": 0, "expect": 0, "birth": 0, "outcom": 0, "framework": 0, "profil": 0, "phof": 0, "get_profile_by_nam": 0, "phof_meta": 0, "get_metadata_for_profile_as_datafram": 0, "id": 0, "indicator_meta": 0, "str": 0, "contain": 0, "print": 0, "0": 0, "90362": 0, "1i": 0, "55": [], "92543": 0, "2": 0, "05ii": 0, "proport": 0, "children": 0, "ag": 0, "2\u00bdyr": 0, "r": 0, "we": 0, "see": 0, "ha": 0, "all": 0, "geograph": 0, "breakdown": 0, "get_data_for_indicator_at_all_available_geographi": 0, "healthy_life_data": 0, "project": 0, "releas": 0, "under": 0, "gpl": 0, "3": 0, "opensourc": [], "licens": [], "call": 0, "about": 0, "area": 0, "sex": 0, "valu": 0, "note": 0, "calcul": 0, "method": 0, "rate": 0, "get_age_from_id": 0, "age_id": 0, "is_test": 0, "fals": 0, "proxi": 0, "none": 0, "given": 0, "paramet": 0, "integ": 0, "test": 0, "tupl": 0, "url": 0, "get": 0, "request": 0, "string": 0, "get_age_id": 0, "search": 0, "term": 0, "param": 0, "code": 0, "repres": 0, "get_all_ag": 0, "dictionari": 0, "categori": 0, "get_all_area": 0, "A": 0, "get_all_profil": 0, "info": 0, "includ": 0, "domain": 0, "sequenc": 0, "get_all_sex": 0, "associ": 0, "get_all_value_not": 0, "list": 0, "get_area_type_ids_for_profil": 0, "profile_id": 0, "within": 0, "identifi": 0, "get_area_types_as_dict": 0, "relat": 0, "get_area_types_for_profil": 0, "have": 0, "relev": 0, "get_areas_for_area_typ": 0, "area_type_id": 0, "match": 0, "practic": 0, "7": 0, "etc": 0, "get_domains_in_profil": 0, "get_metadata": 0, "indicator_id": 0, "domain_id": 0, "datafram": 0, "object": 0, "At": 0, "least": 0, "one": 0, "otherwis": 0, "error": 0, "rais": 0, "option": 0, "number": 0, "noth": 0, "specifi": 0, "get_metadata_for_all_ind": 0, "include_definit": 0, "include_system_cont": 0, "definit": 0, "system": 0, "content": 0, "get_metadata_for_all_indicators_from_csv": 0, "csv": 0, "get_metadata_for_domain_as_datafram": 0, "group_id": 0, "indicator_numb": 0, "get_metadata_for_indicator_as_datafram": 0, "metad": 0, "group": 0, "get_multiplier_and_calculation_for_ind": 0, "multipli": 0, "get_profile_by_id": 0, "which": 0, "get_profile_by_kei": 0, "profile_kei": 0, "kei": 0, "stub": 0, "websit": 0, "give": 0, "form": 0, "page": 0, "gid": 0, "2000": 0, "exact": 0, "messag": 0, "profile_nam": 0, "try": 0, "specif": 0, "better": 0, "result": 0, "part": 0, "get_sex_from_id": 0, "sex_id": 0, "get_sex_id": 0, "case": 0, "sensit": 0, "get_value_note_id": 0, "value_not": 0, "queri": 0, "format": 0, "deal_with_url_error": 0, "base": 0, "ssl": 0, "verifi": 0, "set": 0, "get_csv": 0, "make": 0, "panda": 0, "df": 0, "file": 0, "get_data_in_tupl": 0, "get_json": 0, "pars": 0, "json": 0, "get_json_return_df": 0, "transpos": 0, "true": 0, "respons": 0, "make_request": 0, "attr": 0, "attribut": 0, "need": 0, "dict": 0, "geographi": 0, "get_all_areas_for_all_ind": 0, "get_all_data_for_ind": 0, "parent_area_type_id": 0, "15": 0, "filter_by_area_cod": 0, "eg": 0, "parent": 0, "default": 0, "limit": 0, "either": 0, "get_all_data_for_profil": 0, "onli": 0, "int": 0, "filter": 0, "appli": 0, "get_data_by_indicator_id": 0, "include_sortable_time_period": 0, "ccg": 0, "upper": 0, "tier": 0, "local": 0, "author": 0, "select": 0, "boolean": 0, "whether": 0, "sort": 0, "friendli": 0, "field": 0, "time": 0, "period": 0, "depriv": 0, "decil": 0, "deprivation_decil": 0, "year": 0, "area_cod": 0, "take": 0, "seri": 0, "index": 0, "If": 0, "just": 0, "denot": 0, "score": 0, "singl": 0, "modul": 0, "extract": 0, "particular": 0}, "objects": {"fingertips_py": [[0, 0, 0, "-", "api_calls"], [0, 0, 0, "-", "area_data"], [0, 0, 0, "-", "metadata"], [0, 0, 0, "-", "retrieve_data"]], "fingertips_py.api_calls": [[0, 1, 1, "", "deal_with_url_error"], [0, 1, 1, "", "get_csv"], [0, 1, 1, "", "get_data_in_tuple"], [0, 1, 1, "", "get_json"], [0, 1, 1, "", "get_json_return_df"], [0, 1, 1, "", "make_request"]], "fingertips_py.area_data": [[0, 1, 1, "", "deprivation_decile"]], "fingertips_py.metadata": [[0, 1, 1, "", "get_age_from_id"], [0, 1, 1, "", "get_age_id"], [0, 1, 1, "", "get_all_ages"], [0, 1, 1, "", "get_all_areas"], [0, 1, 1, "", "get_all_profiles"], [0, 1, 1, "", "get_all_sexes"], [0, 1, 1, "", "get_all_value_notes"], [0, 1, 1, "", "get_area_type_ids_for_profile"], [0, 1, 1, "", "get_area_types_as_dict"], [0, 1, 1, "", "get_area_types_for_profile"], [0, 1, 1, "", "get_areas_for_area_type"], [0, 1, 1, "", "get_domains_in_profile"], [0, 1, 1, "", "get_metadata"], [0, 1, 1, "", "get_metadata_for_all_indicators"], [0, 1, 1, "", "get_metadata_for_all_indicators_from_csv"], [0, 1, 1, "", "get_metadata_for_domain_as_dataframe"], [0, 1, 1, "", "get_metadata_for_indicator"], [0, 1, 1, "", "get_metadata_for_indicator_as_dataframe"], [0, 1, 1, "", "get_metadata_for_profile_as_dataframe"], [0, 1, 1, "", "get_multiplier_and_calculation_for_indicator"], [0, 1, 1, "", "get_profile_by_id"], [0, 1, 1, "", "get_profile_by_key"], [0, 1, 1, "", "get_profile_by_name"], [0, 1, 1, "", "get_sex_from_id"], [0, 1, 1, "", "get_sex_id"], [0, 1, 1, "", "get_value_note_id"]], "fingertips_py.retrieve_data": [[0, 1, 1, "", "get_all_areas_for_all_indicators"], [0, 1, 1, "", "get_all_data_for_indicators"], [0, 1, 1, "", "get_all_data_for_profile"], [0, 1, 1, "", "get_data_by_indicator_ids"], [0, 1, 1, "", "get_data_for_indicator_at_all_available_geographies"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"welcom": 0, "fingertips_pi": 0, "": 0, "document": 0, "introduct": 0, "instal": 0, "usag": 0, "exampl": 0, "licenc": 0, "metadata": 0, "py": 0, "api_cal": 0, "retrieve_data": 0, "area_data": 0, "indic": 0, "tabl": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "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.ext.todo": 2, "sphinx": 57}, "alltitles": {"Welcome to fingertips_py's documentation": [[0, "welcome-to-fingertips-py-s-documentation"]], "Introduction": [[0, "introduction"]], "Installation": [[0, "installation"]], "Usage": [[0, "usage"]], "Example": [[0, "example"]], "Licence": [[0, "licence"]], "metadata.py": [[0, "metadata-py"]], "api_calls.py": [[0, "api-calls-py"]], "retrieve_data.py": [[0, "retrieve-data-py"]], "area_data.py": [[0, "area-data-py"]], "Indices and tables": [[0, "indices-and-tables"]]}, "indexentries": {"deal_with_url_error() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.deal_with_url_error"]], "deprivation_decile() (in module fingertips_py.area_data)": [[0, "fingertips_py.area_data.deprivation_decile"]], "fingertips_py.api_calls": [[0, "module-fingertips_py.api_calls"]], "fingertips_py.area_data": [[0, "module-fingertips_py.area_data"]], "fingertips_py.metadata": [[0, "module-fingertips_py.metadata"]], "fingertips_py.retrieve_data": [[0, "module-fingertips_py.retrieve_data"]], "get_age_from_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_age_from_id"]], "get_age_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_age_id"]], "get_all_ages() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_ages"]], "get_all_areas() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_areas"]], "get_all_areas_for_all_indicators() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_areas_for_all_indicators"]], "get_all_data_for_indicators() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_data_for_indicators"]], "get_all_data_for_profile() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_data_for_profile"]], "get_all_profiles() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_profiles"]], "get_all_sexes() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_sexes"]], "get_all_value_notes() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_value_notes"]], "get_area_type_ids_for_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_type_ids_for_profile"]], "get_area_types_as_dict() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_types_as_dict"]], "get_area_types_for_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_types_for_profile"]], "get_areas_for_area_type() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_areas_for_area_type"]], "get_csv() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_csv"]], "get_data_by_indicator_ids() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_data_by_indicator_ids"]], "get_data_for_indicator_at_all_available_geographies() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_data_for_indicator_at_all_available_geographies"]], "get_data_in_tuple() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_data_in_tuple"]], "get_domains_in_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_domains_in_profile"]], "get_json() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_json"]], "get_json_return_df() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_json_return_df"]], "get_metadata() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata"]], "get_metadata_for_all_indicators() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_all_indicators"]], "get_metadata_for_all_indicators_from_csv() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_all_indicators_from_csv"]], "get_metadata_for_domain_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_domain_as_dataframe"]], "get_metadata_for_indicator() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_indicator"]], "get_metadata_for_indicator_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_indicator_as_dataframe"]], "get_metadata_for_profile_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_profile_as_dataframe"]], "get_multiplier_and_calculation_for_indicator() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_multiplier_and_calculation_for_indicator"]], "get_profile_by_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_id"]], "get_profile_by_key() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_key"]], "get_profile_by_name() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_name"]], "get_sex_from_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_sex_from_id"]], "get_sex_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_sex_id"]], "get_value_note_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_value_note_id"]], "make_request() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.make_request"]], "module": [[0, "module-fingertips_py.api_calls"], [0, "module-fingertips_py.area_data"], [0, "module-fingertips_py.metadata"], [0, "module-fingertips_py.retrieve_data"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["index"], "filenames": ["index.rst"], "titles": ["Welcome to fingertips_py's documentation"], "terms": {"thi": 0, "i": 0, "python": 0, "packag": 0, "interact": 0, "public": 0, "health": 0, "england": 0, "fingertip": 0, "http": 0, "phe": 0, "org": 0, "uk": 0, "data": 0, "tool": 0, "major": 0, "repositori": 0, "popul": 0, "The": 0, "site": 0, "present": 0, "inform": 0, "mani": 0, "wai": 0, "improv": 0, "access": 0, "wide": 0, "rang": 0, "audienc": 0, "from": 0, "profession": 0, "research": 0, "gener": 0, "mixtur": 0, "avail": 0, "other": 0, "sourc": 0, "those": 0, "ar": 0, "through": 0, "user": 0, "agreement": 0, "organis": 0, "each": 0, "us": 0, "get_metadata_for_ind": 0, "function": 0, "can": 0, "load": 0, "api": 0, "further": 0, "should": 0, "pip": 0, "Or": 0, "compil": 0, "still": 0, "requir": 0, "git": 0, "github": 0, "com": 0, "publichealthengland": 0, "phds_fingertips_pi": 0, "import": 0, "line": 0, "standard": 0, "convent": 0, "It": 0, "suggest": 0, "whole": 0, "follow": 0, "ftp": 0, "return": 0, "varieti": 0, "type": 0, "depend": 0, "For": 0, "more": 0, "ani": 0, "you": 0, "help": 0, "name": 0, "view": 0, "here": 0, "readthedoc": [], "io": [], "en": [], "latest": [], "an": 0, "workflow": 0, "retriev": 0, "healthi": 0, "life": 0, "expect": 0, "birth": 0, "outcom": 0, "framework": 0, "profil": 0, "phof": 0, "get_profile_by_nam": 0, "phof_meta": 0, "get_metadata_for_profile_as_datafram": 0, "id": 0, "indicator_meta": 0, "str": 0, "contain": 0, "print": 0, "0": 0, "90362": 0, "1i": 0, "55": [], "92543": 0, "2": 0, "05ii": 0, "proport": 0, "children": 0, "ag": 0, "2\u00bdyr": 0, "r": 0, "we": 0, "see": 0, "ha": 0, "all": 0, "geograph": 0, "breakdown": 0, "get_data_for_indicator_at_all_available_geographi": 0, "healthy_life_data": 0, "project": 0, "releas": 0, "under": 0, "gpl": 0, "3": 0, "opensourc": [], "licens": [], "call": 0, "about": 0, "area": 0, "sex": 0, "valu": 0, "note": 0, "calcul": 0, "method": 0, "rate": 0, "get_age_from_id": 0, "age_id": 0, "is_test": 0, "fals": 0, "proxi": 0, "none": 0, "given": 0, "paramet": 0, "integ": 0, "test": 0, "tupl": 0, "url": 0, "get": 0, "request": 0, "string": 0, "get_age_id": 0, "search": 0, "term": 0, "param": 0, "code": 0, "repres": 0, "get_all_ag": 0, "dictionari": 0, "categori": 0, "get_all_area": 0, "A": 0, "get_all_profil": 0, "info": 0, "includ": 0, "domain": 0, "sequenc": 0, "get_all_sex": 0, "associ": 0, "get_all_value_not": 0, "list": 0, "get_area_type_ids_for_profil": 0, "profile_id": 0, "within": 0, "identifi": 0, "get_area_types_as_dict": 0, "relat": 0, "get_area_types_for_profil": 0, "have": 0, "relev": 0, "get_areas_for_area_typ": 0, "area_type_id": 0, "match": 0, "practic": 0, "7": 0, "etc": 0, "get_domains_in_profil": 0, "get_metadata": 0, "indicator_id": 0, "domain_id": 0, "datafram": 0, "object": 0, "At": 0, "least": 0, "one": 0, "otherwis": 0, "error": 0, "rais": 0, "option": 0, "number": 0, "noth": 0, "specifi": 0, "get_metadata_for_all_ind": 0, "include_definit": 0, "include_system_cont": 0, "definit": 0, "system": 0, "content": 0, "get_metadata_for_all_indicators_from_csv": 0, "csv": 0, "get_metadata_for_domain_as_datafram": 0, "group_id": 0, "indicator_numb": 0, "get_metadata_for_indicator_as_datafram": 0, "metad": 0, "group": 0, "get_multiplier_and_calculation_for_ind": 0, "multipli": 0, "get_profile_by_id": 0, "which": 0, "get_profile_by_kei": 0, "profile_kei": 0, "kei": 0, "stub": 0, "websit": 0, "give": 0, "form": 0, "page": 0, "gid": 0, "2000": 0, "exact": 0, "messag": 0, "profile_nam": 0, "try": 0, "specif": 0, "better": 0, "result": 0, "part": 0, "get_sex_from_id": 0, "sex_id": 0, "get_sex_id": 0, "case": 0, "sensit": 0, "get_value_note_id": 0, "value_not": 0, "queri": 0, "format": 0, "deal_with_url_error": 0, "base": 0, "ssl": 0, "verifi": 0, "set": 0, "get_csv": 0, "make": 0, "panda": 0, "df": 0, "file": 0, "get_data_in_tupl": 0, "get_json": 0, "pars": 0, "json": 0, "get_json_return_df": 0, "transpos": 0, "true": 0, "respons": 0, "make_request": 0, "attr": 0, "attribut": 0, "need": 0, "dict": 0, "geographi": 0, "get_all_areas_for_all_ind": 0, "get_all_data_for_ind": 0, "parent_area_type_id": 0, "15": 0, "filter_by_area_cod": 0, "eg": 0, "parent": 0, "default": 0, "limit": 0, "either": 0, "get_all_data_for_profil": 0, "onli": 0, "int": 0, "filter": 0, "appli": 0, "get_data_by_indicator_id": 0, "include_sortable_time_period": 0, "ccg": 0, "upper": 0, "tier": 0, "local": 0, "author": 0, "select": 0, "boolean": 0, "whether": 0, "sort": 0, "friendli": 0, "field": 0, "time": 0, "period": 0, "depriv": 0, "decil": 0, "deprivation_decil": 0, "year": 0, "area_cod": 0, "take": 0, "seri": 0, "index": 0, "If": 0, "just": 0, "denot": 0, "score": 0, "singl": 0, "modul": 0, "extract": 0, "particular": 0, "lineno": []}, "objects": {"fingertips_py": [[0, 0, 0, "-", "api_calls"], [0, 0, 0, "-", "area_data"], [0, 0, 0, "-", "metadata"], [0, 0, 0, "-", "retrieve_data"]], "fingertips_py.api_calls": [[0, 1, 1, "", "deal_with_url_error"], [0, 1, 1, "", "get_csv"], [0, 1, 1, "", "get_data_in_tuple"], [0, 1, 1, "", "get_json"], [0, 1, 1, "", "get_json_return_df"], [0, 1, 1, "", "make_request"]], "fingertips_py.area_data": [[0, 1, 1, "", "deprivation_decile"]], "fingertips_py.metadata": [[0, 1, 1, "", "get_age_from_id"], [0, 1, 1, "", "get_age_id"], [0, 1, 1, "", "get_all_ages"], [0, 1, 1, "", "get_all_areas"], [0, 1, 1, "", "get_all_profiles"], [0, 1, 1, "", "get_all_sexes"], [0, 1, 1, "", "get_all_value_notes"], [0, 1, 1, "", "get_area_type_ids_for_profile"], [0, 1, 1, "", "get_area_types_as_dict"], [0, 1, 1, "", "get_area_types_for_profile"], [0, 1, 1, "", "get_areas_for_area_type"], [0, 1, 1, "", "get_domains_in_profile"], [0, 1, 1, "", "get_metadata"], [0, 1, 1, "", "get_metadata_for_all_indicators"], [0, 1, 1, "", "get_metadata_for_all_indicators_from_csv"], [0, 1, 1, "", "get_metadata_for_domain_as_dataframe"], [0, 1, 1, "", "get_metadata_for_indicator"], [0, 1, 1, "", "get_metadata_for_indicator_as_dataframe"], [0, 1, 1, "", "get_metadata_for_profile_as_dataframe"], [0, 1, 1, "", "get_multiplier_and_calculation_for_indicator"], [0, 1, 1, "", "get_profile_by_id"], [0, 1, 1, "", "get_profile_by_key"], [0, 1, 1, "", "get_profile_by_name"], [0, 1, 1, "", "get_sex_from_id"], [0, 1, 1, "", "get_sex_id"], [0, 1, 1, "", "get_value_note_id"]], "fingertips_py.retrieve_data": [[0, 1, 1, "", "get_all_areas_for_all_indicators"], [0, 1, 1, "", "get_all_data_for_indicators"], [0, 1, 1, "", "get_all_data_for_profile"], [0, 1, 1, "", "get_data_by_indicator_ids"], [0, 1, 1, "", "get_data_for_indicator_at_all_available_geographies"]]}, "objtypes": {"0": "py:module", "1": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"]}, "titleterms": {"welcom": 0, "fingertips_pi": 0, "": 0, "document": 0, "introduct": 0, "instal": 0, "usag": 0, "exampl": 0, "licenc": 0, "metadata": 0, "py": 0, "api_cal": 0, "retrieve_data": 0, "area_data": 0, "indic": 0, "tabl": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "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.ext.todo": 2, "sphinx": 57}, "alltitles": {"Welcome to fingertips_py's documentation": [[0, "welcome-to-fingertips-py-s-documentation"]], "Introduction": [[0, "introduction"]], "Installation": [[0, "installation"]], "Usage": [[0, "usage"]], "Example": [[0, "example"]], "Licence": [[0, "licence"]], "metadata.py": [[0, "metadata-py"]], "api_calls.py": [[0, "api-calls-py"]], "retrieve_data.py": [[0, "retrieve-data-py"]], "area_data.py": [[0, "area-data-py"]], "Indices and tables": [[0, "indices-and-tables"]]}, "indexentries": {"deal_with_url_error() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.deal_with_url_error"]], "deprivation_decile() (in module fingertips_py.area_data)": [[0, "fingertips_py.area_data.deprivation_decile"]], "fingertips_py.api_calls": [[0, "module-fingertips_py.api_calls"]], "fingertips_py.area_data": [[0, "module-fingertips_py.area_data"]], "fingertips_py.metadata": [[0, "module-fingertips_py.metadata"]], "fingertips_py.retrieve_data": [[0, "module-fingertips_py.retrieve_data"]], "get_age_from_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_age_from_id"]], "get_age_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_age_id"]], "get_all_ages() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_ages"]], "get_all_areas() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_areas"]], "get_all_areas_for_all_indicators() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_areas_for_all_indicators"]], "get_all_data_for_indicators() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_data_for_indicators"]], "get_all_data_for_profile() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_all_data_for_profile"]], "get_all_profiles() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_profiles"]], "get_all_sexes() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_sexes"]], "get_all_value_notes() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_all_value_notes"]], "get_area_type_ids_for_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_type_ids_for_profile"]], "get_area_types_as_dict() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_types_as_dict"]], "get_area_types_for_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_area_types_for_profile"]], "get_areas_for_area_type() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_areas_for_area_type"]], "get_csv() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_csv"]], "get_data_by_indicator_ids() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_data_by_indicator_ids"]], "get_data_for_indicator_at_all_available_geographies() (in module fingertips_py.retrieve_data)": [[0, "fingertips_py.retrieve_data.get_data_for_indicator_at_all_available_geographies"]], "get_data_in_tuple() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_data_in_tuple"]], "get_domains_in_profile() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_domains_in_profile"]], "get_json() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_json"]], "get_json_return_df() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.get_json_return_df"]], "get_metadata() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata"]], "get_metadata_for_all_indicators() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_all_indicators"]], "get_metadata_for_all_indicators_from_csv() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_all_indicators_from_csv"]], "get_metadata_for_domain_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_domain_as_dataframe"]], "get_metadata_for_indicator() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_indicator"]], "get_metadata_for_indicator_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_indicator_as_dataframe"]], "get_metadata_for_profile_as_dataframe() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_metadata_for_profile_as_dataframe"]], "get_multiplier_and_calculation_for_indicator() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_multiplier_and_calculation_for_indicator"]], "get_profile_by_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_id"]], "get_profile_by_key() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_key"]], "get_profile_by_name() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_profile_by_name"]], "get_sex_from_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_sex_from_id"]], "get_sex_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_sex_id"]], "get_value_note_id() (in module fingertips_py.metadata)": [[0, "fingertips_py.metadata.get_value_note_id"]], "make_request() (in module fingertips_py.api_calls)": [[0, "fingertips_py.api_calls.make_request"]], "module": [[0, "module-fingertips_py.api_calls"], [0, "module-fingertips_py.area_data"], [0, "module-fingertips_py.metadata"], [0, "module-fingertips_py.retrieve_data"]]}}) \ No newline at end of file diff --git a/readme.md b/readme.md index c332cba..d48ad99 100644 --- a/readme.md +++ b/readme.md @@ -19,34 +19,29 @@ python for further use. This packaged should be installed using pip: -``` -pip install fingertips_py -``` + + pip install fingertips_py Or it can be compiled from source (still requires pip): -``` -pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git -``` + + pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git + ## Usage fingertips_py should be imported and used in line with standard python conventions. It is suggested that if the whole package is to be imported then the following convention is used: - -``` -import fingertips_py as ftp -``` + + >>> import fingertips_py as ftp The package returns data in a variety of types dependent on the function. For more information on any function, you can use: -``` -help(*fingertips_py function name*) -``` + >>> help(*fingertips_py function name*) Or you can view the documents [here](https://fingertips-py.readthedocs.io/en/latest/). @@ -56,27 +51,31 @@ This is an example of a workflow for retrieving data for the indicator on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes Framework* profile. -``` +```python import fingertips_py as ftp - +# Extract the metadata for a particular profile phof = ftp.get_profile_by_name('public health outcomes framework') phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) + +# Extract metadata for indicators containing the string "Healthy" indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] -print(indicator_meta) - Indicator ID Indicator ... -0 90362 0.1i - Healthy life expectancy at birth ... -55 92543 2.05ii - Proportion of children aged 2-2½yrs r... ... +print(indicator_meta) +``` +``` +Indicator ID Indicator ... +90362 0.1i - Healthy life expectancy at birth ... +92543 2.05ii - Proportion of children aged 2-2½yrs r ... ``` We can see that the *Healthy life expectancy at birth* indicator has an id of 90362. The data for this indicator at all geographical breakdowns can be retrieved using `get_data_for_indicator_at_all_available_geographies()` -``` -healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) -``` + + >>> healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) + ## Licence diff --git a/source/index.rst b/source/index.rst index a22414f..abd72a2 100644 --- a/source/index.rst +++ b/source/index.rst @@ -68,25 +68,24 @@ on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes Framework* profile. .. code-block:: python - :linenos: - import fingertips_py as ftp + import fingertips_py as ftp + + # Extract the metadata for a particular profile + phof = ftp.get_profile_by_name('public health outcomes framework') + phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) + + # Extract metadata for indicators containing the string "Healthy" + indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] - # Extract the metadata for a particular profile - phof = ftp.get_profile_by_name('public health outcomes framework') - phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) - - # Extract metadata for indicators containing the string "Healthy" - indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] - - print(indicator_meta) + print(indicator_meta) -.. code-block:: +.. code-block:: console :linenos: - - Indicator ID Indicator ... - 90362 0.1i - Healthy life expectancy at birth ... - 92543 2.05ii - Proportion of children aged 2-2½yrs r ... + + Indicator ID Indicator ... + 90362 0.1i - Healthy life expectancy at birth ... + 92543 2.05ii - Proportion of children aged 2-2½yrs r ... We can see that the *Healthy life expectancy at birth* indicator has an diff --git a/source/index.rst.bak b/source/index.rst.bak deleted file mode 100644 index c4d1dc3..0000000 --- a/source/index.rst.bak +++ /dev/null @@ -1,127 +0,0 @@ -.. fingertips_py documentation master file, created by - sphinx-quickstart on Mon Feb 25 08:34:07 2019. - You can adapt this file completely to your liking, but it should at least - contain the root `toctree` directive. - -Welcome to fingertips_py's documentation -========================================= - -Introduction -============ - - -This is a python package to interact with Public Health England's -`Fingertips `_ data tool. Fingertips is a -major repository of population and public health indicators for England. -The site presents the information in many ways to improve accessibility -for a wide range of audiences ranging from public health professionals -and researchers to the general public. The information presented is a -mixture of data available from other public sources, and those that are -available through user access agreements with other organisations. The -source of each indicator presented is available using the -`get_metadata_for_indicator()` function. - - -This package can be used to load data from the Fingertips API into -python for further use. - -Installation -************ - -This packaged should be installed using pip: - -.. code-block:: console - - pip install fingertips_py - -Or it can be compiled from source (still requires pip): - -.. code-block:: console - - pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git - -Usage -***** - -fingertips_py should be imported and used in line with standard python -conventions. It is suggested that if the whole package is to be imported - then the following convention is used: - ->>> import fingertips_py as ftp - -The package returns data in a variety of types dependent on the -function. - -For more information on any function, you can use: - ->>> help(*fingertips_py function name*) - - -Or you can view the documents [here](https://fingertips-py.readthedocs.io/en/latest/). - - -Example -******* - -This is an example of a workflow for retrieving data for the indicator -on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes -Framework* profile. - -.. code-block:: python - :linenos: - - import fingertips_py as ftp - - # Extract the metadata for a particular profile - phof = ftp.get_profile_by_name('public health outcomes framework') - phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) - - # Extract metadata for indicators containing the string "Healthy" - indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] - - print(indicator_meta) - -.. code-block:: - :linenos: - - Indicator ID Indicator ... - 90362 0.1i - Healthy life expectancy at birth ... - 92543 2.05ii - Proportion of children aged 2-2½yrs r ... - - -We can see that the *Healthy life expectancy at birth* indicator has an -id of 90362. The data for this indicator at all geographical breakdowns -can be retrieved using `get_data_for_indicator_at_all_available_geographies()` - - ->>> healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) - - -Licence -******* - -This project is released under the `GPL-3 ` -licence. - -.. automodule:: fingertips_py.metadata - :members: -.. automodule:: fingertips_py.api_calls - :members: -.. automodule:: fingertips_py.retrieve_data - :members: -.. automodule:: fingertips_py.area_data - :members: - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - - fingertips_py/readme.md - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` From 5ab748937232ec5588134fbd7c7eb2a32ed5c68a Mon Sep 17 00:00:00 2001 From: xn4224nx Date: Wed, 1 Feb 2023 20:43:21 +0000 Subject: [PATCH 31/34] Fixed incorrect documentation. --- .gitignore | 3 ++ build/doctrees/environment.pickle | Bin 45694 -> 45694 bytes build/doctrees/index.doctree | Bin 205296 -> 205251 bytes build/html/index.html | 64 ++++++++++++++---------------- build/html/searchindex.js | 2 +- fingertips_py/area_data.py | 3 +- fingertips_py/metadata.py | 37 ++++++----------- fingertips_py/retrieve_data.py | 3 +- 8 files changed, 49 insertions(+), 63 deletions(-) diff --git a/.gitignore b/.gitignore index b0b6f3a..41ae443 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ __pycache__/ *.py[cod] *$py.class +# Google Drive backup files +*.bak + # C extensions *.so diff --git a/build/doctrees/environment.pickle b/build/doctrees/environment.pickle index 0fedb1d962db8b252d4f67cffe447ba08049b6c4..dfa385e327cfd7a922a5995bc2a7b8aad77b2cf2 100644 GIT binary patch delta 57 zcmV-90LK6Rfa8<6#;))`h3Mz}fud2?>WbnP0A9K3v)K^{I{dIMp?lY6~yTfv)grBqUzeay0z1F0?p7nto z<=*=p?1?>^sXm-fS>0H5uxom>QbQIqZSHcz&3kb??gLgW?wt3PYaEv*&M8T zZK>*0sLb|XRkrh>jjz3zp4WJo&JS(Lcb(a@SB>ZI|SJe zm*?oVLH4d$jc_p+Zd42DN~)@ry|e#jGkU4&uBQf>!eW&ZGARgtabG;#PGtsm=~Ovt zv|adeoauF3Mc91@H2J5fv7J9KB&g~is!4TYttCOGCR-QiMet)qj-C``U)YtSK14&N z+hxOp^|nB>V7F@NzE-yu4eZpB?P52<5$h+2t<97=Eh!WAo*HkDzj;b6p3NV$NPiS$ z)?Zd_)%$kGTlVOqsNWUU*8M(JM#%MfkdUk1z0>u%AiKOrbA39<-rT0Cz7}M!=bX9l zxhhs+_JT3O98&1lv#I_eh-uS=ZV)APN-zOc3l@NLB#3I;QkD6jkOucS!fAxsgF5-T&-7z>oEWO zIBf?rMeJa6;bnCQS)s@ZR#;aWrW$ivnu{t&JwOsO zELX+pnZd*WJuTP_U#fbkKlu*3cggD>F%OlTIU;-Ih+s|>>MG6$qQaprrj$Y_-02v- z^9X%9JXm6jQ3$C6sz_L5ThH$Z=j;rQ3gwTBLeY z8TN|NS-OYI?l)?oT{5N%Vha^~C|_r}d%%uEu-jmWq8A9JCPO2}E?APND_u;L1uR&> z0-@P*NV?H&qRCw@X4rFH*am@Z^THq?hP}rqWCSJT@^eC{;zzD7E+$vhP^vVO>pMyf zb=illO!sY61z}e=RDsyl^sa8MGbE0+PNTqR!|V!OIJ#l8bz2f^|6=(09m8j!FgkrcdUt;W&_vGp*NQquuyxQfgT@E?1 z3s=@IC2bXD51*fICKTylTTP7-YF%?NwJy7aT6171H)K|b$024_p}l!-jJ>}y$?jMg ztUS3aUFAt85yc(~5sE!XzL*KQDp<{;0$0ur)|XKVNOsC4fvX!;SV9ac-EWjGX@C-i zW!ovmEZZK!EZdSlF;A&aV3kSbI!Mj|Y|opqz-~0TyE;j?gj$|^Xw4Hqd#Lq0gDDFA z8p7c#FqFgBuV^NOFC86f`i)mz)vxeZX1#MEL@u2l%0VwXlu_*jg&b(5ZxE117Q|BL z2ut%^nx7N!_4>HAH$sCq)JeW(IaD`rN=kcm)1BUgr+ z)cAlV_WT)(^xber0+#*#y$+QYkQ!IsOC|keC{Jf=LOE8g31uRwHFng)`S!4?K>a9g z^v}_cgqoV}D$Q;_`*yuoAbSLYOTTyet36)CyFLUWm0k&L%u@?OnM!j*nMzuP$>jK# z*Cis;mQ8cBm98HqT&ZWTSdpv$@&Jh>>TVQMGFOJ?wg&CPJQV3bDW*sVd;P=O%u?YkCr)uY2?R_hOpL%C65US{Zf!nlK{hj9ll4P#nN z4-;CLFs6mZT?!qO!f%CX2d*D#naB zL#aE$?7H`7x<`@g!iYX_ofvWZ{c}Ptk~r4-HB1=cS~_2!hcm(m?FyIH4-AJ^mW4X| z2$3Gngh&o&LL`SvWWkkUg-(PRbZ7`MLW}Mt%H2h|JERm?aAoDLUS*oIbS#v?gurlS zf({oZEOvZZ==Ft|V9!~8Laz>&rH(DYg&rV>i}PU;F8WYSC0vXO<8{tXSdwtDi&D&m zUEvfiCff~G&hbu2X?AP-0sX&lp~k1-=G-1NZKYk`Ub3p6{tU8&1&B ze}^+Qu7vYsQ7;V$K+cQePhw z5@O2lXewIs`1u02u8$oxXi8$rX{t6eWuluJAl%MKY9dTIjG7Qr9(ZhlYbI2{ zl<6on&7S{4pjo?5jYBKQx@U^pLmK=2XPq#zln_}Kn#0Q)wGnWhk@VAUCeG7tAr7uQ z$*g0AO{KwlE$+~?RO5vl5Xb@CAo}3SkdJCZc-8YbNqF|qOWn+(C2nC+NQ5vtD8l0# zPfoYmht{<>Z9mlY?8K*{Tw{ZWtQs3teR&gYb>jIc*P-^zVAc_+*n1n-DBA3uLz$O#h1TE`+J#w>bah5iE0II~XA zZ4O<|lUkOAdVwyz?E4O^z++F%PGL)EJ!T6o!w){HL+eS;2lIU*OWk@xmNs5Qksyk2 zgUEs_lcmrD!2`0|nX44#rSHyj-{~`G3tAvgz@6NXarHc2akzPF(+he*J(+jrdZBoH zR6BW%at1cAM)@K_dVUbq$Py}Rn!$9|q> zA9^~(zI|(`-FWN2)Din+wX;UqMQ(}V!$5o1C_h1?K!0D4BgP+g`RkOCNQ39lz1`IJ za8wp2U!y7UNS+L_ESMWbGO8&HXu%8t#hDTUQU*j(UlX1eD1IKmnd_;tqn=RZQ>rFY z<+eyl)wB0*Z|*)!{tH#!hW|vB{5RIPMnMHs8G$05wQs>M<2-E;;sAz5ddc(L`wn@g z5HQO^TliuPb`thR+w_F>P$aYGp-71}xH1Rj=E*7+&|J1KN*MMONn|dA4uzF5cvt|(-t=Ot1-sXa zg@8ErnGXtyKqVsi`6`_8TlJJhG0hSOQ!_Bl{-6|Pm#nfr$G%WiqW$FV1bf-@5$-`$ zabaBrDo(8HvF{OAo%#^RT7SU_p4#k){SWFZQ684jrr8haX2lQ{91=;YSr(ej8>E`i zU3$pUx%HW5xKNPFtuHLg;`9 zifgzsYhGExi*AKZWlJmoE3e)cT!pb*DSL##ktq-%Z{(sBucaPY5 zA3Vk85w?rSLbb<&a&v0_{4g|+P_u%XR07eUD5mB`n3M>2iBe3>OZA1CuFrZag}{8K zfxYRyjPS5%54dWcee%5tcIAl})6HnOe6*WNf?hkfPseH;Es^fiqsvqgZVFcmIOW-< z%#Rkn-srinZ-{2T4rT%I^@eES>sXQqU!g;!%a3NhF5nyUQ*;u#p7xuTd$Dt(nXhYo zP)GzSeD!k|wYxqn21QF)OhMI!uWwT-CEEV?u>yBvY7il)3za2;>f;Ao?~^#zdXG!x zErGv|->-K?dl`CEJf^*-Pf0h6+KL%E<>adhQ3!2Cf$%)2jNM3F#(n(}F3cT!=b0Fr zqTo-_!p|f-3L4N?3HI>c5_Lk1&=XhYS{&bZ5KPY-yok<>=nMq06IVu**GAM(%>02p z=8dUOqd8_Cjuv*#Ctcaom=oiv3$yc`Qy2BaF~ZD;Sc~ys_l(=nDMR&qZTw^M&Uv+Z$Sg;@40-R7;;YoS(v@*MZ748 z7jc6qf-6(xIS)kLLk%JkYz7H=W>t5Hl;YT^2Er6@2zPmQ{nqOvGiCT6vGpFQS4Y*M zKUvM&!~Te~SN)N$|7ai#y6Ch0t=G01B}oc#{Tm3A4%Y5^W>Q+Lhe_#_VkV`>3X`nM z-IQ)0E6evbv3A)l(^dy7x4F43!rFqXg}P^~tmWGP>M*JYu*9gyYn#lRU=_oA-9uuD zHM%mE*X_vBx_wTptlN>LsPnH_`|rO->eaEl{$DAG4T3<95U)81WCiia3u=tsCx{OO zaa0h<5#k32fvi&o?PAr5<1(%aA|j5xLXHrLapD!Sf)E<})ex1vp2jU>B^LIgMr0ay zh(oGZtf{Jt1F9a>KtkMNG!Tee{asx(Pla@W7O2}Pjvpw@!$E4EE`vkPuEi~J@{Bi- z)UqrzE_i!YPmbdai^@16tg8|?r;ZpKWrl{Rf0jH`K6!ac3Ma z3{Cq`^^{&K79L{@p^rHhs`{JZA*zWf>#mxMp=DuekbcZDwA$a$=y3IK{ec+T&4%=D z9Pzl-D|Dripm%x^ymxXzl+TFrnK&6XxU%w3US$fadJL4YcQP=JLt_6p87MhsbGCA3 z{LFYytI$ZPz80wxm2MX=W1=-F=IYFN2hI_-EKbHjac#o#I2Z+65>ZD}ipRm|cpeAU z`=iwgrRI`BS%=PwH;*+?*VHl=$x3t(<1Zz=rC6^|=&DTPH^tt-cot;g2}@-)iBZMXUv$4>;YXyeV8J zd`LqM+>Jy+_>hKDeh!Od@c=EsbI7mo!Ak|+*9V6L<3-(G3k{J|I`7^1wFnyL`Y|&# zUdGIFYH%Ji^BN+xJlhw+>@+U=!FeE z!$v(W_c)vyQqQu`ClvBcr&M*H+A7tcWyI!&G=@SqLyN{xRkBe{RE#M|Q|)k1;`uA0 zPIJJE4P_9WPE)JZai5tl*o^+7q1l(NZlf#D1fO4z+@nJhc*`URsK7bJ1-MT}(3=nyj1e)#X*lb6k`>x|xPd`c(~O%-m%PidAmN*aS~Y z&~P!Y=BT^$>;xVydL~N3U>lp@0C}`5Y$&5;dTna+Xn7W=GVbAr&_3T_d%+JkaIgKLF9bMRv~6gOSQ^16q;b@5VN3E$%4e> z6sgDb;6@&Xn&-+uGUjI`DQ8(|3h>i8P+ca-or`rmwpD4FyR?z4TXAJ#Eny8_>Mp`9 z+FYy_5s`X}fVSWctxIra&?Y|+vu3`O#EZ|$M%?*#HxkyIlUwZM&t4}%osV>#M2WH2 zYN3DjpqV;@8wqu`*Y0elPHv)yI(d|0>f|K~bs{>bNlJA#>w7zawk)ywtx^@P)J-gt zNLvP+L!kZumMNp|6bL=0UlSAW`Ak4UMEj(ch1a|m)NoGnMw6fCLLk2#fRaR63=gE1Vbc9dDav{l z!T>AXb-E%IJ(FozW5*cru(#RPO+Bk}_&#q4WHjbDnE@@1lY`CB$tu6rN+G(t8mcoIGt*4k z0E|kCm&uLgIqW8%r9Ny)_h~GQ#+Au=qiE3P0zk~@IX=)#0nNl6Vl=J{n&t;$MklgJ zwn4)hGoxLNh0$B(7Vmz%=B+LV!^^$ZIsHDIrLBV9wM@L`F+sFem(1p#D&H>X;&OMO z)|D^@7Vg@uN*chV1jP%KVrE}xEX;nQAKo{@!fe+lVRm>>k_TS3(9}#&3(d}()Ckp( zHH7Cr6)QeTRuuCGsI`dyY=y|4M@b=jR+5mtoA<8nl*D8oC=w!jrz9c!NEY#&uR56v zBfU15?6Z9)W{8Ogd?p|vvOikO!VIqkP>+l;+5Ox{Wv`F0DoG-2BeaB&eLJNZC7E0P zg_n8asey#m0jND#t!_4zgH=y^|AA2Z_TwS7vN6q8Enc-?6}<=(Xze0kto05#=-C4s zhvycT*?Fs~A4D%w?MU(tfg_}r8&X4{ENW+7C7cq_?2f=Qh)TD_pLqT!dPmZC7s@H3KW zNT`Esg5RFnktCryfSN!E9iPOZdK=6Mp{psygsx5&LQlT~k1zUAGCv%;_EW*YngbKS zjKOnNq&az~xRwcinA+deTZHIXIYGt8-8p{Log;@&shpJ3z4PQ| ztDFP5S{kX>Y51soA4&mT7nAoA!4IK*^}-Y{eIKV=&f}0FZEj%Z@XeD{HCDQ~pQ|^g zFda9im_d`(5oCqGuQ1vs{=S$Zf%>=rz7W6{Xlr_r3s)xm=Y9YV(s*TLiHs5~Vo%C<8F?H-Jp4@w|Y}7QJAi#q=e}$ zsZ7zs-kbX4RAxBHL=EBKL6DX0C|hS>&T?JnVz2v1ziA@zNq)f`%JR zC(F@k9=hthG}+I{ChaT>&Bs(tT#PM=u4x=OE7F*%6=}w`L~YZ!f<%R&KRp<=Pm>3u z38H(q=-v$}MNV8fa^A_xs=Zmi2E1zv-4!`1n{pg9GtwkzK9^?JUqaCI`octe{sGn9 z^m{-(t+%I1JkT`MeI$aZSEdPt?2iBCv~#5{_muqz>* z+11W_Q@2WIcHJNnVizRDuA5mROMq4;>fd4kPgIoT3EZz}VTRvo^*3}TouEggdq_5& zQW5EYfq<3T>H!iIxL{W=@Q#;WzeDP zLHz0$o;&+JjfSSjs%rwog$_}#Ik?MSoO+rX567Q)qfo75u}s*@NuH~#(k0BbWt05) z=W5l&SII2%(G%)N-J^*_xo)CH&t`at9lilQge_xL#f32YW~B@JF4ZOpvu_H_3j3x~ zirF`{iLh_XlL{vU4@te~5&eNC=Bst;uv#kx@*%+kNL|YHX*v|IvKJb%P1X@A^WjSh^9I* zgZE?ARYs^6>5^s7zb`n=&qFwSeGFXOMCkb>H2}xJ4jD*2*~A=tR^_^%pbAQ`yAKs4 zdggCb`$D=v3H0ogA%U#PbLw7Q2A4cLvKh{fEU9H#Xd8-P^ooa`oFTii8O+Jb3_eDv z%#fILH>9))n?ZDxmkQU4{$rw#3$f}kM}Ku~{XO~v(cLY&yEBBkxN^YT=~L#NQz+BU zX$H@X{WB!o{q1;u)$2LOyBjvC^*SPV~A7iN&lVygytp?DQV<6rIIEX+M zfyX%7QmXI)N(E4wWy&|{MW`_Amw5I0*&8oaq5z@KW%!AA^nXW-(=#a`&Q|Nn{$4$-!`AcOMk!|CwybKr z{kUGKk4@@cVV~M(&hAnFQ^!~$~Qk9FB_kOkqX<9R18I` z${d**u^$PMgequJsJbbK1Ko2z_y&PvE7AjpgaRG5BE4vc1TCEN^I2%(7wDSiNTBOR zO~Rb}j#Axn%$HxNYvQVozs{EyzPERts<>PxRa~w)eGEjwm5CAqF<2FqEBh&3M7dm)%X4Mo!RQ`l<$HvQ4m*F9_v-6V5K9Vj9Kzp4#$|wIl{e-j^i70J&yA%+3GuN%|(2t zI_cNp7=0OStH3wpI&hvPPvr>vnp3qUtaQ#{_I(X|5~IGM6tnM}Tw!0`A5@akS95tU zMg3uJKc(K$VR^E3@&`F0rb6?Cb@%+J?$oJyyl85iCtD{C^O$bBt%!^BI5u_5K}f>YqHOy~u52QHiN?5O{j$CUakPbd|Z&-@F{XZ{7}3#D*n zmehq9{DU%6s#uf@^G)GHIuUz1Oethpxfv^~&&;8Vm^P2V2QX@P9#djxo-k@0pyaic z@9~-$_2(tEUC+%IGTnnxfVA=*B$MftJR#G?+6-VaJqJ@lrspZeWO_cI$z(?VsYZr8 zlHH1o!vm>%x^6k%t|6;*=Sb<-6*Z@x`l3f&ID zA_Y13Rkc|Ekk54c29=?my5spmx4&7eu9yYau%34}VXU_pWE#b~r`bbBC!hIEYPbiqzpp{;Tuc zhp0jl!rnxMh-*bkPY#(06>x2OQ{mbXrSH{K;Eltzs;1IwOGz!uLR&D`x(4V`dSg>2 z(9?Lo7<;@=H#NTn=rX!8C)Pm>0qO_@qBCq@pnEMza(V^;3H1^6 z^gz89j*r#dwnge@O6?_8exy))j1{H7#H$h{k%@W_p@qYrH4_e>X{!gTvx1_D`X@>z zoB115B;H@6qvRm7D+wlXQ|snDPsfOa=4nW1qD^Co?3rj&n5LWQ@0$rn{mNwL{lA>M zvl($T!)$7=Gb8^82ZgAenj`f;v$lb5>i$eBO$QY3!tF0rBU8{pkHn!cc_ydDH$oqD zM75ZXpT_EO$`U_mhhj`~rsSCBW?7t`jVv<UE)e~ z!^-fB+u2|n+x~$%Pl@J-s^Rgxpz||y-9!7oVlm|SIfj+ zHi0cSDuFjOx;8gaqjXF6yS00f85msPVW5jr%s^Lx%%R&F>rkar3na!hE-*XC=nB&@ zSx?mk1u~O12FRgBbD$`+5iNAr0**)(1rpjy3ph^QF4DmT9H;Is;E5DDic_-+B(fn( zajLXHIN(>n|AhnbD8a*ls1{TO4pwU@)uO$Li<^iPl@s=NU76tW##X@ z${b_1LK!h;Lji|~^{6L3%V9sKnTL?6g&u#npGRfuyL54(^m7Z*;|(lqT({D^{kk5; z@V%0MqjuEI2~;5&tj!C!n}@=r1e#%#;%**RDBZj;S7$414Uhx;ddbv6`VJfSbSpD7 zUk_3DOR2nzHI=**uBFn7vW zSC>IbbikGA(7~%*LrZ2il<~-hy*Q^Y|16X>&g>S#&Y3Md-Y^@c73&dtSqoX?JiuT* zvjuTU{Yf@*^(EAcSTKpI;pr%5K{ZSX3tp!bv*7g>!h#1|Yq!!hEo87CXhA;=;!vPh zTV0_~z*VXiFaPi7k1=BS#}Xx224D zWNE~oZ6PDxuK<*FeJ_8A5whI5k=ggQ;N7lk&9{@ZT8-vQ}n_j=~c+6SGyK557r3G2<&-*AxAu@b`Z!4 zLU`ck)BlABDe%n0gQ#{?VdlZ-lxkOG*7d|fwKdgCh>(Vc@Dkx$U@7vSr2APG>g*%J z-$hJ>D@9C%D@8&CT)A)mfEYx$Sj2nIrd@B0#++hCWE2y^l~L@xI_&PF<4sjEPBD>c zq%(@eLK@V>0tbtm1l)(gx=*oC30E%eMz1nc=@%wYeW9OKq4+ z|Lw1H%@h6gX#GU7@aZv>1^E5N4xIV)1saCJMH;n*4D8lL%%}HZPr}6qlwv-8P%Po% zKLd0VrB4(ypTfVSk{Mey&0NUSmRWi;Ced@K1;q^CZR;%X6f@cmf?t8Hm}A%^qL_ib z*1rb<)mWqrTQSA*S~10tBd)YPBQH?JnODnOA$7qVxK(Gm&r)@TR!31EFRj*~BA}J)QRt#0&YI1)>2-Qr zE2hV5t(Z`+wGu+%%02ul#Gu1Vt%Oh`Zb!SE5X6^^P+ywJq52N}r2{zX1u%a?TeJ0` z)@(hfHS-56?|zeXp$>r5F-~*M^RSElf3y|%|06g6!_q@nv=*;Bw)T0QXdfyKGrLCU zHTtI3LY}@T2;h#b9Waw;C5}0XJV(6*Ko2u{=D?beXD+3fJab!DN08S7V_$O@+J)F&6GGx8}#mdRf*>B#=j#HLcC0v3iJpsdY6TVKyrL zd26BK5z-MVt~78Qmx5Hmc%2*hBU}?QwQGaakH#9W+l7BGm7+%! z>=%sJ2SO@v7rC-F@)-R>rCzH$z$51|dSDwF?)^zEi>krHoqtx!YQt<8(}vkFrj0}s zT#0Mu@GQ>*YX3Iei+$P%1y(yIZGV#sCgZt!V;kxJ4KR)Vx4p=dTXe2!BagN<-d2Y{ z-2XLHMLw(lgi_r9pR|$S5jai1tn}$N++*qob9TDEsxQMy^icQ@0&$IOcJykFh1+z#n$Wi}4>_CupAoNWD{enQA70BxXdA6-=3%>7Qa91!K zsE!Nd3xS*w2y#@)6$gQ=Qwnd?)NT%Hnd<}9*XTMg!>&?ObGS-uhtyTGbfGSG|LNes zsc+E(v|aPdLcPq@1UitVnSRT$k3c`#@X8{+S|_*jP))U_Te9=vDkAMHy!u+cQYWrn ztY5+#S#+0wK&ZDVU!fC2dqam0*>X+!Vx4Dlmgu&4-{oW#PBwaycCNmmo!PZS|5wfS zfoCvS&uC{(+^0WLGem!?S3hd0-ld-P=|3g9 z>*0O|sr@FSO23H<`?R+$inCh$pTynO<9X}&&aPCkxj)(($pOP?*_G5S*pkGZQQJm!8X z;W3AIba5WuP2(n*Eiembnh?tO43gUuN)?KP9tR=8m{1)Vh{~pJb{+?vGXI*bE7dJN z3j@T$7@q}5$ift{FyJ2+P9)%Pd700`Qn9ecXJKi3IY@e5Of3DUi4fI8P{gf_rzeD{c ztC1JbUo^azJ*6LU1$Tfv)(SKiHao++-_zRG8b4?xGYMWy!mZqpI8w~A(Am5S{$zuG zSYaKyS;n?5>>&H}9n8zm=*Ov-Ud3>3CJOXEP+kXFyL|YpUZ;lofVXy_aS?he%yUpE zHYc9dt<3q2x-$;=*vc*cw6gU%y-6+gSy{|h^x_WY)#vqowOD`){|UVMg5IgN_<*kp z@YN0`=q0@auh(#iFI^AZgCh-ZU5^UpXa^bgM+Nh#ABKj$3O40$fRd4i!gN3>5C4Et z8UDD^@K<$MW995HZXb#OIKD-j%29q?2OiBa9XJAj=xlDq%&?I5rJmlPX}!9~YxG>+ zx0GW6zHG&MCw>USt9Vhn-~k=-#=sb2f+lYzCcIF440BAF1+x+p?x7UNgnLS5J`UZg z-&1N8*_Iuk6{RMuT3^J=S0s`h;1%STgoUSoqp)!M>-uN4-Kd>7xZg^u&GhC{nVg61 zlwg6~d5@gtX7wX$>+ec=#Q$!F6ZShZ?@b*41$N}A8ClefO=a)UBXv?o4lM~CIke<= zI(sh&rsiS2)Nu4 zDav}@V`yZ`_UMLY<8B?{ev0}^Lc%ii6@`Q!ck8Vox(xDIt4^7$Ecd;K>HZpgbyk)Q z%4B6(pVYD}bTbEpKJV+9x}c2by8JRCdq_SscubpN@9Q*E@&Q&>`DHTiyt=$p$QRvg{5~%Ble6(wHtiVU%ARCEEKSCb z`RQ;1Gk*OtjuG|BWR)xacA zl;D{eBR?YVd04cpK0auQoWcUCYJMptn6j;=8K zPa>e<%H2BxVs!7&3fVohMR~a>FNc)4fGaCkd6k(9w?P>_+OvXt^o9!I!am2B552xH z7rK6@|I%Mp2p5hD@b-9XHtIFu8kLd z(5h}E6ugh`iKfMmIF!tR42_33&i-}|C7X1r#-ZdA`hHu_#Gld6(AWL`c4np_ooMH>lj(g5C!OQY>d|Tf-;_CO2-y`< zR(6s(s^FY{Of3-ubV`YDhW+i#6mvV7yz{yrPA=Fy9aBEuiRY!4L_)`ukbtG?4VK8; zL=X{E0e|y?9;Oca;2#V8qz?`W!Ozu#LnLq-8u$v;1sxz~q;)%U;jtp2!XY6v4u_y4 zg+t^N&X0$FHReY3-+;KKlMEA_kw$V4nwb}MMARfSlnj_IospW<$vk=y`=yoAFSHji z8107+qehkRha;WuXUnfV}&M zUW8xmp!@cw*)Bc3GY^vKoz3z;b!EgO{Zs4k9}Gf9V*smm(XMdmiJfI}x#Thi>N7qo z>!CUkZ;x~~SyyxqOqT*6U2I)*$gS(@=en37K>_{o?6WB-AU*DF(!$Rt zS~CLb)XDLDz3^@GQ&2#f`cUkq1P2u06$F%#Q-1;Ut3oD?9y6+P-0(Zcud)uCYoP&6 z&Gz7cMv=RHZp}u~J3U2*2U2ziXR-dq3bmsvptR|4p0eLV!dtdi>gUmK<^>l#y2>5} zWLuw@)u91-IAJ5NqW|GlP*?L8+)DqJ+;xqs9EGo+jh?~Z1FGfZ9C&rf=Okr+@pm%G z#DoSUHOuVkw345vUa6m_nO)7W(12v!tSe2_F*rdbPjy~b`$BS(nGhTh`cHS;h`Xum zZqVe>!zYa#d%d%B;a#>#i4VxI&qoFYQMO4}p2oI!F$IAE4edz$P+m<~KnnV}`q!|4 z*;+5{T0Jo$;8H;FGiV3vsV-)G{eb43)>7ti`gl^~;|cmWM;|}a$7XtO;}!bYN!z1u z(MNZRPF?9^BwE56*43P-9}ugb>0E{xx5`5*^qVKRE-Uc0y6$D6qpy$fwM#aogVy`gITO7BF{ONG{Uymw^L3t!UCRcP#a z7QI+xO{R~X^g-|1Sn+soz@j%UtO+p?6+tracla}(Ae7OnH7ubWVZ)6&8U zqmNtYgQhq1KR!UR5e))Dl^GWsFjbu=W@hO#!t#fb142y8xPWYR+T0cw5T7`_s{WKo z!^ck^Q#one&~c+DPab~9=*g>wtje~2?rKl$lVHv@4!BK6bfbk{rVi`IV+B^C%!Z_Z zw2;#%aOwz;?(vj>7G{1M?K0`fhTT7Tw7)RrdchwG7Sp|1kyEhUg)VmBBtMDgF+{q80tEm~E*6 G?fwtA977iX delta 26610 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 diff --git a/build/html/index.html b/build/html/index.html index 0e29faf..6e059f0 100644 --- a/build/html/index.html +++ b/build/html/index.html @@ -228,13 +228,14 @@

    metadata.pyParameters
    • age -- Search term of an age or age range as a string

    • -
    • is_test -- Used for testing. Returns a tuple of expected return and

    • +
    • is_test -- Used for testing. Returns a tuple of expected return and the URL called to retrieve the data

    • +
    • proxy -- proxy given to the get request used to access the API

    +
    Returns
    +

    Code used in Fingertips to represent the age or age range as a string

    +
    -

    the URL called to retrieve the data -:param proxy: proxy given to the get request used to access the API -:return: Code used in Fingertips to represent the age or age range as a string

    @@ -243,12 +244,15 @@

    metadata.py
    Parameters
    -

    is_test -- Used for testing. Returns a tuple of expected return and

    +
      +
    • is_test -- Used for testing. Returns a tuple of expected return and the URL called to retrieve the data

    • +
    • proxy -- proxy given to the get request used to access the API

    • +
    +
    +
    Returns
    +

    Age codes used in Fingertips in a tuple

    -

    the URL called to retrieve the data -:param proxy: proxy given to the get request used to access the API -:return: Age codes used in Fingertips in a tuple

    @@ -257,12 +261,15 @@

    metadata.py
    Parameters
    -

    is_test -- Used for testing. Returns a tuple of expected return and

    +
      +
    • is_test -- Used for testing. Returns a tuple of expected return and the URL called to retrieve the data

    • +
    • proxy -- proxy given to the get request used to access the API

    • +
    +
    +
    Returns
    +

    A dictionary of all area types used in Fingertips

    -

    the URL called to retrieve the data -:param proxy: proxy given to the get request used to access the API -:return: A dictionary of all area types used in Fingertips

    @@ -311,10 +318,9 @@

    metadata.pyReturns -

    Data value notes and their associated codes that are used in

    +

    Data value notes and their associated codes that are used in Fingertips as a list of tuples

    -

    Fingertips as a list of tuples

    @@ -359,8 +365,8 @@

    metadata.pyParameters
    • profile_id -- ID used in Fingertips to identify a profile as integer or string

    • -
    • proxy -- proxy given to the get request used to access the API

    • is_test -- Used for testing. Returns a tuple of expected return and the URL called to retrieve the data

    • +
    • proxy -- proxy given to the get request used to access the API

    Returns
    @@ -417,7 +423,7 @@

    metadata.pyReturns @@ -484,16 +490,13 @@

    metadata.py
    fingertips_py.metadata.get_metadata_for_indicator(indicator_number, is_test=False, proxy=None)
    -
    -
    Returns the metadata for an indicator given the indicator number as integer

    or string.

    -
    -
    +

    Returns the metadata for an indicator given the indicator number as integer or string.

    Parameters
    • indicator_number -- Number used to identify an indicator within Fingertips as integer or string

    • -
    • proxy -- proxy given to the get request used to access the API

    • is_test -- Used for testing. Returns a tuple of expected return and the URL called to retrieve the data

    • +
    • proxy -- proxy given to the get request used to access the API

    Returns
    @@ -505,8 +508,7 @@

    metadata.py
    fingertips_py.metadata.get_metadata_for_indicator_as_dataframe(indicator_ids, is_test=False, proxy=None)
    -

    Returns a dataframe of metadata for a given indicator ID or list of -indicator IDs.

    +

    Returns a dataframe of metadata for a given indicator ID or list of indicator IDs.

    Parameters

    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 literal 176798 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 z%0A^U3r6U{n8IY=h1gT5;_W~X3sw9s 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 hh~yXu_rv4l_^0KN0XT2lgw`_ data tool. Fingertips is a major repository of population and public health indicators for England. The site presents the information in many ways to improve accessibility for a wide range of audiences ranging from public health professionals @@ -30,15 +30,15 @@ Installation This packaged should be installed using pip: -``` -pip install fingertips_py -``` +.. code-block:: console + + pip install fingertips_py Or it can be compiled from source (still requires pip): -``` -pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git -``` +.. code-block:: console + + pip install git+https://github.com/PublicHealthEngland/PHDS_fingertips_py.git Usage ***** @@ -47,20 +47,18 @@ fingertips_py should be imported and used in line with standard python conventions. It is suggested that if the whole package is to be imported then the following convention is used: -``` -import fingertips_py as ftp -``` +>>> import fingertips_py as ftp The package returns data in a variety of types dependent on the function. For more information on any function, you can use: -``` -help(*fingertips_py function name*) -``` +>>> help(*fingertips_py function name*) + + +Or you can view the documents `here `_. -Or you can view the documents [here](https://fingertips-py.readthedocs.io/en/latest/). Example ******* @@ -69,32 +67,40 @@ This is an example of a workflow for retrieving data for the indicator on *Healthy Life Expectancy at Birth* from the *Public Health Outcomes Framework* profile. -``` -import fingertips_py as ftp +.. code-block:: python + :linenos: + import fingertips_py as ftp -phof = ftp.get_profile_by_name('public health outcomes framework') -phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) -indicator_meta = phof_indicators[phof_meta['Indicator'].str.contains('Healthy')] -print(indicator_meta) + # Extract the metadata for a particular profile + phof = ftp.get_profile_by_name('public health outcomes framework') + phof_meta = ftp.get_metadata_for_profile_as_dataframe(phof['Id']) + + # Extract metadata for indicators containing the string "Healthy" + indicator_meta = phof_meta[phof_meta['Indicator'].str.contains('Healthy')] + + print(indicator_meta) + +.. code-block:: + :linenos: + + Indicator ID Indicator ... + 90362 0.1i - Healthy life expectancy at birth ... + 92543 2.05ii - Proportion of children aged 2-2½yrs r ... - Indicator ID Indicator ... -0 90362 0.1i - Healthy life expectancy at birth ... -55 92543 2.05ii - Proportion of children aged 2-2½yrs r... ... -``` We can see that the *Healthy life expectancy at birth* indicator has an id of 90362. The data for this indicator at all geographical breakdowns can be retrieved using `get_data_for_indicator_at_all_available_geographies()` -``` -healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) -``` + +>>> healthy_life_data = ftp.get_data_for_indicator_at_all_available_geographies(90362) + Licence ******* -This project is released under the [GPL-3](https://opensource.org/licenses/GPL-3.0) +This project is released under the `GPL-3 `_ licence. .. automodule:: fingertips_py.metadata diff --git a/build/html/_static/basic.css b/build/html/_static/basic.css index 912859b..eeb0519 100644 --- a/build/html/_static/basic.css +++ b/build/html/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -222,7 +222,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: 360px; max-width: 800px; } @@ -236,7 +236,6 @@ div.body p, div.body dd, div.body li, div.body blockquote { a.headerlink { visibility: hidden; } - a.brackets:before, span.brackets > a:before{ content: "["; @@ -247,6 +246,7 @@ span.brackets > a:after { content: "]"; } + h1:hover > a.headerlink, h2:hover > a.headerlink, h3:hover > a.headerlink, @@ -334,13 +334,11 @@ aside.sidebar { p.sidebar-title { font-weight: bold; } - div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ - div.topic { border: 1px solid #ccc; padding: 7px; @@ -428,10 +426,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -614,7 +608,6 @@ ol.simple p, ul.simple p { margin-bottom: 0; } - dl.footnote > dt, dl.citation > dt { float: left; @@ -643,11 +636,11 @@ dl.field-list > dt { padding-left: 0.5em; padding-right: 5px; } - dl.field-list > dt:after { content: ":"; } + dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -731,8 +724,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -756,6 +750,7 @@ span.pre { -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; } div[class*="highlight-"] { diff --git a/build/html/_static/css/badge_only.css b/build/html/_static/css/badge_only.css index e380325..c718cee 100644 --- a/build/html/_static/css/badge_only.css +++ b/build/html/_static/css/badge_only.css @@ -1 +1 @@ -.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 +.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/build/html/_static/css/theme.css b/build/html/_static/css/theme.css index 8cd4f10..09a1af8 100644 --- a/build/html/_static/css/theme.css +++ b/build/html/_static/css/theme.css @@ -1,4 +1,4 @@ -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 .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 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 span.toctree-expand:before,.wy-menu-vertical li.on a,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.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}/*! +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 button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,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?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 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 table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.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 .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.caption .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 span.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-left.toctree-expand,.wy-menu-vertical li span.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 .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.caption .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 span.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a span.fa-pull-right.toctree-expand,.wy-menu-vertical li span.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 .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.caption .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 span.pull-left.toctree-expand,.wy-menu-vertical li.on a span.pull-left.toctree-expand,.wy-menu-vertical li span.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .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.caption .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 span.pull-right.toctree-expand,.wy-menu-vertical li.on a span.pull-right.toctree-expand,.wy-menu-vertical li span.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 span.toctree-expand:before,.wy-menu-vertical li.on 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-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 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-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 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 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 span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li span.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .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 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 span.toctree-expand:before,.wy-menu-vertical li.on a span.toctree-expand:before,.wy-menu-vertical li span.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 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 table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on a span.toctree-expand,.wy-menu-vertical li a span.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .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 table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li span.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 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.caption .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a span.toctree-expand,.btn .wy-menu-vertical li.on a span.toctree-expand,.btn .wy-menu-vertical li span.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .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.caption .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a span.toctree-expand,.nav .wy-menu-vertical li.on a span.toctree-expand,.nav .wy-menu-vertical li span.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .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.caption .btn .headerlink,.rst-content p.caption .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 span.toctree-expand,.wy-menu-vertical li.current>a .btn span.toctree-expand,.wy-menu-vertical li.current>a .nav span.toctree-expand,.wy-menu-vertical li .nav span.toctree-expand,.wy-menu-vertical li.on a .btn span.toctree-expand,.wy-menu-vertical li.on a .nav span.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .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.caption .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 span.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .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.caption .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 span.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 .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.caption .btn .fa-large.headerlink,.rst-content p.caption .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 span.fa-large.toctree-expand,.wy-menu-vertical li .nav span.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 .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.caption .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 span.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .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.caption .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 span.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 .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.caption .btn .fa-spin.headerlink,.rst-content p.caption .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 span.fa-spin.toctree-expand,.wy-menu-vertical li .nav span.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 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.caption .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li span.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 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.caption .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 span.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 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.caption .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 span.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .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.caption .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 span.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,.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,.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,.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,.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,.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,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol li,.rst-content ol.arabic li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content ol.arabic li p:last-child,.rst-content ol.arabic 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 li ul li,.rst-content ol.arabic 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 span.toctree-expand{display:block;float:left;margin-left:-1.2em;font-size:.8em;line-height:1.6em;color:#4d4d4d}.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 span.toctree-expand,.wy-menu-vertical li.on a:hover span.toctree-expand{color:grey}.wy-menu-vertical li.current>a span.toctree-expand,.wy-menu-vertical li.on 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: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 span.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover span.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover span.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,.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.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 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 span.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 span.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 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;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}.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 .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.caption .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 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.caption .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 span.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version span.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 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:0}.rst-content div.figure.align-center{text-align:center}.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{user-select:none;pointer-events:none}.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{list-style:lower-alpha}.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>*{margin-top:12px;margin-bottom:12px}.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{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{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{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{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 .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 table>caption .headerlink{visibility:hidden;font-size:14px}.rst-content .code-block-caption .headerlink:after,.rst-content .toctree-wrapper>p.caption .headerlink:after,.rst-content dl dt .headerlink:after,.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content p.caption .headerlink:after,.rst-content table>caption .headerlink:after{content:"\f0c1";font-family:FontAwesome}.rst-content .code-block-caption:hover .headerlink:after,.rst-content .toctree-wrapper>p.caption:hover .headerlink:after,.rst-content dl dt:hover .headerlink:after,.rst-content h1:hover .headerlink:after,.rst-content h2: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 p.caption:hover .headerlink:after,.rst-content table>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: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%}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 dt span.classifier:before{content:" : "}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}.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,html.writer-html4 .rst-content dl:not(.docutils) tt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) code,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) tt{font-weight:700}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}.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 + */@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;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.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 p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.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.citation,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.citation>dt,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.citation>dt:after,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.citation>dd,html.writer-html5 .rst-content dl.citation>dt,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.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,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.citation>dt>span.brackets,html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{font-style:italic}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content dl.citation,.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content dl.citation code,.rst-content dl.citation tt,.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{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;overflow-wrap:normal}.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}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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(.citation):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(.citation):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(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>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(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>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(.citation):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(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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(.citation):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(.citation):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(.citation):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(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):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 :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.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/build/html/_static/doctools.js b/build/html/_static/doctools.js index 8cbf1b1..527b876 100644 --- a/build/html/_static/doctools.js +++ b/build/html/_static/doctools.js @@ -2,322 +2,155 @@ * doctools.js * ~~~~~~~~~~~ * - * Sphinx JavaScript utilities for all documentation. + * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * 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) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } }, - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, /** - * add context elements like header anchor links + * helper function to focus on search bar */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + * Initialise the domain index toggle buttons */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('