Repository: alienbrett/PyAlly (language: python)

Issue:
Issue setting Environment Variables?
Hey alienbrett,

I'm trying to get into API's specifically for Ally and I stumbled onto your python API which looks awesome. Everything is almost running but thought that it would be helpful to know when setting the environment variables, the export ALLY_OATH_TOKEN should be ALLY_OA**U**TH_TOKEN and same thing goes for the oauth secret (on the website the U is missing). Also, when looking at the code for __init__.py there is a repeat of the ALLY_CONSUMER_KEY of which I've attached a picture. Let me know what you think.

![Capture](https://user-images.githubusercontent.com/48224720/70597144-96b9a200-1bb5-11ea-96da-3420595cb9e0.PNG)



Discussion / hints:
There was a mismatch between the environment params in the code vs in the readme. I have updated the readme, just use ALLY_OA**U**TH_... in the environment. Please let me know if this was not patched through for you yet

Fix patch:
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 00000000..32c9f029
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,15 @@
+name: Lint Source Code
+on: [pull_request]
+jobs:
+  lint:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout Source Code
+        uses: actions/checkout@v2
+      - name: Set up Python
+        uses: actions/setup-python@v2
+      - name: Lint (black)
+        uses: psf/black@stable
+        with:
+          args: "./ally --check"
+
diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml
new file mode 100644
index 00000000..7aa61739
--- /dev/null
+++ b/.github/workflows/publish.yml
@@ -0,0 +1,23 @@
+name: Publish Python Package
+on:
+  release:
+    types: [created]
+jobs:
+  publish:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout Source Code
+        uses: actions/checkout@v2
+      - name: Set up Python
+        uses: actions/setup-python@v2
+      - name: Install tools
+        run: |
+          python -m pip install --upgrade pip setuptools wheel
+          pip install --upgrade twine
+      - name: Build
+        run: python setup.py sdist bdist_wheel
+      - name: Publish
+        env:
+          TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
+          TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
+        run: twine upload dist/*
diff --git a/.github/workflows/pythonpublish.yml b/.github/workflows/pythonpublish.yml
deleted file mode 100644
index d5f3859d..00000000
--- a/.github/workflows/pythonpublish.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-# This workflows will upload a Python Package using Twine when a release is created
-# For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries
-
-name: Upload Python Package
-
-on:
-  release:
-    types: [created]
-
-jobs:
-  deploy:
-
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v2
-    - name: Set up Python
-      uses: actions/setup-python@v1
-      with:
-        python-version: '3.x'
-    - name: Install dependencies
-      run: |
-        python -m pip install --upgrade pip
-        pip install setuptools wheel twine
-    - name: Build and publish
-      env:
-        TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }}
-        TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }}
-      run: |
-        python setup.py sdist bdist_wheel
-        twine upload dist/*
diff --git a/.gitignore b/.gitignore
index 4f9a4972..ee5de740 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,7 +2,6 @@
 *.swp
 *.log
 *.json
-*.png
 *.ipynb
 *.ipynb_checkpoints
 *.ipynb_checkpoints/
@@ -17,3 +16,4 @@ pyally.egg-info/
 pyally.egg-info/*
 venv/
 sphinx/_build/
+.mypy_cache
diff --git a/Makefile b/Makefile
new file mode 100644
index 00000000..01e50a49
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,37 @@
+# global python binary
+PYTHON_BIN = $(shell which python3)
+
+# virtual env directories and binaries
+VENV_DIR        = venv
+VENV_PYTHON_BIN = $(VENV_DIR)/bin/python
+PIP_BIN         = $(VENV_DIR)/bin/pip
+BLACK_BIN       = $(VENV_DIR)/bin/black
+TWINE_BIN       = $(VENV_DIR)/bin/twine
+
+.PHONY: lint test build docs deploy
+
+# setup dev environment, eg. `make venv`
+$(VENV_DIR): requirements.txt requirements.dev.txt
+	test -d $(VENV_DIR) || $(PYTHON_BIN) -m venv $(VENV_DIR) && $(PIP_BIN) install -U pip setuptools wheel
+	$(PIP_BIN) install -r requirements.txt
+	$(PIP_BIN) install -r requirements.dev.txt
+	touch $(VENV_DIR)
+
+lint:
+	$(BLACK_BIN) .
+
+test: ally/tests.py
+	$(VENV_PYTHON_BIN) ally/tests.py
+
+build:
+	$(VENV_PYTHON_BIN) setup.py sdist bdist_wheel
+
+docs:
+	rm -rf docs
+	mkdir docs
+	cd sphinx && make clean && make html
+	cp -a sphinx/_build/html/ docs
+	touch docs/.nojekyll
+
+deploy:
+	$(TWINE_BIN) upload dist/*
diff --git a/README.md b/README.md
index 8dc8db38..ab036391 100644
--- a/README.md
+++ b/README.md
@@ -11,7 +11,6 @@ After setting up API keys, PyAlly can provide the basic/essential Ally brokerage
 
 Make sure to [read the docs](https://alienbrett.github.io/PyAlly)!
 
-
 ## Version 1.1.2
 
 The lastest redesign preserves many features of the old interface, and incorporates a few new ones.
@@ -36,7 +35,29 @@ articles has had trouble suppling some information.
 * Multi-leg orders
 
 
+## Dev Environment Setup
+
+To setup your dev environment, simply run:
+
+```bash
+make venv # run once
+source venv/bin/activate # run for every new terminal
+```
+
+This will install the library requirements for debugging as well as some useful tools to lint, test, build, document, and deploy. See the `Makefile` for a list of useful targets.
+
+### Dev Environment Teardown
+
+To exit the dev environment, simply run:
+
+```bash
+deactivate
+```
+or `exit` / `logout` your terminal.
+
+### Fixing Your Dev Environment
 
+If your dev environment gets hosed, exit it, remove the `venv` directory, and run the setup above again.
 
 ## Contributors
 * [Brett Graves](https://github.com/alienbrett)
@@ -46,6 +67,7 @@ articles has had trouble suppling some information.
 * [Tianyu](https://github.com/Tianyu00)
 * [Salient](https://github.com/Salient)
 * [Matt Margolin](https://github.com/mm0)
+* [Alex Kennedy](https://github.com/LaikaN57)
 
 Message me on Github or [send an email](mailto:alienbrett648@gmail.com) if you enjoyed the project or thought it could be improved. I do my best to code with quality but sometimes it is easier said than done. Anyone with an interest with an eye for detail is welcome to contribute.
 
diff --git a/ally/Account/__init__.py b/ally/Account/__init__.py
index 3c8bcc93..4cdc01a1 100644
--- a/ally/Account/__init__.py
+++ b/ally/Account/__init__.py
@@ -20,7 +20,7 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from .holdings	import holdings
-from .balances	import balances
-from .history	import history
-from .accounts	import accounts
+from .accounts import accounts
+from .balances import balances
+from .history import history
+from .holdings import holdings
diff --git a/ally/Account/accounts.py b/ally/Account/accounts.py
index de837a40..2448930c 100644
--- a/ally/Account/accounts.py
+++ b/ally/Account/accounts.py
@@ -20,78 +20,59 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AccountEndpoint, RequestType
-from .utils		import _dot_flatten
+from ..Api import AccountEndpoint, RequestType
+from .utils import _dot_flatten
 
 
+class Accounts(AccountEndpoint):
+    _type = RequestType.Info
+    _resource = "accounts.json"
 
-class Accounts ( AccountEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'accounts.json'
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        accounts = response["accounts"]
 
+        d = {k: v for k, v in _dot_flatten(accounts).items()}
+        return d
 
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
+        # Wrap these in lists so that they can be read by pandas
+        raw = {k: [v] for k, v in raw.items()}
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		accounts = response['accounts']
+        return pd.DataFrame.from_dict(raw)
 
-		d = {
-			k: v
-			for k,v in _dot_flatten( accounts ).items()
-		}
-		return d
 
+def accounts(self, dataframe: bool = True, block: bool = True):
+    """Gets list of available accounts, and some basic metrics for each one.
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+    Calls the 'accounts.json' endpoint to get the current list of accounts.
+    This includes account number, cash account balances, and P/L.
 
-		# Wrap these in lists so that they can be read by pandas
-		raw = { k: [v] for k,v in raw.items() }
+    Args:
 
-		return pd.DataFrame.from_dict ( raw )
+            dataframe: Specify an output format
+            block: Specify whether to block thread if request exceeds rate limit
 
 
+    Returns:
 
+            A pandas dataframe by default,
+                    otherwise a flat dictionary.
 
+    Raises:
 
+            RateLimitException: If block=False, rate limit problems will be raised
+    """
+    result = Accounts(auth=self.auth, block=block).request()
 
+    if dataframe:
+        try:
+            result = Accounts.DataFrame(result)
+        except:
+            pass
 
-def accounts ( self, dataframe: bool = True, block: bool = True ):
-	"""Gets list of available accounts, and some basic metrics for each one.
-
-	Calls the 'accounts.json' endpoint to get the current list of accounts.
-	This includes account number, cash account balances, and P/L.
-
-	Args:
-
-		dataframe: Specify an output format
-		block: Specify whether to block thread if request exceeds rate limit
-
-
-	Returns:
-
-		A pandas dataframe by default,
-			otherwise a flat dictionary.
-
-	Raises:
-
-		RateLimitException: If block=False, rate limit problems will be raised
-	"""
-	result = Accounts(
-		auth = self.auth,
-		block = block
-	).request()
-
-
-	if dataframe:
-		try:
-			result = Accounts.DataFrame ( result )
-		except:
-			pass
-
-	return result
-
+    return result
diff --git a/ally/Account/balances.py b/ally/Account/balances.py
index ae2f8de9..168541b7 100644
--- a/ally/Account/balances.py
+++ b/ally/Account/balances.py
@@ -20,79 +20,61 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AccountEndpoint, RequestType
-from .utils		import _dot_flatten
+from ..Api import AccountEndpoint, RequestType
+from .utils import _dot_flatten
 
 
+class Balances(AccountEndpoint):
+    _type = RequestType.Info
+    _resource = "accounts/{0}/balances.json"
 
-class Balances ( AccountEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'accounts/{0}/balances.json'
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        balances = response["accountbalance"]
 
+        d = {k: v for k, v in _dot_flatten(balances).items()}
+        return d
 
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
+        # Wrap these in lists so that they can be read by pandas
+        raw = {k: [v] for k, v in raw.items()}
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		balances = response['accountbalance']
+        return pd.DataFrame.from_dict(raw)
 
-		d = {
-			k: v
-			for k,v in _dot_flatten( balances ).items()
-		}
-		return d
 
+def balances(self, dataframe: bool = True, block: bool = True):
+    """Gets current cash and various account metrics.
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+    Calls the 'accounts/./balances.json' endpoint to get the current list of balances.
+    This includes margin amounts, cash, etc.
 
-		# Wrap these in lists so that they can be read by pandas
-		raw = { k: [v] for k,v in raw.items() }
+    Args:
 
-		return pd.DataFrame.from_dict ( raw )
+            dataframe: Specify an output format
+            block: Specify whether to block thread if request exceeds rate limit
 
 
+    Returns:
 
+            A pandas dataframe with 1 row by default,
+                    otherwise a flat dictionary.
 
+    Raises:
 
+            RateLimitException: If block=False, rate limit problems will be raised
+    """
+    result = Balances(
+        auth=self.auth, account_nbr=self.account_nbr, block=block
+    ).request()
 
+    if dataframe:
+        try:
+            result = Balances.DataFrame(result)
+        except:
+            pass
 
-def balances ( self, dataframe: bool = True, block: bool = True ):
-	"""Gets current cash and various account metrics.
-
-	Calls the 'accounts/./balances.json' endpoint to get the current list of balances.
-	This includes margin amounts, cash, etc.
-
-	Args:
-
-		dataframe: Specify an output format
-		block: Specify whether to block thread if request exceeds rate limit
-
-
-	Returns:
-
-		A pandas dataframe with 1 row by default,
-			otherwise a flat dictionary.
-
-	Raises:
-
-		RateLimitException: If block=False, rate limit problems will be raised
-	"""
-	result = Balances(
-		auth = self.auth,
-		account_nbr = self.account_nbr,
-		block = block
-	).request()
-
-
-	if dataframe:
-		try:
-			result = Balances.DataFrame ( result )
-		except:
-			pass
-
-	return result
-
+    return result
diff --git a/ally/Account/history.py b/ally/Account/history.py
index 30cde5f1..6b35491c 100644
--- a/ally/Account/history.py
+++ b/ally/Account/history.py
@@ -20,181 +20,128 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AccountEndpoint, RequestType
-from .utils		import _dot_flatten
+from ..Api import AccountEndpoint, RequestType
 
 
+class History(AccountEndpoint):
+    _type = RequestType.Info
+    _resource = "accounts/{0}/history.json"
 
+    @staticmethod
+    def _process(entry):
+        """Process a single transaction, into
+        the format that's most useful
+        """
 
+        t = entry["transaction"]
 
+        # Get the consistent trading symbol
+        x = {}
+        x["sectyp"] = t["security"]["sectyp"]
 
-class History ( AccountEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'accounts/{0}/history.json'
+        if x["sectyp"] == "OPT":
+            # Process this option
+            x["symbol"] = t["security"]["id"]
 
+        elif x["sectyp"] == "CS":
+            # Process stock
+            x["symbol"] = t["security"]["sym"]
 
-	@staticmethod
-	def _process ( entry ):
-		"""Process a single transaction, into
-		the format that's most useful
-		"""
+        else:
+            # Something else, cash transfer or dividend likely
+            x["symbol"] = None
 
-		t = entry['transaction']
+        x["cusip"] = t["security"]["cusip"]
 
+        # Register the human-readable transaction type
+        #  buy, sell, short or cover
+        side = t["side"]
+        accttyp = t["accounttype"]
 
+        if entry["activity"] == "Trade":
+            if side == "1":
+                if accttyp == "5":
+                    x["transactiontype"] = "buy"
+                else:
+                    x["transactiontype"] = "buy to cover"
 
-		# Get the consistent trading symbol
-		x = { }
-		x['sectyp'] = t['security']['sectyp']
+            elif side == "2":
+                x["transactiontype"] = "sell"
 
-		if x['sectyp'] == 'OPT':
-			# Process this option
-			x['symbol'] = t['security']['id']
+            elif side == "5":
+                x["transactiontype"] = "short sell"
 
+        # Modify the trade date to something actually useful
+        entry["date"] = entry["date"][:10]
 
-		elif x['sectyp'] == 'CS':
-			# Process stock
-			x['symbol'] = t['security']['sym']
+        # Pull some of these values out of transaction
+        for i in ("source", "settlementdate", "transactionid", "security", "tradedate"):
+            entry["transaction"].pop(i)
 
+        # Now plop them down into the root
+        entry = {**entry, **entry["transaction"]}
 
-		else:
-			# Something else, cash transfer or dividend likely
-			x['symbol'] = None
+        # Now delete transaction
+        entry.pop("transaction")
 
+        # Now combine our values with entry's values
+        return {**entry, **x}
 
-		x['cusip'] = t['security']['cusip']
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        history = response["transactions"]["transaction"]
 
+        return [History._process(x) for x in history]
 
-		# Register the human-readable transaction type
-		#  buy, sell, short or cover
-		side	= t['side']
-		accttyp	= t['accounttype']
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
+        params = {"range": kwargs.get("range_"), "transactions": kwargs.get("type_")}
+        data = None
+        return params, data
 
-		if entry['activity'] == 'Trade':
-			if side == '1':
-				if accttyp == '5':
-					x['transactiontype']	= 'buy'
-				else:
-					x['transactiontype']	= 'buy to cover'
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
-			elif side == '2':
-				x['transactiontype']		= 'sell'
+        # Create dataframe from our dataset
+        df = pd.DataFrame(raw).apply(
+            # And also cast relevent fields to numeric values
+            pd.to_numeric,
+            errors="ignore",
+        )
+        df["date"] = pd.to_datetime(df["date"])
+        return df
 
-			elif side == '5':
-				x['transactiontype']		 = 'short sell'
 
+def history(self, dataframe: bool = True, block: bool = True):
+    """Gets the transaction history for the account.
 
+    Calls the 'accounts/./history.json' endpoint to get list of all trade
+    and cash  movement history for an account. This includes dividends, cash
+    deposits and withdrawals, and all trades, including pricing information about
+    each trade.
 
-		# Modify the trade date to something actually useful
-		entry['date'] = entry['date'][:10]
+    Args:
+            dataframe: Specify an output format
+            block: Specify whether to block thread if request exceeds rate limit
 
+    Returns:
+            Default: Pandas dataframe
+            Otherwise: flat list of dictionaries
 
-		# Pull some of these values out of transaction
-		for i in (
-			'source','settlementdate',
-			'transactionid','security',
-			'tradedate'
-		):
-			entry['transaction'].pop( i )
+    Raises:
+            RateLimitException: If block=False, rate limit problems will be raised
 
+    """
+    result = History(
+        auth=self.auth, account_nbr=self.account_nbr, block=block
+    ).request()
 
-		# Now plop them down into the root
-		entry = { ** entry, ** entry['transaction'] }
+    if dataframe:
+        try:
+            result = History.DataFrame(result)
+        except:
+            pass
 
-
-		# Now delete transaction
-		entry.pop('transaction')
-
-
-		# Now combine our values with entry's values
-		return { **entry, **x }
-
-
-
-
-
-
-
-
-
-
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		history = response['transactions']['transaction']
-
-
-		return [ History._process ( x ) for x in history ]
-
-
-
-
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		params = {
-			'range': kwargs.get('range_'),
-			'transactions':kwargs.get('type_')
-		}
-		data = None
-		return params, data
-
-
-
-
-
-
-
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
-
-		# Create dataframe from our dataset
-		df = pd.DataFrame( raw ).apply(
-			# And also cast relevent fields to numeric values
-			pd.to_numeric,
-			errors='ignore'
-		)
-		df['date'] = pd.to_datetime(df['date'])
-		return df
-
-
-
-
-
-
-def history ( self, dataframe: bool = True, block: bool = True ):
-	"""Gets the transaction history for the account.
-
-	Calls the 'accounts/./history.json' endpoint to get list of all trade
-	and cash  movement history for an account. This includes dividends, cash
-	deposits and withdrawals, and all trades, including pricing information about
-	each trade.
-
-	Args:
-		dataframe: Specify an output format
-		block: Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		Default: Pandas dataframe
-		Otherwise: flat list of dictionaries
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	"""
-	result = History(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		block		= block
-	).request()
-
-
-	if dataframe:
-		try:
-			result = History.DataFrame ( result )
-		except:
-			pass
-
-	return result
+    return result
diff --git a/ally/Account/holdings.py b/ally/Account/holdings.py
index 249c4931..fb7efa36 100644
--- a/ally/Account/holdings.py
+++ b/ally/Account/holdings.py
@@ -24,94 +24,74 @@
 from ..utils import option_format
 
 
+class Holdings(AccountEndpoint):
+    _type = RequestType.Info
+    _resource = "accounts/{0}/holdings.json"
 
+    @staticmethod
+    def _flatten_holding(holding):
 
+        # Process options
+        if holding["instrument"]["sectyp"] == "OPT":
 
+            op = holding["instrument"]
 
-class Holdings ( AccountEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'accounts/{0}/holdings.json'
+            holding["sym"] = option_format(
+                symbol=op["sym"],
+                exp_date=op["matdt"][:10],  # '2020-06-19T00:00:00-04:00'
+                strike=op["strkpx"],
+                direction="P" if op["putcall"] == "0" else "C",
+            )
 
+        else:
+            holding["sym"] = holding["instrument"]["sym"]
 
-	@staticmethod
-	def _flatten_holding ( holding ):
+        holding["lastprice"] = holding["quote"]["lastprice"]
 
+        holding.pop("instrument")
+        holding.pop("quote")
 
-		# Process options
-		if holding['instrument']['sectyp'] == 'OPT':
+        return holding
 
-			op = holding['instrument']
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        holdings = response["accountholdings"]["holding"]
+        if not isinstance(holdings, list):
+            holdings = [holdings]
 
-			holding['sym'] = option_format (
-				symbol		= op['sym'],
-				exp_date	= op['matdt'][:10], # '2020-06-19T00:00:00-04:00'
-				strike		= op['strkpx'],
-				direction	= 'P' if op['putcall'] == '0' else 'C'
-			)
+        return list(map(Holdings._flatten_holding, holdings))
 
-		else:
-			holding['sym'] = holding['instrument']['sym']
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
+        return pd.DataFrame(raw)
 
 
-		holding['lastprice'] = holding['quote']['lastprice']
+def holdings(self, dataframe: bool = True, block: bool = True):
+    """Gets all current account holdings.
 
-		holding.pop('instrument')
-		holding.pop('quote')
+    Calls the 'accounts/./history.json' endpoint to get list of all current account
+    holdings, including stocks and options. This also includes current market value,
+    cost of acquisition, etc.
 
-		return holding
+    Args:
+            dataframe: Specify an output format
+            block: Specify whether to block thread if request exceeds rate limit
 
+    Returns:
+            A pandas dataframe by default,
+                    otherwise a flat list of dictionaries.
+    """
+    result = Holdings(
+        auth=self.auth, account_nbr=self.account_nbr, block=block
+    ).request()
 
+    if dataframe:
+        try:
+            result = Holdings.DataFrame(result)
+        except:
+            pass
 
-
-
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		holdings = response['accountholdings']['holding']
-		if not isinstance(holdings, list):
-			holdings = [holdings]
-
-		return list( map( Holdings._flatten_holding, holdings ) )
-
-
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
-		return pd.DataFrame( raw )
-
-
-
-
-
-
-def holdings ( self, dataframe: bool = True, block: bool = True ):
-	"""Gets all current account holdings.
-
-	Calls the 'accounts/./history.json' endpoint to get list of all current account
-	holdings, including stocks and options. This also includes current market value,
-	cost of acquisition, etc.
-
-	Args:
-		dataframe: Specify an output format
-		block: Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		A pandas dataframe by default,
-			otherwise a flat list of dictionaries.
-	"""
-	result = Holdings(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		block		= block
-	).request()
-
-
-	if dataframe:
-		try:
-			result = Holdings.DataFrame ( result )
-		except:
-			pass
-
-	return result
+    return result
diff --git a/ally/Account/utils.py b/ally/Account/utils.py
index 7ff6900b..75251d3e 100644
--- a/ally/Account/utils.py
+++ b/ally/Account/utils.py
@@ -21,32 +21,32 @@
 # SOFTWARE.
 
 
-def _dot_flatten ( d ):
-	"""Flatten a dict into a.b.c. ... for
-	{
-		a: {
-			b: {
-				c: {
-					...
-				}
-			}
-		}
-	}
+def _dot_flatten(d):
+    """Flatten a dict into a.b.c. ... for
+    {
+            a: {
+                    b: {
+                            c: {
+                                    ...
+                            }
+                    }
+            }
+    }
 
-	This method preserves the data grouping in a way,
-		and is usually reversible
-	"""
-	result = {}
+    This method preserves the data grouping in a way,
+            and is usually reversible
+    """
+    result = {}
 
-	for k,v in d.items():
+    for k, v in d.items():
 
-		# append k.z for z in valttened
-		if type(v) == type({}):
-			v = _dot_flatten ( v )
-			for vk,vv in v.items():
-				result['.'.join([k,vk])] = vv
+        # append k.z for z in valttened
+        if type(v) == type({}):
+            v = _dot_flatten(v)
+            for vk, vv in v.items():
+                result[".".join([k, vk])] = vv
 
-		else:
-			result[k] = v
+        else:
+            result[k] = v
 
-	return result
+    return result
diff --git a/ally/Ally.py b/ally/Ally.py
index 9e5da794..60fd200a 100644
--- a/ally/Ally.py
+++ b/ally/Ally.py
@@ -20,173 +20,131 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-"""ally.Ally module.
+"""The ally.Ally module/file.
 
 Controls the Ally() account class, the bread and butter of the library.
 """
 
+from json import load
+from os import environ
 
-from os			import environ
-from json		import load
-from .Auth		import Auth
-from .exception	import ApiKeyException
-from .Api		import setTimeout
-from .Watchlist	import Watchlist
-
-
-
+from .Api import setTimeout
+from .Auth import Auth
+from .exception import ApiKeyException
+from .Watchlist import Watchlist
 
 _all_params = (
-	'ALLY_OAUTH_SECRET',
-	'ALLY_OAUTH_TOKEN',
-	'ALLY_CONSUMER_SECRET',
-	'ALLY_CONSUMER_KEY',
-	'ALLY_ACCOUNT_NBR'
+    "ALLY_OAUTH_SECRET",
+    "ALLY_OAUTH_TOKEN",
+    "ALLY_CONSUMER_SECRET",
+    "ALLY_CONSUMER_KEY",
+    "ALLY_ACCOUNT_NBR",
 )
 
 
-
-
 class Ally:
+    # No docstring
+    """The ally.Ally.Ally class.
 
-	# No docstring
-	""
-
-	from .Account	import (
-		holdings,
-		balances,
-		history,
-		accounts
-	)
-	from .Info		import clock, status
-	from .Order		import submit, orders
-	from .Quote		import quote, stream, timesales, toplists
-	from .Option	import strikes, expirations, search
-	from .News		import searchNews, lookupNews
-
-
-
-	auth = None
-	account_nbr = None
-
-	def _param_load_environ (self):
-		"""Try to use environment params
-		Account number is now mandatory
-		"""
-		params = {}
-		for t in _all_params:
-			params[t] = environ.get(t,None)
-		return params
-
-
-	def _param_load_file (self, fname):
-		"""Try to load params from a json file
-		Account number is now mandatory
-		"""
-		with open(fname, 'r') as f:
-			return load(f)
-
-
-
-
-
-	def __init__ ( self, params = None, timeout : float = 1.0 ):
-		"""Manages all facets of your Ally Invest account.
-
-		Manage your account
-			Track the current and past state of your account. Visit the Account_ page for full details.
-
-			* Balances (gets all current cash and margin balances)
-
-			* History (gets full history of all trades, dividends, and cash transfers of the account)
-
-			* Holdings (gets list of all currently-held non-cash positions, and profitability information)
-
-		Get quotes
-			Specified in-detail in Quotes_. Supports 3 types of quote-gathering:
-
-			* Real-time quotes
-
-			* Timesales (historical intraday prices over rolling 5 day window)
-
-			* Quote Streaming (get quotes for up to 256 symbols in real-time, as prices update)
-
-		Place trades
-			Trades can be placed, modified (after being created locally, and even after submitting), or cancelled.
-			Order objects described in Trading_ in detail.
-
-
-		Arguments:
-			``timeout``: float, number of seconds to wait before failing unresponsive api call
-
-			``params``: provide keys in the form of:
-
-				#. A dictionary: { ALLY_OAUTH_SECRET: ...}
-
-				#. A string: (filename to json file containing api keys)
-
-				#. None (default): Grab the api keys from environment variables
-
-				For any of the mediums above, be sure to provide all of the keys:
-
-	.. code-block:: python
-
-				params = {
-					'ALLY_OAUTH_SECRET': ...,
-					'ALLY_OAUTH_TOKEN': ...,
-					'ALLY_CONSUMER_SECRET': ...,
-					'ALLY_CONSUMER_KEY': ...,
-					'ALLY_ACCOUNT_NBR': ...
-				}
+    This is the main class for this library.
+    """
 
+    from .Account import accounts, balances, history, holdings
+    from .Info import clock, status
+    from .News import lookupNews, searchNews
+    from .Option import expirations, optionSearchQuery, search, strikes
+    from .Order import orders, submit
+    from .Quote import quote, stream, timesales, toplists
 
+    auth = None
+    account_nbr = None
 
+    def _param_load_environ(self):
+        """Try to use environment params.
 
+        Account number is now mandatory."""
+        params = {}
+        for t in _all_params:
+            params[t] = environ.get(t, None)
+        return params
 
-	.. py:module:: ally.Ally
+    def _param_load_file(self, fname):
+        """Try to load params from a json file.
 
-	.. _Trading: trading.html
-	.. _Quotes: quotes.html
-	.. _Account: account.html
-		"""
+        Account number is now mandatory."""
+        with open(fname, "r") as f:
+            return load(f)
 
+    def __init__(self, params=None, timeout: float = 1.0):
+        """Manages all facets of your Ally Invest account.
 
+        Manage your account
+            Track the current and past state of your account. Visit the Account_ page for full details.
 
-		# We were passed an actual dictionary
-		if type(params) == type({}):
-			pass
+            * Balances (gets all current cash and margin balances)
+            * History (gets full history of all trades, dividends, and cash transfers of the account)
+            * Holdings (gets list of all currently-held non-cash positions, and profitability information)
 
+        Get quotes
+            Specified in-detail in Quotes_. Supports 3 types of quote-gathering:
 
+            * Real-time quotes
+            * Timesales (historical intraday prices over rolling 5 day window)
+            * Quote Streaming (get quotes for up to 256 symbols in real-time, as prices update)
 
-		# We were passed a JSON file
-		elif type(params) == type(""):
-			params = self._param_load_file(params)
+        Place trades
+            Trades can be placed, modified (after being created locally, and even after submitting), or cancelled. Order objects described in Trading_ in detail.
 
+        Arguments:
+            timeout (float): number of seconds to wait before failing unresponsive api call
+            params: provide keys in the form of:
 
-		# Use environment variables
-		else:
-			params = self._param_load_environ()
+                #. A dictionary: { ALLY_OAUTH_SECRET: ...}
+                #. A string: (filename to json file containing api keys)
+                #. None (default): Grab the api keys from environment variables
 
+                For any of the mediums above, be sure to provide all of the keys:
 
-		# Check that we have all the parameters we need
-		for t in _all_params:
-			if params.get(t,None) is None:
-				raise ApiKeyException ( '{0} parameter not provided'.format(t) )
+                .. code-block:: python
 
+                    params = {
+                        'ALLY_OAUTH_SECRET': ...,
+                        'ALLY_OAUTH_TOKEN': ...,
+                        'ALLY_CONSUMER_SECRET': ...,
+                        'ALLY_CONSUMER_KEY': ...,
+                        'ALLY_ACCOUNT_NBR': ...
+                    }
 
-		# Create the auth that we want
-		#  This is the only tidbit that actually
-		#   needs these parameters anyways
-		self.auth = Auth(params)
+        .. _Trading: trading.html
+        .. _Quotes: quotes.html
+        .. _Account: account.html
+        """
 
-		# But keep account number
-		self.account_nbr = params['ALLY_ACCOUNT_NBR']
+        # We were passed an actual dictionary
+        if type(params) == type({}):
+            pass
 
+        # We were passed a JSON file
+        elif type(params) == type(""):
+            params = self._param_load_file(params)
 
-		# Watchlist gets copy of our object
-		#  this is so that it can manage its own api calls
-		self.watchlists = Watchlist( self )
+        # Use environment variables
+        else:
+            params = self._param_load_environ()
 
+        # Check that we have all the parameters we need
+        for t in _all_params:
+            if params.get(t, None) is None:
+                raise ApiKeyException("{0} parameter not provided".format(t))
 
+        # Create the auth that we want
+        #  This is the only tidbit that actually
+        #   needs these parameters anyways
+        self.auth = Auth(params)
 
+        # But keep account number
+        self.account_nbr = params["ALLY_ACCOUNT_NBR"]
 
+        # Watchlist gets copy of our object
+        #  this is so that it can manage its own api calls
+        self.watchlists = Watchlist(self)
diff --git a/ally/Api.py b/ally/Api.py
index 0b9da491..79765070 100644
--- a/ally/Api.py
+++ b/ally/Api.py
@@ -32,224 +32,168 @@
 	* should be object method
 
 """
-from requests				import Request, Session
-from requests.exceptions	import HTTPError,Timeout
-from .						import RateLimit
-from .classes				import RequestType
-from .utils					import (
-	pretty_print_POST,
-	JSONStreamParser
-)
+
 import datetime
 import json
 
+from requests import Request, Session
+from requests.exceptions import HTTPError, Timeout
 
-
-
+from . import RateLimit
+from .classes import RequestType
+from .utils import JSONStreamParser, pretty_print_POST
 
 # Global timeout variable
 _timeout = 1.0
 
-def setTimeout ( t ):
-	"""Sets the global request response timeout variable
-	"""
-	if t is not None:
-		_timeout = float(t)
-
-
-
-
-
 
+def setTimeout(t):
+    """Sets the global request response timeout variable"""
+    if t is not None:
+        _timeout = float(t)
 
 
 class Endpoint:
-	"""Base abstract module from which all other account endpoints inherit.
-	"""
-
-	# Host
-	_host = 'https://api.tradeking.com/v1/'
-
-	# One of RequestType
-	_type = None
-
-	# Extension
-	_resource = ''
-
-	# GET, POST, etc.
-	_method	= 'GET'
-
-	# results
-	_results = None
-
-	req = None
-
-
-
-
-
-	@classmethod
-	def url ( cls ):
-		return cls._host + cls._resource
-
-
-
-
-
-	@classmethod
-	def resolve ( cls, **kwargs):
-		"""Can insert account information into the url
-		This is just a placeholder
-		"""
-		return cls.url()
-
-
-
-
-
-
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		return response.json().get('response')
-
-
-
-
-
-
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		return None, None
-
-
-
-
-
-	def request ( self=None, block: bool =True ):
-		"""Gets data from API server.
-
-		Args:
-
-			block: specify whether to block on rate limit exhaustion or raise exception
-
-		Raises:
-
-			ally.exceptions.RateLimitException: if 429 or we expect 429 encountered
-		"""
+    """Base abstract module from which all other account endpoints inherit."""
 
-		# Let ratelimit handle raise or block
-		RateLimit.check ( self._type, block=block )
+    # Host
+    _host = "https://api.tradeking.com/v1/"
 
-		# use current session instance to send prepared request
-		x = self.s.send(self.req)
+    # One of RequestType
+    _type = None
 
-		# Did Ally just complain?
-		if x.status_code == 429:
-			RateLimit.force_update ( self._type )
-		else:
+    # Extension
+    _resource = ""
 
-			# All errors, including as noted
-			x.raise_for_status()
+    # GET, POST, etc.
+    _method = "GET"
 
-			# Give the rate manager the information we learned
-			RateLimit.normal_update ( dict(x.headers), self._type )
+    # results
+    _results = None
 
-			return self.extract ( x )
+    req = None
 
+    @classmethod
+    def url(cls):
+        return cls._host + cls._resource
 
+    @classmethod
+    def resolve(cls, **kwargs):
+        """Can insert account information into the url
+        This is just a placeholder
+        """
+        return cls.url()
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        return response.json().get("response")
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
+        return None, None
 
-	def __init__ ( self, auth = None, **kwargs ):
-		"""Create and send request
-		Return the processed result
-		"""
+    def request(self=None, block: bool = True):
+        """Gets data from API server.
 
-		# Get post and get data
-		send_params, send_data = self.req_body (**kwargs)
+        Args:
 
+                block: specify whether to block on rate limit exhaustion or raise exception
 
-		# Get the session
-		if auth is not None:
-			self.s = auth.sess
-		else:
-			self.s = Session()
+        Raises:
 
+                ally.exceptions.RateLimitException: if 429 or we expect 429 encountered
+        """
 
-		req_auth = None if auth is None else auth.auth
+        # Let ratelimit handle raise or block
+        RateLimit.check(self._type, block=block)
 
-		# Create a prepped request
-		self.req = self.s.prepare_request(
-			Request(
-				self._method,
-				self.resolve( **kwargs ),
-				auth	= req_auth,
-				params	= send_params,
-				data	= send_data
-			)
-		)
+        # use current session instance to send prepared request
+        x = self.s.send(self.req)
 
+        # Did Ally just complain?
+        if x.status_code == 429:
+            RateLimit.force_update(self._type)
+        else:
 
+            # All errors, including as noted
+            x.raise_for_status()
 
+            # Give the rate manager the information we learned
+            RateLimit.normal_update(dict(x.headers), self._type)
 
+            return self.extract(x)
 
+    def __init__(self, auth=None, **kwargs):
+        """Create and send request
+        Return the processed result
+        """
 
-class AuthenticatedEndpoint ( Endpoint ):
-	"""Simple class, just require auth. Non-auth is non-optional
-	"""
-	def __init__ ( self, auth, **kwargs ):
-		"""Create and send request
-		Return the processed result
-		"""
-		super().__init__(auth,**kwargs)
+        # Get post and get data
+        send_params, send_data = self.req_body(**kwargs)
 
+        # Get the session
+        if auth is not None:
+            self.s = auth.sess
+        else:
+            self.s = Session()
 
+        req_auth = None if auth is None else auth.auth
 
+        # Create a prepped request
+        self.req = self.s.prepare_request(
+            Request(
+                self._method,
+                self.resolve(**kwargs),
+                auth=req_auth,
+                params=send_params,
+                data=send_data,
+            )
+        )
 
 
+class AuthenticatedEndpoint(Endpoint):
+    """Simple class, just require auth. Non-auth is non-optional"""
 
+    def __init__(self, auth, **kwargs):
+        """Create and send request
+        Return the processed result
+        """
+        super().__init__(auth, **kwargs)
 
-class AccountEndpoint ( AuthenticatedEndpoint ):
-	"""Authenticated endpoint + account information
-	"""
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		"""
-		return self.url().format(kwargs.get('account_nbr'))
 
+class AccountEndpoint(AuthenticatedEndpoint):
+    """Authenticated endpoint + account information"""
 
+    def resolve(self, **kwargs):
+        """Inject the account number into the call"""
+        return self.url().format(kwargs.get("account_nbr"))
 
 
+class StreamEndpoint(AuthenticatedEndpoint):
+    """Streams an endpoint."""
 
+    _host = "https://stream.tradeking.com/v1/"
 
-class StreamEndpoint ( AuthenticatedEndpoint ):
-	"""Streams an endpoint.
-	"""
-	_host		= 'https://stream.tradeking.com/v1/'
-	def request ( self=None ):
-		"""Execute an entire loop, and aggregate results
-		"""
+    def request(self=None):
+        """Execute an entire loop, and aggregate results"""
 
-		# use current session instance to send prepared request
-		x = self.s.send(self.req,stream=True)
+        # use current session instance to send prepared request
+        x = self.s.send(self.req, stream=True)
 
-		x.raise_for_status()
+        x.raise_for_status()
 
-		p = JSONStreamParser()
+        p = JSONStreamParser()
 
-		for chunk in x.iter_content( chunk_size=1 ):
-			it = p.stream(chunk.decode('utf-8'))
-			while True:
-				try:
-					row = next(it)
-				except StopIteration:
-					pass
-				else:
-					quote = row.get('quote')
-					if quote is not None:
-						yield quote
-				finally:
-					del it
-					break
+        for chunk in x.iter_content(chunk_size=1):
+            it = p.stream(chunk.decode("utf-8"))
+            while True:
+                try:
+                    row = next(it)
+                except StopIteration:
+                    pass
+                else:
+                    if "quote" in row or "trade" in row:
+                        yield row
+                finally:
+                    del it
+                    break
diff --git a/ally/Auth.py b/ally/Auth.py
index 7aac6d43..9015e39d 100644
--- a/ally/Auth.py
+++ b/ally/Auth.py
@@ -21,85 +21,77 @@
 # SOFTWARE.
 """Controls the OAuth1 object used for account authentication
 
+Authentication classes.
 """
 
-from requests_oauthlib	import OAuth1
-from datetime			import datetime, timedelta
-from requests			import Session
+from datetime import datetime, timedelta
 
-
-class Auth:
-	"""Auth object, caching and creating new sessions as needed
-	"""
-
-	_session		= None
-	_auth			= None
-
-	_auth_expire	= None
-	_valid_auth_dt	= None
-
-	_params			= {}
+from requests import Session
+from requests_oauthlib import OAuth1
 
 
+class Auth:
+    """Auth object, caching and creating new sessions as needed"""
 
-	@property
-	def sess ( self ):
-		if self._session is None:
-			self._session = Session()
-		return self._session
-
-
-	@property
-	def _get_auth ( self ):
-		# Compute the auth, without caching
-		return OAuth1(
-			self._params.get('ALLY_CONSUMER_KEY'),
-			self._params.get('ALLY_CONSUMER_SECRET'),
-			self._params.get('ALLY_OAUTH_TOKEN'),
-			self._params.get('ALLY_OAUTH_SECRET'),
-			signature_type='auth_header'
-		)
-
-
-	@property
-	def auth ( self ):
+    _session = None
+    _auth = None
 
-		# Precalculate current time
-		now = datetime.now()
+    _auth_expire = None
+    _valid_auth_dt = None
 
-		# If outside time valid range, regenerate auth
-		if self._auth is None or self._auth_expire < now:
-			# Set the max auth valid range
-			self._auth_expire = now + self._valid_auth_dt
+    _params = {}
 
-			# Actually generate the auth request
-			self._auth = self._get_auth
-		return self._auth
+    def __init__(self, params, dt=None):
+        """Creates an auth object.
 
+        Args:
+            params: set of keys given by Ally API
+            dt: time interval for caching. 10 seconds max
 
+        """
 
+        # make sure DT is good
+        if dt is None:
+            dt = timedelta(seconds=9.7)
 
+        # Keep track of the cache invalidation time
+        self._valid_auth_dt = dt
 
-	def __init__ ( self, params, dt = None ):
-		"""Creates an auth object.
+        # Store what we need
+        self._params = params
 
-		Args:
+        # Precompute some stuff
+        self.sess
+        self.auth
 
-			params: set of keys given by Ally API
-			dt: time interval for caching. 10 seconds max
+    @property
+    def sess(self):
+        if self._session is None:
+            self._session = Session()
+        return self._session
 
-		"""
+    @property
+    def _get_auth(self):
+        # Compute the auth, without caching
+        return OAuth1(
+            self._params.get("ALLY_CONSUMER_KEY"),
+            self._params.get("ALLY_CONSUMER_SECRET"),
+            self._params.get("ALLY_OAUTH_TOKEN"),
+            self._params.get("ALLY_OAUTH_SECRET"),
+            signature_type="auth_header",
+        )
 
-		# make sure DT is good
-		if dt is None:
-			dt = timedelta(seconds=9.7)
+    @property
+    def auth(self):
 
-		# Keep track of the cache invalidation time
-		self._valid_auth_dt = dt
+        # Precalculate current time
+        now = datetime.now()
 
-		# Store what we need
-		self._params = params
+        # If outside time valid range, regenerate auth
+        if self._auth is None or self._auth_expire < now:
+            # Set the max auth valid range
+            self._auth_expire = now + self._valid_auth_dt
 
-		# Precompute some stuff
-		self.sess
-		self.auth
+            # Actually generate the auth request
+            self._auth = self._get_auth
+        return self._auth
diff --git a/ally/Info.py b/ally/Info.py
index a62b353d..088d2142 100644
--- a/ally/Info.py
+++ b/ally/Info.py
@@ -22,97 +22,90 @@
 
 """Gets information from the API service not directly tied to a particular account.
 
+Gets information about the clock and status.
 """
 
 
 from .Api import Endpoint, RequestType
 
 
+class Clock(Endpoint):
+    _type = RequestType.Info
+    _resource = "market/clock.json"
 
-class Clock ( Endpoint ):
-	_type		= RequestType.Info
-	_resource	= 'market/clock.json'
 
+class Status(Endpoint):
+    _type = RequestType.Info
+    _resource = "utility/status.json"
 
 
-class Status ( Endpoint ):
-	_type		= RequestType.Info
-	_resource	= 'utility/status.json'
+def clock(block: bool = True):
+    """Return the current market clock.
 
+    Gets a simple dict with timestamp and the status of the market (pre-market, post-market, etc.),
+    including the next time that the market clock changes status.
 
+    Args:
+        block:
+            Specify whether to block thread if request exceeds rate limit
 
 
+    Returns:
+        A dictionary with timestamp, current market status, and any error information.
 
+    Raises:
+        RateLimitException: If block=False, rate limit problems will be raised
 
+    Example:
 
-def clock ( block: bool = True):
-	"""Return the current market clock.
+    .. code-block:: python
 
-	Gets a simple dict with timestamp and the status of the market (pre-market, post-market, etc.),
-	including the next time that the market clock changes status.
+        # Equivalent to the static function
+        #   ally.Info.clock()
+        a.clock()
 
-	Args:
-		block:
-			Specify whether to block thread if request exceeds rate limit
+        # => {
+            'date': '2020-06-14 18:03:58.0-04:00',
+            'unixtime': '1592172240.069',
+            'status': {
+                'current': 'close',
+                'next': 'pre',
+                'change_at': '08:00:00'
+            },
+            'error': 'Success',
+        }
 
+    """
+    return Clock().request(block=block)
 
-	Returns:
-		A dictionary with timestamp, current market status, and any error information.
 
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
+def status(block: bool = True):
+    """Return the status of the API service.
 
-	Example:
+    Gets a simple dict with timestamp and the current status (up, down, etc.) of the service.
 
-.. code-block:: python
+    Args:
+        block:
+            Specify whether to block thread if request exceeds rate limit
 
+    Returns:
+        A dictionary with current time, and the status of the API service.
 
-	# Equivalent to the static function
-	#   ally.Info.clock()
-	a.clock()
+    Raises:
+        RateLimitException: If block=False, rate limit problems will be raised
 
-	# => {
-		'date': '2020-06-14 18:03:58.0-04:00',
-		'unixtime': '1592172240.069',
-		'status': {
-			'current': 'close',
-			'next': 'pre',
-			'change_at': '08:00:00'
-		},
-		'error': 'Success',
-	}
+    Example:
 
-	"""
-	return Clock().request(block=block)
+    .. code-block:: python
 
-def status ( block: bool = True ):
-	"""Return the status of the API service.
+        # Equivalent to the static function
+        #   ally.Info.status()
+        a.status()
 
-	Gets a simple dict with timestamp and the current status (up, down, etc.) of the service.
-
-	Args:
-		block:
-			Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		A dictionary with current time, and the status of the API service.
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Example:
-
-.. code-block:: python
-
-	# Equivalent to the static function
-	#   ally.Info.status()
-	a.status()
-
-	# => {
-		'time': 'Sun, 14, Jun 2020 18:17:06 GMT',
-		'error': 'Success'
-	}
-
-	"""
-	return Status().request(block=block)
+        # => {
+            'time': 'Sun, 14, Jun 2020 18:17:06 GMT',
+            'error': 'Success'
+        }
 
+    """
+    return Status().request(block=block)
diff --git a/ally/News/Lookup.py b/ally/News/Lookup.py
index cb704821..cc1371fe 100644
--- a/ally/News/Lookup.py
+++ b/ally/News/Lookup.py
@@ -20,98 +20,71 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class LookupNews(AuthenticatedEndpoint):
+    _type = RequestType.Info
+    _resource = "market/news/{}.json"
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
+        params = {"symbols": kwargs.get("symbols"), "maxhits": kwargs.get("limit", 10)}
+        return params, None
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        k = response.json().get("response")["article"]
 
+        return k
 
-class LookupNews ( AuthenticatedEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'market/news/{}.json'
+    def resolve(self, **kwargs):
+        """Inject the account number into the call"""
+        return self.url().format(kwargs.get("articleId"))
 
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
+        # Create dataframe from our dataset
+        df = pd.DataFrame([raw]).replace({"na": None}).set_index("id")
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		params = {
-			'symbols':kwargs.get('symbols'),
-			'maxhits':kwargs.get('limit',10)
-		}
-		return params, None
+        return df
 
 
+def lookupNews(self, articleId, dataframe=True, block: bool = True):
+    """Looks up the news text for a given article.
 
+    Calls the 'market/news/{}.json' endpoint to the news story with a given id.
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		k = response.json().get('response')['article']
+    Args:
+            articleId: Specify the articleID requested
 
-		return k
+            dataframe: whether to return results as dataframe
 
+            block: Specify whether to block thread if request exceeds rate limit
 
 
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		"""
-		return self.url().format(kwargs.get('articleId'))
+    Returns:
+            Dataframe, or dict
 
+    Raises:
+            RateLimitException: If block=False, rate limit problems will be raised
 
+    Example:
+            .. code-block:: python
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+               a.lookupNews( '2938-A2231367-5OLLNQGI9S29FR694AB4IM0OQ' )
 
-		# Create dataframe from our dataset
-		df = pd.DataFrame( [raw] ).replace({'na':None}).set_index('id')
+    """
+    result = LookupNews(
+        auth=self.auth, account_nbr=self.account_nbr, block=block, articleId=articleId
+    ).request()
 
-		return df
+    if dataframe:
+        try:
+            result = LookupNews.DataFrame(result)
+        except:
+            raise
 
-
-
-
-
-
-
-def lookupNews ( self, articleId, dataframe = True, block: bool = True ):
-	"""Looks up the news text for a given article.
-
-	Calls the 'market/news/{}.json' endpoint to the news story with a given id.
-
-	Args:
-		articleId: Specify the articleID requested
-
-		dataframe: whether to return results as dataframe
-
-		block: Specify whether to block thread if request exceeds rate limit
-
-
-	Returns:
-		Dataframe, or dict
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Example:
-		.. code-block:: python
-
-		   a.lookupNews( '2938-A2231367-5OLLNQGI9S29FR694AB4IM0OQ' )
-
-	"""
-	result = LookupNews (
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		block		= block,
-		articleId	= articleId
-	).request()
-
-	if dataframe:
-		try:
-			result = LookupNews.DataFrame ( result )
-		except:
-			raise
-
-	return result
+    return result
diff --git a/ally/News/Search.py b/ally/News/Search.py
index 3cfb941f..534c9847 100644
--- a/ally/News/Search.py
+++ b/ally/News/Search.py
@@ -20,102 +20,116 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class SearchNews(AuthenticatedEndpoint):
+    _type = RequestType.Info
+    _resource = "market/news/search.json"
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
+        if "symbols" not in kwargs.keys():
+            raise KeyError(
+                "Please specify symbols, and pass in list of symbols (or string)"
+            )
 
+        symbols = kwargs.get("symbols", [])
 
-class SearchNews ( AuthenticatedEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'market/news/search.json'
+        # Correctly format Symbols, also store split up symbols
+        if type(symbols) == type(""):
+            # We were passed string
+            fmt_symbols = symbols
+        else:
+            # We were passed list
+            fmt_symbols = ",".join(symbols)
 
+        params = {
+            "symbols": fmt_symbols,
+            "maxhits": kwargs.get("limit", 10),
+            "startdate": kwargs.get("startdate", []),
+            "enddate": kwargs.get("enddate", []),
+        }
 
+        return params, None
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		params = {
-			'symbols':kwargs.get('symbols'),
-			'maxhits':kwargs.get('limit',10)
-		}
-		return params, None
+    def extract(self, response):
+        """Extract certain fields from response"""
+        k = response.json().get("response")["articles"]["article"]
 
+        return k
 
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
+        # Create dataframe from our dataset
+        df = pd.DataFrame(raw).replace({"na": None}).set_index("id")
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		k = response.json().get('response')['articles']['article']
+        return df
 
-		return k
 
+def searchNews(
+    self,
+    symbols,
+    limit=None,
+    startdate: str = "",
+    enddate: str = "",
+    dataframe=True,
+    block: bool = True,
+):
+    """Searches for news on a set of symbols.
 
+    Calls the 'market/news/search.json' endpoint to search for
+    news articles related to some set of symbols.
 
+    Args:
+            symbols: Specify the stock symbols for which to search
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+            limit: (int) maximum number of hits (10 default)
 
-		# Create dataframe from our dataset
-		df = pd.DataFrame( raw ).replace({'na':None}).set_index('id')
+            startdate: Earliest date to include in search
 
-		return df
+            enddate: Last date to include in search
 
+            dataframe: whether to return results as dataframe
 
+            block: Specify whether to block thread if request exceeds rate limit
 
 
+    Returns:
+            Dataframe, or list
 
+    Raises:
+            RateLimitException: If block=False, rate limit problems will be raised
 
+    Example:
+            .. code-block:: python
 
-def searchNews ( self, symbols, limit=None, dataframe = True, block: bool = True ):
-	"""Searches for news on a set of symbols.
+               df = a.searchNews('spy')
 
-	Calls the 'market/news/search.json' endpoint to search for
-	news articles related to some set of symbols.
+               df.columns
+               # Index(['date', 'headline', 'story'], dtype='object')
 
-	Args:
-		symbols: Specify the stock symbols for which to search
+               df.index
+               # Index([...], dtype='object', name='id')
 
-		limit: (int) maximum number of hits (10 default)
+    """
+    result = SearchNews(
+        auth=self.auth,
+        account_nbr=self.account_nbr,
+        symbols=symbols,
+        limit=limit,
+        startdate=startdate,
+        enddate=enddate,
+        block=block,
+    ).request()
 
-		dataframe: whether to return results as dataframe
+    if dataframe:
+        try:
+            result = SearchNews.DataFrame(result)
+        except:
+            raise
 
-		block: Specify whether to block thread if request exceeds rate limit
-
-
-	Returns:
-		Dataframe, or list
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Example:
-		.. code-block:: python
-
-		   df = a.searchNews('spy')
-
-		   df.columns
-		   # Index(['date', 'headline', 'story'], dtype='object')
-
-		   df.index
-		   # Index([...], dtype='object', name='id')
-
-	"""
-	result = SearchNews (
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		block		= block,
-		limit		= limit,
-		symbols		= symbols
-	).request()
-
-	if dataframe:
-		try:
-			result = SearchNews.DataFrame ( result )
-		except:
-			raise
-
-	return result
+    return result
diff --git a/ally/News/__init__.py b/ally/News/__init__.py
index 86886da8..d7427c93 100644
--- a/ally/News/__init__.py
+++ b/ally/News/__init__.py
@@ -20,5 +20,5 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from .Search	import searchNews
-from .Lookup	import lookupNews
+from .Lookup import lookupNews
+from .Search import searchNews
diff --git a/ally/Option/__init__.py b/ally/Option/__init__.py
index c878f29d..9510a877 100644
--- a/ally/Option/__init__.py
+++ b/ally/Option/__init__.py
@@ -20,7 +20,7 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from .expirations	import expirations
-from .strikes		import strikes
-from .search		import search
-from .classes		import *
+from .classes import *
+from .expirations import expirations
+from .search import optionSearchQuery, search
+from .strikes import strikes
diff --git a/ally/Option/classes.py b/ally/Option/classes.py
index afd582a9..3529e80d 100644
--- a/ally/Option/classes.py
+++ b/ally/Option/classes.py
@@ -20,45 +20,44 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-class DateRelation:
-
 
-	def __init__ (self):
-		self._rel = None
+class DateRelation:
+    def __init__(self):
+        self._rel = None
 
-	def __gt__ ( self, date ):
+    def __gt__(self, date):
 
-		import datetime
-		if isinstance ( date, datetime.datetime ):
-			date = date.strftime('%Y-%m-%d')
+        import datetime
 
-		self._rel = ('>', date)
-		return self
+        if isinstance(date, datetime.datetime):
+            date = date.strftime("%Y-%m-%d")
 
-	def __lt__ ( self, date ):
+        self._rel = (">", date)
+        return self
 
-		import datetime
-		if isinstance ( date, datetime.datetime ):
-			date = date.strftime('%Y-%m-%d')
+    def __lt__(self, date):
 
-		self._rel = ('<', date)
-		return self
+        import datetime
 
-	def __str__ ( self ):
-		return str(self._rel)
+        if isinstance(date, datetime.datetime):
+            date = date.strftime("%Y-%m-%d")
 
+        self._rel = ("<", date)
+        return self
 
+    def __str__(self):
+        return str(self._rel)
 
 
 class DateAgg:
-	def __init__( self ):
+    def __init__(self):
 
-		self._dates = []
+        self._dates = []
 
-	def __add__ (self, relation):
+    def __add__(self, relation):
 
-		self._dates.append ( relation )
-		return self
+        self._dates.append(relation)
+        return self
 
-	def __str__ ( self ):
-		return str(self._dates)
+    def __str__(self):
+        return str(self._dates)
diff --git a/ally/Option/expirations.py b/ally/Option/expirations.py
index 7d035b41..bb24a0c6 100644
--- a/ally/Option/expirations.py
+++ b/ally/Option/expirations.py
@@ -20,95 +20,72 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class Expirations(AuthenticatedEndpoint):
+    _type = RequestType.Info
+    _resource = "market/options/expirations.json"
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
+        params = {"symbol": kwargs.get("symbol")}
+        return params, None
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        k = response.json().get("response")["expirationdates"]["date"]
 
+        # Make sure we have a valid object, not None
+        if k is None:
+            k = []
 
-class Expirations ( AuthenticatedEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'market/options/expirations.json'
+        if self.useDatetime:
 
+            from datetime import datetime
 
+            f = lambda x: datetime.strptime(x, "%Y-%m-%d")
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		params = {
-			"symbol":kwargs.get('symbol')
-		}
-		return params, None
+        else:
+            f = str
 
+        return list(map(f, k))
 
 
+def expirations(self, symbol, useDatetime=True, block: bool = True):
+    """Gets list of available expiration dates for a symbol.
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		k = response.json().get('response')['expirationdates']['date']
+    Calls the 'market/options/expirations.json' endpoint to get list of all
+    exp_dates available for some given equity.
 
-		# Make sure we have a valid object, not None
-		if k is None:
-			k = []
+    Args:
+            symbol: Specify the stock symbol against which to query
+            useDatetime: Specify whether to return datetime objects, or strings
+            block: Specify whether to block thread if request exceeds rate limit
 
-		if self.useDatetime:
+    Returns:
+            List of dates (datetime obj, or string)
 
-			from datetime import datetime
-			f = lambda x: datetime.strptime( x, '%Y-%m-%d' )
+    Raises:
+            RateLimitException: If block=False, rate limit problems will be raised
 
-		else:
-			f = str
+    Example:
+            .. code-block:: python
 
-		return list(map( f, k ))
+               a.expirations('spy')
+               # [ datetime.datetime(2022, 3, 18, 0, 0), ... ]
 
+               a.expirations('spy', useDatetime = False)
+               # [ '2022-03-18', ... ]
 
+    """
+    # Create request
+    req = Expirations(
+        auth=self.auth, account_nbr=self.account_nbr, block=block, symbol=symbol
+    )
+    # Add in the extra information
+    req.useDatetime = useDatetime
+    # result
+    result = req.request()
 
-
-
-
-
-
-
-
-def expirations ( self, symbol, useDatetime = True, block: bool = True ):
-	"""Gets list of available expiration dates for a symbol.
-
-	Calls the 'market/options/expirations.json' endpoint to get list of all
-	exp_dates available for some given equity.
-
-	Args:
-		symbol: Specify the stock symbol against which to query
-		useDatetime: Specify whether to return datetime objects, or strings
-		block: Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		List of dates (datetime obj, or string)
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Example:
-		.. code-block:: python
-
-		   a.expirations('spy')
-		   # [ datetime.datetime(2022, 3, 18, 0, 0), ... ]
-
-		   a.expirations('spy', useDatetime = False)
-		   # [ '2022-03-18', ... ]
-
-	"""
-	# Create request
-	req = Expirations(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		block		= block,
-		symbol		= symbol
-	)
-	# Add in the extra information
-	req.useDatetime = useDatetime
-	# result
-	result = req.request()
-
-	return result
+    return result
diff --git a/ally/Option/search.py b/ally/Option/search.py
index d79cf1ee..d444cef1 100644
--- a/ally/Option/search.py
+++ b/ally/Option/search.py
@@ -20,149 +20,211 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from typing import List
+
+from ..Api import AuthenticatedEndpoint, RequestType
+
+
+class optionSearchQuery:
+    _queryable_fields = [
+        "strikeprice",
+        "xdate",
+        "xmonth",
+        "xyear",
+        "put_call",
+        "unique",
+    ]
+    _query_operators = ["lt", "gt", "gte", "lte", "eq"]
+
+    _condition: str = ""
+    _operator: str = ""
+    _value = None
+
+    def __init__(self, **kwargs):
+        if "condition" not in kwargs.keys():
+            raise KeyError("Please specify a condition as a string")
+        if "operator" not in kwargs.keys():
+            raise KeyError("Please specify an operator as a string")
+        if "value" not in kwargs.keys():
+            raise KeyError("Please specify a value as a string")
+        self._condition = kwargs.get("condition", [])
+        self._operator = kwargs.get("operator", [])
+        self._value = kwargs.get("value", [])
 
+    def is_query_valid(self):
+        return (self._condition in self._queryable_fields) and (
+            self._operator in self._query_operators
+        )
 
+    def get_formatted_query_str(self):
+        if self.is_query_valid():
+            if self._condition and self._operator and self._value:
+                return f"{self._condition}-{self._operator}:{self._value}"
+        return ""
 
+    def __str__(self):
+        return self.get_formatted_query_str()
 
 
+class Search(AuthenticatedEndpoint):
+    _type = RequestType.Info
+    _resource = "market/options/search.json"
+    _method = "POST"
+    _symbol: str = ""
+    _queries: List = []
 
-class Search ( AuthenticatedEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'market/options/search.json'
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
+        if "symbol" not in kwargs.keys():
+            raise KeyError("Please specify a symbol as a string")
 
+        # For aesthetics...
+        self._symbol = kwargs.get("symbol").upper()
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		q = kwargs.get('query',[])
-		q = ' AND '.join(q)
+        params = {"symbol": self._symbol}
 
-		params = {
-			'symbol':	kwargs.get('symbol'),
-			'fields':	kwargs.get('fields',None),
-			'query':	q
-		}
+        fields = kwargs.get("fields", [])
+        queries = kwargs.get("query", [])
 
-		return params, None
+        # Correctly format Fields, also store split up fields
+        if type(fields) == type(""):
+            # We were passed string
+            fmt_fields = fields
+            fields = fmt_fields.split(",")
+        else:
+            # We were passed list
+            fmt_fields = ",".join(fields)
 
+        if fields != []:
+            params["fids"] = fmt_fields
 
+        if queries != []:
+            params["query"] = " AND ".join([str(x) for x in queries])
 
+        return params, None
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		k = response.json().get('response')['quotes']['quote']
+    def extract(self, response):
+        """Extract certain fields from response"""
+        k = response.json().get("response")["quotes"]["quote"]
 
-		return k
+        return k
 
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+        # Create dataframe from our dataset
+        df = (
+            pd.DataFrame(raw)
+            .replace({"na": None})
+            .apply(
+                # And also cast relevent fields to numeric values
+                pd.to_numeric,
+                errors="ignore",
+            )
+            .set_index("symbol")
+            .drop(columns="basis")
+        )
 
-		# Create dataframe from our dataset
-		df = pd.DataFrame( raw ).replace({'na':None}).apply(
-			# And also cast relevent fields to numeric values
-			pd.to_numeric,
-			errors='ignore'
-		).set_index('symbol').drop(columns='basis')
+        return df
 
-		return df
 
+def search(
+    self, symbol, query: List = [], fields=[], dataframe=True, block: bool = True
+):
+    """Searches for all option quotes on a symbol that satisfy some set of criteria
 
+    Calls the 'market/options/search.json' endpoint, querying against certain parameters provided. Specify a single value or a list of values to expand the size of the search.
 
+    Option queries are composed of three elements:
 
+        1) a condition
+        2) an operator
+        3) a value
 
+    in the format field-operator:value (i.e., xyear-eq:2012)
 
+    Queryable Fields:
+        strikeprice: possible values: 5 or 7.50, integers or decimals
 
+        xdate: YYYYMMDD
 
+        xmonth: MM
 
-def search ( self, symbol, query=[], fields=[], dataframe=True, block: bool = True ):
-	"""Searches for all option quotes on a symbol that satisfy some set of criteria
+        xyear: YYYY
 
-	Calls the 'market/options/search.json' endpoint, querying against certain parameters
-	provided. Specify a single value or a list of values to expand the size of the search.
+        put_call: possible values: put, call
 
-	Option queries are composed of three elements:
-		1) a condition,
-		2) an operator
-		3) a value
-	in the format field-operator:value (i.e., xyear-eq:2012)
+        unique: possible values: strikeprice, xdate
 
-	Queryable Fields:
-		strikeprice: possible values: 5 or 7.50, integers or decimals
+    Operators:
+        lt: less than
 
-		xdate: YYYYMMDD
+        gt: greater than
 
-		xmonth: MM
+        gte: greater than or equal to
 
-		xyear: YYYY
+        lte: less than or equal to
 
-		put_call: possible values: put, call
+        eq: equal to
 
-		unique: possible values: strikeprice, xdate
+    Visit `the ally website`_ to see the full API behavior.
 
-	Operators:
-		lt: less than
+    Args:
+        symbol (str): Specify the stock symbol against which to query
+        fields: (Optional) List of attributes requested for each option contract found. If not specified, will return all applicable fields
+        dataframe: (Optional) Return quotes in pandas dataframe
+        block (bool): Specify whether to block thread if request exceeds rate limit
 
-		gt: greater than
+    Returns:
+        Default: Pandas dataframe
+        Otherwise: flat list of dictionaries
 
-		gte: greater than or equal to
+    Raises:
+        RateLimitException: If block=False, rate limit problems will be raised
 
-		lte: less than or equal to
+    Example:
+        .. code-block:: python
 
-		eq: equal to
+            a.search(
+                'spy',
+                query=[
+                    optionSearchQuery(condition='xdate', operator='eq', value='20200814'),    # Only consider contracts expiring on 2020-08-14
+                    optionSearchQuery(condition='put_call', operator='eq', value='put'),      # Only consider puts
+                    optionSearchQuery(condition='strikeprice', operator='lte', value='350'),  # Only consider strikes <= 350
+                    optionSearchQuery(condition='strikeprice', operator='gte', value='315')   # Only consider strikes <= 315
+                ]
+            )
 
-	Visit `the ally website`_ to see the full API behavior.
+            # Alternatively, the queries can be specified as Strings, but it is recommended to use the `optionSearchQuery` class for validation of the query
+            a.search(
+                'spy',
+                query=[
+                    'xdate-eq:20200814',    # Only consider contracts expiring on 2020-08-14
+                    'put_call-eq:put',      # Only consider puts
+                    'strikeprice-lte:350',  # Only consider strikes <= 350
+                    'strikeprice-gte:315'   # Only consider strikes >= 315
+                ]
+            )
 
-	Args:
-		symbol: Specify the stock symbol against which to query
+        .. _`the ally website`: https://pypi.org/project/pyally/
 
-		fields: (Optional) List of attributes requested for each option contract found. If not specified, will return all applicable fields
+    """
 
-		dataframe: (Optional) Return quotes in pandas dataframe
+    result = Search(
+        auth=self.auth,
+        account_nbr=self.account_nbr,
+        symbol=symbol,
+        fields=fields,
+        query=query,
+        block=block,
+    ).request()
 
-		block: Specify whether to block thread if request exceeds rate limit
+    if dataframe:
+        try:
+            result = Search.DataFrame(result)
+        except:
+            raise
 
-	Returns:
-		Default: Pandas dataframe
-
-		Otherwise: flat list of dictionaries
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Example:
-		.. code-block:: python
-
-	 	   a.search(
-				'spy',
-				query=[
-					'xdate-eq:20200814',	# Only consider contracts expiring on 2020-08-14
-					'put_call-eq:put',		# Only conside puts
-					'strikeprice-lte:350',	# Only consider strikes <= $350
-					'strikeprice-gte:315'	# Only consider strikes >= $315
-				]
-			)
-
-
-.. _`the ally website`: https://pypi.org/project/pyally/
-	"""
-	result = Search(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		symbol		= symbol,
-		fields		= fields,
-		query		= query,
-		block		= block
-	).request()
-
-	if dataframe:
-		try:
-			result = Search.DataFrame ( result )
-		except:
-			raise
-
-	return result
+    return result
diff --git a/ally/Option/strikes.py b/ally/Option/strikes.py
index d1506260..68f16703 100644
--- a/ally/Option/strikes.py
+++ b/ally/Option/strikes.py
@@ -20,77 +20,53 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class Strikes(AuthenticatedEndpoint):
+    _type = RequestType.Info
+    _resource = "market/options/strikes.json"
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
+        params = {"symbol": kwargs.get("symbol")}
+        return params, None
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        k = response.json().get("response")["prices"]["price"]
 
+        if k is None:
+            k = []
 
-class Strikes ( AuthenticatedEndpoint ):
-	_type		= RequestType.Info
-	_resource	= 'market/options/strikes.json'
+        return list(map(float, k))
 
 
+def strikes(self, symbol, block: bool = True):
+    """Gets list of available strike prices for a symbol.
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		params = {
-			"symbol":kwargs.get('symbol')
-		}
-		return params, None
+    Calls the 'market/options/strikes.json' endpoint to get list of all
+    strikes available for some given equity.
 
+    Args:
+            symbol: Specify the stock symbol against which to query
+            block: Specify whether to block thread if request exceeds rate limit
 
+    Returns:
+            List of strikes (float)
 
+    Raises:
+            RateLimitException: If block=False, rate limit problems will be raised
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		k = response.json().get('response')['prices']['price']
+    Example:
+            .. code-block:: python
 
-		if k is None:
-			k = []
+               a.strikes('spy')
+               # [ 5.0, 10.0, ... ]
 
-		return list(map( float, k ))
+    """
+    result = Strikes(
+        auth=self.auth, account_nbr=self.account_nbr, block=block, symbol=symbol
+    ).request()
 
-
-
-
-
-
-
-
-
-
-def strikes ( self, symbol, block: bool = True ):
-	"""Gets list of available strike prices for a symbol.
-
-	Calls the 'market/options/strikes.json' endpoint to get list of all 
-	strikes available for some given equity.
-
-	Args:
-		symbol: Specify the stock symbol against which to query
-		block: Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		List of strikes (float)
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Example:
-		.. code-block:: python
-
-		   a.strikes('spy')
-		   # [ 5.0, 10.0, ... ]
-
-	"""
-	result = Strikes(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		block		= block,
-		symbol		= symbol
-	).request()
-
-	return result
+    return result
diff --git a/ally/Order/Outstanding.py b/ally/Order/Outstanding.py
index 7cfbc897..862ff15a 100644
--- a/ally/Order/Outstanding.py
+++ b/ally/Order/Outstanding.py
@@ -20,59 +20,48 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AccountEndpoint, RequestType
-from .order		import Order
+from ..Api import AccountEndpoint, RequestType
+from .order import Order
 
 
+class OutstandingOrders(AccountEndpoint):
+    """Send an order off"""
 
+    _type = RequestType.Order
+    _resource = "accounts/{0}/orders.json"
+    _method = "GET"
 
-class OutstandingOrders ( AccountEndpoint ):
-	"""Send an order off
-	"""
-	_type		= RequestType.Order
-	_resource	= 'accounts/{0}/orders.json'
-	_method		= 'GET'
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        raworders = response["orderstatus"]["order"]
 
+        if not isinstance(raworders, list):
+            raworders = [raworders]
 
+        orders = [Order(fixml=x["fixmlmessage"]) for x in raworders]
 
+        return orders
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		raworders = response['orderstatus']['order']
 
-		if not isinstance(raworders, list):
-			raworders = [raworders]
+def orders(self, block: bool = True):
+    """View all recent orders in the last 24 hours.
 
-		orders = [ Order(fixml=x['fixmlmessage']) for x in raworders]
+    Calls accounts/./orders.json from the Ally API.
 
-		return orders
+    Args:
+            block: Specify whether to block thread if request exceeds rate limit
 
+    Returns:
+            A list of Order objects. Attributes can be viewed in the
+            same way as orders created by the user.
 
+    Raises:
+            RateLimitException: If block=False, rate limit problems will be raised
 
+    """
+    result = OutstandingOrders(
+        auth=self.auth, account_nbr=self.account_nbr, block=block
+    ).request()
 
-
-def orders ( self, block: bool = True ):
-	"""View all recent orders in the last 24 hours.
-
-	Calls accounts/./orders.json from the Ally API.
-
-	Args:
-		block: Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		A list of Order objects. Attributes can be viewed in the
-		same way as orders created by the user.
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	"""
-	result = OutstandingOrders(
-		auth		= self.auth,
-		account_nbr = self.account_nbr,
-		block		= block
-	).request()
-
-	return result
+    return result
diff --git a/ally/Order/Submit.py b/ally/Order/Submit.py
index 366233f9..26ac2c45 100644
--- a/ally/Order/Submit.py
+++ b/ally/Order/Submit.py
@@ -20,143 +20,107 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api			import AccountEndpoint, RequestType
-from ..exception	import OrderException, ExecutionException
-from .order			import Order
+from ..Api import AccountEndpoint, RequestType
+from ..exception import ExecutionException, OrderException
+from .order import Order
 
 
+class Submission(AccountEndpoint):
+    """Send an order off"""
 
+    _type = RequestType.Order
+    _resource = "accounts/{0}/orders{1}.json"
+    _method = "POST"
 
-class Submission ( AccountEndpoint ):
-	"""Send an order off
-	"""
-	_type		= RequestType.Order
-	_resource	= 'accounts/{0}/orders{1}.json'
-	_method		= 'POST'
+    def resolve(self, **kwargs):
+        """Inject the account number into the call
+        Also controls whether or not this is a preview.
 
+        To submit a real order, specify 'preview'=False
+        in the constructer arguments
+        """
+        self._preview = kwargs.get("preview", True)
 
+        return self.url().format(
+            kwargs.get("account_nbr"), "/preview" if self._preview else ""
+        )
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
 
+        if response["error"] != "Success":
+            raise ExecutionException(response["error"])
 
+        if not self._preview:
+            # Get the ID we were promissed
+            self._order.orderid = response["clientorderid"]
+            return self._order.orderid
 
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		Also controls whether or not this is a preview.
+        else:
+            return response
 
-		To submit a real order, specify 'preview'=False
-		in the constructer arguments
-		"""
-		self._preview = kwargs.get('preview',True)
+    def req_body(self, order, **kwargs):
+        """Return get params together with post body data"""
 
-		return self.url().format(
-			kwargs.get('account_nbr'),
-			"/preview" if self._preview else ''
-		)
+        # Get our order
+        self._order = order
 
+        # Let FIXML handle this bullshit
+        data = self._order.fixml
 
+        # Return what we have
+        return None, data
 
 
+def submit(self, order, preview: bool = True, type_=None, block: bool = True):
+    """Submits an order object to Ally's servers for execution.
 
+    Given an instantiated ally object, send an order up
+    to the API for execution right now. The original order passed
+    in to this function will have a new attribute, order.orderid
+    (if preview=False), which will encode the order's ID in Ally's system.
+    Modifying or cancelling this order will affect this orderid unless it was
+    otherwise modified.
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
+    Args:
+            order:
+                    An ally.Order.Order instance
 
-		if response['error'] != 'Success':
-			raise ExecutionException(response['error'])
+            preview:
+                    Specify whether to actually submit the order for execution,
+                    or just to see mock execution info including quotes, from Ally.
 
+            type_:
+                    Cancels or modifies the order, if not None
 
-		if not self._preview:
-			# Get the ID we were promissed
-			self._order.orderid = response['clientorderid']
-			return self._order.orderid
+            block:
+                    Specify whether to block thread if request exceeds rate limit
 
-		else:
-			return response
+    Returns:
+            An order ID string, the same added to the order object (if preview=False)
+            or a dictionary with contingent market execution data (if preview=True)
 
 
+    Raises:
+            ExecutionException: Will return verbatim error from Ally's API if a problem with
+                    the order is encountered.
+            RateLimitException: If block=False, rate limit problems will be raised
 
+    """
 
+    if type_ is not None:
+        order.otype = type_
 
+    # Add the account number to this order
+    order.set_account(self.account_nbr)
 
+    result = Submission(
+        auth=self.auth,
+        account_nbr=self.account_nbr,
+        preview=preview,
+        order=order,
+        block=block,
+    ).request()
 
-	def req_body ( self, order, **kwargs ):
-		"""Return get params together with post body data
-		"""
-
-		# Get our order
-		self._order = order
-
-		# Let FIXML handle this bullshit
-		data = self._order.fixml
-
-		# Return what we have
-		return None, data
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-def submit ( self, order, preview: bool = True, type_ = None, block: bool = True ):
-	"""Submits an order object to Ally's servers for execution.
-
-	Given an instantiated ally object, send an order up
-	to the API for execution right now. The original order passed
-	in to this function will have a new attribute, order.orderid
-	(if preview=False), which will encode the order's ID in Ally's system.
-	Modifying or cancelling this order will affect this orderid unless it was
-	otherwise modified.
-
-	Args:
-		order:
-			An ally.Order.Order instance
-
-		preview:
-			Specify whether to actually submit the order for execution,
-			or just to see mock execution info including quotes, from Ally.
-
-		type_:
-			Cancels or modifies the order, if not None
-
-		block:
-			Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		An order ID string, the same added to the order object (if preview=False)
-		or a dictionary with contingent market execution data (if preview=True)
-
-
-	Raises:
-		ExecutionException: Will return verbatim error from Ally's API if a problem with
-			the order is encountered.
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	"""
-
-	if type_ is not None:
-		order.otype = type_
-
-	# Add the account number to this order
-	order.set_account(self.account_nbr)
-
-	result = Submission(
-		auth		= self.auth,
-		account_nbr = self.account_nbr,
-		preview		= preview,
-		order		= order,
-		block		= block
-	).request()
-
-	return result
+    return result
diff --git a/ally/Order/__init__.py b/ally/Order/__init__.py
index 51279648..0cdaa6eb 100644
--- a/ally/Order/__init__.py
+++ b/ally/Order/__init__.py
@@ -26,7 +26,7 @@
 
 """
 
-from .Outstanding	import orders
-from .Submit		import submit
-from .order			import Order
-from .classes		import *
+from .classes import *
+from .order import Order
+from .Outstanding import orders
+from .Submit import submit
diff --git a/ally/Order/classes.py b/ally/Order/classes.py
index 19b49816..7ae0a8da 100644
--- a/ally/Order/classes.py
+++ b/ally/Order/classes.py
@@ -20,243 +20,210 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from enum		import Enum
-from ..utils		import (
-	option_format,
-	option_symbol,
-	option_strike,
-	option_maturity,
-	option_callput,
-)
+from enum import Enum
 
+from ..utils import option_format
 
 
 class OType(Enum):
-	Order	= 1
-	Modify	= 2
-	Cancel	= 3
+    Order = 1
+    Modify = 2
+    Cancel = 3
 
 
 class Side(Enum):
-	Buy			= 1
-	Sell		= 2
-	BuyCover	= 3
-	SellShort	= 4
+    Buy = 1
+    Sell = 2
+    BuyCover = 3
+    SellShort = 4
 
 
 class SubmitStatus(Enum):
-	NotSubmitted	= 1
-	Submitted		= 2
-	Pending			= 3
-	Open			= 4
-	Paritial		= 5
-	Filled			= 6
-
-
+    NotSubmitted = 1
+    Submitted = 2
+    Pending = 3
+    Open = 4
+    Paritial = 5
+    Filled = 6
 
 
 class TimeInForce(Enum):
-	Day		= 0
-	GTC		= 1
-	OnClose	= 7
-
+    Day = 0
+    GTC = 1
+    OnClose = 7
 
 
 class Instrument:
-	"""Handle all the bullshit around an instrument
-	"""
-	def __str__(self):
-		return self.symbol
-
-
-
+    """Handle all the bullshit around an instrument"""
 
+    def __str__(self):
+        return self.symbol
 
 
 ### Pricing information
 
+
 class PriceType(Enum):
-	Market			= 1
-	Limit			= 2
-	Stop			= 3
-	StopLimit		= 4
-	StopLoss		= 5
-	TrailingStop	= 6
+    Market = 1
+    Limit = 2
+    Stop = 3
+    StopLimit = 4
+    StopLoss = 5
+    TrailingStop = 6
 
 
 class Pricing:
+    def __init__(self):
+        self._tag = {}
 
-	def __init__(self):
-		self._tag = {}
-
-	@property
-	def attributes(self):
-		return self._data
-
-
-	@property
-	def fixml(self):
-		return self._tag
-
-	def __eq__(self, other):
-		if isinstance(other, Pricing):
-			return \
-			(other.type_ == self.type_) and \
-			(other._data == self._data) and \
-			(other._tag == self._tag)
-		return False
+    @property
+    def attributes(self):
+        return self._data
 
+    @property
+    def fixml(self):
+        return self._tag
 
+    def __eq__(self, other):
+        if isinstance(other, Pricing):
+            return (
+                (other.type_ == self.type_)
+                and (other._data == self._data)
+                and (other._tag == self._tag)
+            )
+        return False
 
 
 class Market(Pricing):
-	def __init__(self):
-		super().__init__()
-		self.type_	= PriceType.Market
-		self._data	= { 'Typ': '1' }
-
-	def __str__(self):
-		"""Creates market price object.
-
-		"""
-		return 'Market'
+    def __init__(self):
+        super().__init__()
+        self.type_ = PriceType.Market
+        self._data = {"Typ": "1"}
 
+    def __str__(self):
+        """Creates market price object."""
+        return "Market"
 
 
 class Limit(Pricing):
-	def __init__ ( self, limpx ):
-		"""Creates a limit price object.
+    def __init__(self, limpx):
+        """Creates a limit price object.
 
-		Args:
+        Args:
 
-			limpx: the stop price
+                limpx: the stop price
 
-		"""
-		super().__init__()
-		self.px = round(float(limpx),2)
-		self.type_	= PriceType.Limit
-		self._data	= {
-			'Typ': '2',
-			'Px': str(self.px)
-		}
-
-	def __str__(self):
-		return 'Limit ${:.3f}'.format(self.px)
+        """
+        super().__init__()
+        self.px = round(float(limpx), 2)
+        self.type_ = PriceType.Limit
+        self._data = {"Typ": "2", "Px": str(self.px)}
 
+    def __str__(self):
+        return "Limit ${:.3f}".format(self.px)
 
 
 class Stop(Pricing):
+    def __init__(self, stoppx):
+        """Creates a stop price object.
 
-	def __init__ ( self, stoppx ):
-		"""Creates a stop price object.
-
-		Args:
+        Args:
 
-			stoppx: the stop price
+                stoppx: the stop price
 
-		"""
-		super().__init__()
-		self.stoppx = round(float(stoppx),2)
-		self.type_	= PriceType.Stop
-		self._data	= {
-			'Typ': '3',
-			'StopPx': str(self.stoppx)
-		}
-	def __str__(self):
-		return 'Stop ${:.3f}'.format(self.stoppx)
+        """
+        super().__init__()
+        self.stoppx = round(float(stoppx), 2)
+        self.type_ = PriceType.Stop
+        self._data = {"Typ": "3", "StopPx": str(self.stoppx)}
 
+    def __str__(self):
+        return "Stop ${:.3f}".format(self.stoppx)
 
 
 class StopLimit(Pricing):
-	def __init__ ( self, limpx, stoppx ):
-		"""Stop-limit price object.
+    def __init__(self, limpx, stoppx):
+        """Stop-limit price object.
 
-		Args:
+        Args:
 
-			limpx: limit price, to be used once stop price was reached
-			stoppx: stop price, to trigger limit price
-		"""
-		super().__init__()
-		self.px		= round(float(limpx),2)
-		self.stoppx	= round(float(stoppx),2)
-		self.type	= PriceType.StopLimit
-		self._data	= {
-			'Typ': '4',
-			'StopPx': str(self.stoppx),
-			'Px': str(self.px)
-		}
-
-	def __str__ ( self ):
-		return 'StopLimit (Stop ${0:.3f}, Limit ${1:.3f})'.format(self.px,self.stoppx)
+                limpx: limit price, to be used once stop price was reached
+                stoppx: stop price, to trigger limit price
+        """
+        super().__init__()
+        self.px = round(float(limpx), 2)
+        self.stoppx = round(float(stoppx), 2)
+        self.type = PriceType.StopLimit
+        self._data = {"Typ": "4", "StopPx": str(self.stoppx), "Px": str(self.px)}
 
+    def __str__(self):
+        return "StopLimit (Stop ${0:.3f}, Limit ${1:.3f})".format(self.px, self.stoppx)
 
 
 class TrailingStop(Pricing):
-
-	def __init__ ( self, use_pct, offset ):
-		"""Trailing stop price object.
-
-		Args:
-
-			use_pct: if true, treat offset as percent. Otherwise, treat it as a dollar quantity
-			offset: the trailing stop offset
-
-		"""
-		self.use_pct 	= use_pct
-		self.offset		= offset
-		self._tag = {'PegInstr': {
-			'OfstTyp': 1 if self.use_pct else 0,
-			'PegPxTyp': 1,
-			'OfstVal': self.offset
-		}}
-		self.type_	= PriceType.TrailingStop
-		self._data	= { 'Typ': 'P' }
-
-	def __str__ ( self ):
-		return 'Trailing Stop {0}{1}{2}'.format(
-			'$' if not self.use_pct else '',
-			('{:.1f}' if self.use_pct else '{:.3f}').format(self.offset),
-			'%' if self.use_pct else '',
-		)
-
-
-
-
+    def __init__(self, use_pct, offset):
+        """Trailing stop price object.
+
+        Args:
+
+                use_pct: if true, treat offset as percent. Otherwise, treat it as a dollar quantity
+                offset: the trailing stop offset
+
+        """
+        self.use_pct = use_pct
+        self.offset = offset
+        self._tag = {
+            "PegInstr": {
+                "OfstTyp": 1 if self.use_pct else 0,
+                "PegPxTyp": 1,
+                "OfstVal": self.offset,
+            }
+        }
+        self.type_ = PriceType.TrailingStop
+        self._data = {"Typ": "P"}
+
+    def __str__(self):
+        return "Trailing Stop {0}{1}{2}".format(
+            "$" if not self.use_pct else "",
+            ("{:.1f}" if self.use_pct else "{:.3f}").format(self.offset),
+            "%" if self.use_pct else "",
+        )
 
 
 class Option(Instrument):
-	def __init__(self, underlying, exp_date, strike, direction ):
-		self.type		='OPTION'
-		self.underlying = underlying.upper()
-		self.exp_date	= exp_date
-		self.strike		= strike
-		self.direction	= 'CALL' if 'c' in direction.lower() else 'PUT'
-
-		# Also get the option
-		self.symbol		= option_format (
-			symbol		= self.underlying,
-			exp_date	= self.exp_date,
-			strike		= self.strike,
-			direction	= self.direction
-		)
-
-	@property
-	def fixml ( self ):
-		return {
-			'Instrmt': {
-				'CFI'	: 'O' + self.direction[0],
-				'SecTyp': 'OPT',
-				'MatDt'	: self.exp_date + "T00:00:00.000-05:00",
-				'StrkPx': self.strike,
-				'Sym'	: self.underlying
-			}
-		}
+    def __init__(self, underlying, exp_date, strike, direction):
+        self.type = "OPTION"
+        self.underlying = underlying.upper()
+        self.exp_date = exp_date
+        self.strike = strike
+        self.direction = "CALL" if "c" in direction.lower() else "PUT"
+
+        # Also get the option
+        self.symbol = option_format(
+            symbol=self.underlying,
+            exp_date=self.exp_date,
+            strike=self.strike,
+            direction=self.direction,
+        )
+
+    @property
+    def fixml(self):
+        return {
+            "Instrmt": {
+                "CFI": "O" + self.direction[0],
+                "SecTyp": "OPT",
+                "MatDt": self.exp_date + "T00:00:00.000-05:00",
+                "StrkPx": self.strike,
+                "Sym": self.underlying,
+            }
+        }
+
 
 class Stock(Instrument):
-	def __init__(self,symbol):
-		self.type	='STOCK'
-		self.symbol = symbol.upper()
+    def __init__(self, symbol):
+        self.type = "STOCK"
+        self.symbol = symbol.upper()
 
-	@property
-	def fixml ( self ):
-		return {'Instrmt': { 'SecTyp': 'CS', 'Sym': self.symbol}}
+    @property
+    def fixml(self):
+        return {"Instrmt": {"SecTyp": "CS", "Sym": self.symbol}}
diff --git a/ally/Order/order.py b/ally/Order/order.py
index 609b672f..621a7fde 100644
--- a/ally/Order/order.py
+++ b/ally/Order/order.py
@@ -20,575 +20,481 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from enum		import Enum
-from ..utils	import (
-	option_format,
-	option_symbol,
-	option_strike,
-	option_maturity,
-	option_callput,
-)
-from .classes	import *
-from .utils		import transposeTree, parseTree
-
-
-
-
-
-
-
-
-
+from ..utils import option_callput, option_maturity, option_strike, option_symbol
+from .classes import *
+from .utils import parseTree, transposeTree
 
 
 class Order:
+    _otype_dict_reverse = {
+        OType.Order.value: "Order",
+        OType.Modify.value: "OrdCxlRplcReq",
+        OType.Cancel.value: "OrdCxlReq",
+    }
+
+    _side_dict = {
+        "buy": Side.Buy,
+        "sell": Side.Sell,
+        "sellshort": Side.SellShort,
+        "buycover": Side.BuyCover,
+    }
+
+    _time_dict = {
+        "day": TimeInForce.Day,
+        "gtc": TimeInForce.GTC,
+        "onclose": TimeInForce.OnClose,
+    }
 
-	_otype_dict_reverse = {
-		OType.Order.value	: "Order",
-		OType.Modify.value	: "OrdCxlRplcReq",
-		OType.Cancel.value	: "OrdCxlReq"
-	}
-
-	_side_dict = {
-		'buy':			Side.Buy,
-		'sell':			Side.Sell,
-		'sellshort':	Side.SellShort,
-		'buycover':		Side.BuyCover
-	}
-
-	_time_dict = {
-		'day':			TimeInForce.Day,
-		'gtc':			TimeInForce.GTC,
-		'onclose':		TimeInForce.OnClose
-	}
-
-
-
-	def __init__ ( self,
-		buysell: str =None,
-		symbol: str =None,
-		price=None,
-		qty: int =None,
-		time: int =None,
-		account=None,
-		type_=OType.Order,
-		orderid=None,
-		fixml=None
-	):
-		"""Creates an order.
-
-		Args:
-
-			buysell:
-				Specify the postion desired.
-
-
-			symbol:
-				Enter the symbol of the instrument to be traded.
-				You can use ally.utils.option_format(...) to generate the OCC-standard option symbol.
-
-
-			price:
-				Specify the pricing options for execution.
-
-
-			qty:
-				Specify the number of shares (or contracts, for options) to be purchased.
-				Accepts integers, not fractions.
-
-
-			time
-				Specify the time-in-force of the order.
-
-
-		"""
-		self.otype		= type_
-		self.account	= None
-		self.orderid	= None
-		self._status	= None
-
-		self.instrument	= None
-		self.pricing	= None
-		self.buysell	= None
-		self.time		= None
-		self.quantity	= 0
-
-
-		if fixml is not None:
-			# Constructor 1
-			self._from_str ( fixml=fixml )
-
-		else:
-			# Constructor 2
-			self._from_user (
-				buysell=buysell,
-				symbol=symbol,
-				price=price,
-				qty=qty,
-				time=time,
-				account=account,
-				orderid=orderid
-			)
-
-
-
-
-
-	@property
-	def convert_buysell ( self ):
-		"""Turns buysell type into string.
-		"""
-		x = {}
-
-
-		if self.buysell is not None:
-			v = self.buysell.value
-
-			if v == Side.Buy.value:
-				x = { 'Side'	:'1' }
-
-			elif v == Side.Sell.value:
-				x = { 'Side'	:'2' }
-
-			elif v == Side.BuyCover.value:
-				x = { 'Side'	: '1', 'AcctTyp'  : '5' }
-
-			elif v == Side.SellShort.value:
-				x = { 'Side'	: '5' }
-
-		return x
-
-
-
-
-
-
-
-	@property
-	def fixml ( self ):
-		"""Compiles the object into FIXML string.
-
-		Does not affect internal state of object
-		"""
-
-		d = {}
-
-		# Store account information for this call
-		if self.account is not None:
-			d['Acct'] = self.account
-
-		# Store order ID for this call
-		if self.orderid is not None:
-			d['OrigID'] = self.orderid
-
-		# Get instrument data
-		if self.instrument is not None:
-			d.update(self.instrument.fixml)
-
-		# Get fixml fields from our pricing object
-		if self.pricing is not None:
-			d.update(self.pricing.fixml)
-			d.update(self.pricing.attributes)
-
-		# Perform logic to transform our buy-sell into fixml fields
-		d.update(self.convert_buysell)
-
-		# Include Time fields
-		if self.time is not None:
-			# For cancel requests, tminforce = 0
-			if self.otype.value == OType.Cancel.value:
-				d['TmInForce'] = '0'
-			else:
-				d['TmInForce'] = self.time.value
-
-		# Include order quantity
-		if self.quantity != 0:
-			d['OrdQty'] = { 'Qty': self.quantity }
-
-
-
-		# Properly format our order
-		order = {
-			'xmlns': "http://www.fixprotocol.org/FIXML-5-0-SP2",
-			Order._otype_dict_reverse[self.otype.value]: d
-		}
-
-		# Rework our tree
-		return transposeTree (
-			order,			# The tree structure to turn into FIXML
-			name='FIXML',	# Name of root tag
-			stringify=True	# Please give us a string
-		)
-
-
-
-
-	@property
-	def status ( self ):
-		"""Execution status of this order.
-
-		None implies that this order hasn't been submitted for execution yet.
-
-		"""
-		return self._status
-
-
-
-
-
-
-	def set_buysell ( self, buysell ):
-		"""Specify the side of this order.
-
-		Can be viewed at obj.buysell
-
-		Args:
-
-			buysell:
-				one of ('buy','sell','sellshort','buycover'),
-				or the corresponding enum types.
-
-		"""
-
-		if isinstance(buysell, str):
-			buysell	= Order._side_dict[buysell.lower()]
-
-		self.buysell	= buysell
-
-
-
-
-
-	def set_orderid ( self, orderid ):
-		"""Specifies the order's ID.
-
-		Can be viewed at obj.orderid
-
-		"""
-		self.orderid = orderid
-
-
-
-
-
-	def set_account ( self, account ):
-		"""Specifies the account used to execute an order.
-
-		Users shouldn't really need to use this under normal circumstances, this
-		is handled by the ally object.
-
-		Can be viewed at obj.account
-
-		"""
-		self.account = int(str(account)[:8])
-
-
-
-
-
-
-	def set_symbol ( self, symbol: str ):
-		"""Sets the order's instrument.
-
-		Can be viewed at obj.instrument
-
-		"""
-		if len(symbol) > 15:
-			# Almost certainly an option, if not unintelligible
-
-			try:
-
-				# Extract the symbol
-				underlying	= option_symbol( symbol )
-
-				# Extract strike price
-				strike		= option_strike( symbol )
-
-				# Extract expiration date
-				exp_date	= option_maturity( symbol )
-
-				# Extract
-				callput		= option_callput( symbol )
-
-				# Wrap it up and spank it on the bottom!
-				self.instrument = Option (
-					direction	= callput,
-					underlying	= underlying,
-					exp_date	= exp_date,
-					strike		= strike
-				)
-
-			except:
-				raise
-
-		self.instrument = Stock(symbol=symbol)
-
-
-
-
-
-
-	def set_time ( self, time ):
-		"""Sets the order's time-in-force.
-
-		Can be viewed at obj.time
-
-		Args:
-
-			time:
-				must be one of ('day','gtc','onclose'), or the corresponding enums instances.
-
-		"""
-
-		# Handle strings
-		if isinstance(time, str):
-			time = Order._time_dict[time.lower()]
-		self.time = time
-
-
-
-
-
-	def set_quantity ( self, qty ):
-		"""Sets the order quantity.
-
-		Can be viewed at obj.quantity
-
-		"""
+    def __init__(
+        self,
+        buysell: str = None,
+        symbol: str = None,
+        price=None,
+        qty: int = None,
+        time: int = None,
+        account=None,
+        type_=OType.Order,
+        orderid=None,
+        fixml=None,
+    ):
+        """Creates an order.
 
-		self.quantity		= int(qty)
+        Args:
 
+                buysell:
+                        Specify the postion desired.
 
 
+                symbol:
+                        Enter the symbol of the instrument to be traded.
+                        You can use ally.utils.option_format(...) to generate the OCC-standard option symbol.
+
+
+                price:
+                        Specify the pricing options for execution.
+
+
+                qty:
+                        Specify the number of shares (or contracts, for options) to be purchased.
+                        Accepts integers, not fractions.
+
+
+                time
+                        Specify the time-in-force of the order.
+
+
+        """
+        self.otype = type_
+        self.account = None
+        self.orderid = None
+        self._status = None
+
+        self.instrument = None
+        self.pricing = None
+        self.buysell = None
+        self.time = None
+        self.quantity = 0
+
+        if fixml is not None:
+            # Constructor 1
+            self._from_str(fixml=fixml)
+
+        else:
+            # Constructor 2
+            self._from_user(
+                buysell=buysell,
+                symbol=symbol,
+                price=price,
+                qty=qty,
+                time=time,
+                account=account,
+                orderid=orderid,
+            )
 
-	def set_pricing ( self, priceobj ):
-		"""Sets the pricing information of an order.
+    @property
+    def convert_buysell(self):
+        """Turns buysell type into string."""
+        x = {}
 
-		Can be viewed at obj.pricing
+        if self.buysell is not None:
+            v = self.buysell.value
 
-		Args:
+            if v == Side.Buy.value:
+                x = {"Side": "1"}
 
-			priceobj:
-				Must be one of
-				ally.Order.Market(),
-				ally.Order.Limit(x),
-				ally.Order.Stop(x),
-				ally.Order.StopLimit(x,y),
-				ally.Order.TrailingStop(x,y)
+            elif v == Side.Sell.value:
+                x = {"Side": "2"}
 
-		"""
+            elif v == Side.BuyCover.value:
+                x = {"Side": "1", "AcctTyp": "5"}
 
-		self.pricing = priceobj
+            elif v == Side.SellShort.value:
+                x = {"Side": "5"}
 
+        return x
 
+    @property
+    def fixml(self):
+        """Compiles the object into FIXML string.
 
+        Does not affect internal state of object
+        """
 
+        d = {}
 
-	def imply_fixml_instrument( self, instrmt ):
+        # Store account information for this call
+        if self.account is not None:
+            d["Acct"] = self.account
 
-		sectyp = instrmt['SecTyp']
-		sym = instrmt.pop('Sym')
+        # Store order ID for this call
+        if self.orderid is not None:
+            d["OrigID"] = self.orderid
 
-		if sectyp == 'OPT':
-			# Option
-			exp_date	= instrmt.pop('MatDt')[:10]
-			strike		= instrmt.pop('StrkPx')
-			direction	= 'put' if instrmt.pop('CFI') == 'OP' else 'call'
-			sym = option_format(
-				symbol		= sym,
-				exp_date	= exp_date,
-				strike		= strike,
-				direction	= direction
-			)
+        # Get instrument data
+        if self.instrument is not None:
+            d.update(self.instrument.fixml)
 
-		self.set_symbol ( sym )
+        # Get fixml fields from our pricing object
+        if self.pricing is not None:
+            d.update(self.pricing.fixml)
+            d.update(self.pricing.attributes)
 
+        # Perform logic to transform our buy-sell into fixml fields
+        d.update(self.convert_buysell)
 
+        # Include Time fields
+        if self.time is not None:
+            # For cancel requests, tminforce = 0
+            if self.otype.value == OType.Cancel.value:
+                d["TmInForce"] = "0"
+            else:
+                d["TmInForce"] = self.time.value
 
+        # Include order quantity
+        if self.quantity != 0:
+            d["OrdQty"] = {"Qty": self.quantity}
 
+        # Properly format our order
+        order = {
+            "xmlns": "http://www.fixprotocol.org/FIXML-5-0-SP2",
+            Order._otype_dict_reverse[self.otype.value]: d,
+        }
 
+        # Rework our tree
+        return transposeTree(
+            order,  # The tree structure to turn into FIXML
+            name="FIXML",  # Name of root tag
+            stringify=True,  # Please give us a string
+        )
 
-	def __str__(self):
-		return '({0}) {1} {2} units of "{3}" {4}, {5}'.format(
-			self.otype,
-			self.buysell,
-			self.quantity,
-			self.instrument,
-			self.time,
-			self.pricing
-		)
+    @property
+    def status(self):
+        """Execution status of this order.
 
+        None implies that this order hasn't been submitted for execution yet.
 
+        """
+        return self._status
 
+    def set_buysell(self, buysell):
+        """Specify the side of this order.
 
+        Can be viewed at obj.buysell
 
+        Args:
 
-	def _from_str ( self, fixml ):
-		"""Constructer 1)
-		Read FIXML string into this object
-		"""
-		xml = parseTree(fixml)['FIXML']
-		xml['Order'] = xml.pop('ExecRpt')
+                buysell:
+                        one of ('buy','sell','sellshort','buycover'),
+                        or the corresponding enum types.
 
-		o = xml['Order']
+        """
 
-		o.pop('ID')
-		self.set_orderid ( o.pop('OrdID') )
+        if isinstance(buysell, str):
+            buysell = Order._side_dict[buysell.lower()]
 
-		self.set_account ( o.pop('Acct') )
+        self.buysell = buysell
 
-		self.set_quantity ( o.get('OrdQty').pop('Qty') )
+    def set_orderid(self, orderid):
+        """Specifies the order's ID.
 
+        Can be viewed at obj.orderid
 
-		# Set self.buysell
-		side = o.pop('Side',None)
-		actp = o.pop('AcctTyp',None)
+        """
+        self.orderid = orderid
 
-		if side == '1':
-			if actp is None:
-				self.set_buysell('buy')
-			else:
-				self.set_buysell('buycover')
-		elif side == '2':
-			self.set_buysell('sell')
-		elif side == '5':
-			self.set_buysell('sellshort')
+    def set_account(self, account):
+        """Specifies the account used to execute an order.
 
+        Users shouldn't really need to use this under normal circumstances, this
+        is handled by the ally object.
 
-		# Time In Force (Day, GTC, OnClose)
-		tminforce = o.pop('TmInForce')
-		if tminforce == '0':
-			self.set_time('day')
-		elif tminforce == '1':
-			self.set_time('gtc')
-		elif tminforce == '7':
-			self.set_time('onclose')
+        Can be viewed at obj.account
 
+        """
+        self.account = int(str(account)[:8])
 
-		# Parse the pricing type of order
-		typ = o.pop('Typ')
-		px  = o.pop('Px',None)
-		stoppx = o.pop('StopPx',None)
-		p = None
-		# Market
-		if typ == '1':
-		 	p = Market()
-		# Limit
-		elif typ == '2':
-			p = Limit(px)
-		# Simple Stop
-		elif typ == '3':
-			p = Stop(stoppx)
-		# Stop limit
-		elif typ == '4':
-			p = StopLimit ( limpx=px, stoppx=stoppx )
+    def set_symbol(self, symbol: str):
+        """Sets the order's instrument.
 
-		# Trailing Stop
-		elif typ == 'P':
-			tag		= o.pop('PegInstr')
-			use_pct = ( tag.pop('OfstTyp') == 1 ) # Cast to boolean
-			offset	= tag.pop('OfstVal')
-			p		= TrailingStop ( use_pct=use_pct, offset=offset )
+        Can be viewed at obj.instrument
 
-		self.set_pricing ( p )
+        """
+        if len(symbol) > 15:
+            # Almost certainly an option, if not unintelligible
 
+            try:
 
+                # Extract the symbol
+                underlying = option_symbol(symbol)
 
+                # Extract strike price
+                strike = option_strike(symbol)
 
-		instrmt = o.pop('Instrmt')
-		self.imply_fixml_instrument(instrmt)
+                # Extract expiration date
+                exp_date = option_maturity(symbol)
 
-		self._status = o
+                # Extract
+                callput = option_callput(symbol)
 
+                # Wrap it up and spank it on the bottom!
+                self.instrument = Option(
+                    direction=callput,
+                    underlying=underlying,
+                    exp_date=exp_date,
+                    strike=strike,
+                )
 
+            except:
+                raise
 
+        self.instrument = Stock(symbol=symbol)
 
+    def set_time(self, time):
+        """Sets the order's time-in-force.
 
+        Can be viewed at obj.time
 
-	def _from_user ( self, buysell, symbol, price, qty, time, account, orderid ):
-		"""Constructer 2) Read multiple inputs from user
+        Args:
 
-		buysell:
-			Specify the postion desired.
+                time:
+                        must be one of ('day','gtc','onclose'), or the corresponding enums instances.
 
-			- 'buy' 		Buy to open a long position
-			- 'sell'		Sell to close a long position
-			- 'sellshort'	Sell to open a short position
-			- 'buycover'	Buy to close a short position
+        """
 
+        # Handle strings
+        if isinstance(time, str):
+            time = Order._time_dict[time.lower()]
+        self.time = time
 
-		symbol:
-			Enter the symbol of the instrument to be traded.
-			  You can use ally.utils.option_format(...)
-				to generate the OCC-standard option symbol
+    def set_quantity(self, qty):
+        """Sets the order quantity.
 
-			- 'spy'					Equivalent to 'SPY'
-			- 'SPY200529C00305000'	SPY 2020-05-29 Call @ $305.00
+        Can be viewed at obj.quantity
 
+        """
 
-		price:
-			Specify the pricing options for execution.
+        self.quantity = int(qty)
 
-			- Market()					Market (whatever price the market gives you)
-			- Limit(123.45)				Limit (execute trade no less-favorably than value)
-			- Stop(123.45)				Stop (execute a market order once the price passes this value)
-			- StopLimit (				Stop Limit (Once the stop price is reached, submit a limit order)
-				limpx = 123.45,
-				stoppx = 120.00
-			)
-			- StopLoss (				Stop Loss order (same as trailing stop)
-				pct = True, [default]		specify whether to treat stop as percent or dollar value
-				stop=5.0
-			)
+    def set_pricing(self, priceobj):
+        """Sets the pricing information of an order.
 
+        Can be viewed at obj.pricing
 
-		qty:
-			Specify the number of shares (or contracts, for options)
-				to be purchased.
+        Args:
 
-			- 10	Accepts integers, no fractions though
+                priceobj:
+                        Must be one of
+                        ally.Order.Market(),
+                        ally.Order.Limit(x),
+                        ally.Order.Stop(x),
+                        ally.Order.StopLimit(x,y),
+                        ally.Order.TrailingStop(x,y)
 
+        """
 
-		time:
-			Specify the time-in-force of the order.
+        self.pricing = priceobj
 
-			- 'day'				# Good-For-Day
-			- 'gtc'				# Good-'till-Cancelled
-			- 'marketonclose'	# Market-On-Close
-		"""
+    def imply_fixml_instrument(self, instrmt):
 
+        sectyp = instrmt["SecTyp"]
+        sym = instrmt.pop("Sym")
 
-		# BUYSELL INFO
-		if buysell is not None:
-			self.set_buysell(buysell)
+        if sectyp == "OPT":
+            # Option
+            exp_date = instrmt.pop("MatDt")[:10]
+            strike = instrmt.pop("StrkPx")
+            direction = "put" if instrmt.pop("CFI") == "OP" else "call"
+            sym = option_format(
+                symbol=sym, exp_date=exp_date, strike=strike, direction=direction
+            )
 
+        self.set_symbol(sym)
 
-		# TIME INFO
-		if qty is not None:
-			self.set_quantity(qty)
+    def __str__(self):
+        return '({0}) {1} {2} units of "{3}" {4}, {5}'.format(
+            self.otype,
+            self.buysell,
+            self.quantity,
+            self.instrument,
+            self.time,
+            self.pricing,
+        )
 
+    def _from_str(self, fixml):
+        """Constructor 1)
+        Read FIXML string into this object
+        """
+        xml = parseTree(fixml)["FIXML"]
+        xml["Order"] = xml.pop("ExecRpt")
 
-		# TIME INFO
-		if time is not None:
-			self.set_time ( time )
+        o = xml["Order"]
 
+        o.pop("ID")
+        self.set_orderid(o.pop("OrdID"))
 
-		# INSTRUMENT INFO
-		if symbol is not None:
-			self.set_symbol ( symbol )
+        self.set_account(o.pop("Acct"))
+
+        self.set_quantity(o.get("OrdQty").pop("Qty"))
+
+        # Set self.buysell
+        side = o.pop("Side", None)
+        actp = o.pop("AcctTyp", None)
 
+        if side == "1":
+            if actp is None:
+                self.set_buysell("buy")
+            else:
+                self.set_buysell("buycover")
+        elif side == "2":
+            self.set_buysell("sell")
+        elif side == "5":
+            self.set_buysell("sellshort")
 
-		# TIME INFO
-		if price is not None:
-			self.set_pricing ( price )
+        # Time In Force (Day, GTC, OnClose)
+        tminforce = o.pop("TmInForce")
+        if tminforce == "0":
+            self.set_time("day")
+        elif tminforce == "1":
+            self.set_time("gtc")
+        elif tminforce == "7":
+            self.set_time("onclose")
 
+        # Parse the pricing type of order
+        typ = o.pop("Typ")
+        px = o.pop("Px", None)
+        stoppx = o.pop("StopPx", None)
+        p = None
+        # Market
+        if typ == "1":
+            p = Market()
+        # Limit
+        elif typ == "2":
+            p = Limit(px)
+        # Simple Stop
+        elif typ == "3":
+            p = Stop(stoppx)
+        # Stop limit
+        elif typ == "4":
+            p = StopLimit(limpx=px, stoppx=stoppx)
+
+        # Trailing Stop
+        elif typ == "P":
+            tag = o.pop("PegInstr")
+            use_pct = tag.pop("OfstTyp") == 1  # Cast to boolean
+            offset = tag.pop("OfstVal")
+            p = TrailingStop(use_pct=use_pct, offset=offset)
+
+        self.set_pricing(p)
+
+        instrmt = o.pop("Instrmt")
+        self.imply_fixml_instrument(instrmt)
+
+        self._status = o
+
+    def _from_user(self, buysell, symbol, price, qty, time, account, orderid):
+        """Constructor 2) Read multiple inputs from user
+
+        buysell:
+            Specify the position desired.
+
+            - 'buy'         Buy to open a long position
+            - 'sell'        Sell to close a long position
+            - 'sellshort'   Sell to open a short position
+            - 'buycover'    Buy to close a short position
+
+
+
+        symbol:
+            Enter the symbol of the instrument to be traded.
+              You can use ally.utils.option_format(...)
+                to generate the OCC-standard option symbol
+
+            - 'spy'                 Equivalent to 'SPY'
+            - 'SPY200529C00305000'  SPY 2020-05-29 Call @ $305.00
+
+        price:
+            Specify the pricing options for execution.
+
+            .. code-block:: python
+                # Market (whatever price the market gives you)
+                Market()
+
+                # Limit (execute trade no less-favorably than value)
+                Limit(123.45)
+
+                # Stop (execute a market order once the price passes this value)
+                Stop(123.45)
+
+                # Stop Limit (Once the stop price is reached, submit a limit order)
+                StopLimit(
+                    limpx = 123.45,
+                    stoppx = 120.00
+                )
+                # Stop Loss order (same as trailing stop)
+                StopLoss(
+                    # [default] specify whether to treat stop as percent or dollar value
+                    pct = True,
+                    stop=5.0
+                )
+
+
+        qty:
+            Specify the number of shares (or contracts, for options)
+                to be purchased.
+
+            - 10    Accepts integers, no fractions though
+
+
+        time:
+            Specify the time-in-force of the order.
+
+            - 'day'             # Good-For-Day
+            - 'gtc'             # Good-'till-Cancelled
+            - 'marketonclose'   # Market-On-Close
+        """
+
+        # BUYSELL INFO
+        if buysell is not None:
+            self.set_buysell(buysell)
 
-		if account is not None:
-			self.set_account ( account )
+        # TIME INFO
+        if qty is not None:
+            self.set_quantity(qty)
 
+        # TIME INFO
+        if time is not None:
+            self.set_time(time)
 
-		if orderid is not None:
-			self.set_orderid ( orderid )
+        # INSTRUMENT INFO
+        if symbol is not None:
+            self.set_symbol(symbol)
 
+        # TIME INFO
+        if price is not None:
+            self.set_pricing(price)
 
+        if account is not None:
+            self.set_account(account)
 
+        if orderid is not None:
+            self.set_orderid(orderid)
diff --git a/ally/Order/utils.py b/ally/Order/utils.py
index 2e962b55..d03259d5 100644
--- a/ally/Order/utils.py
+++ b/ally/Order/utils.py
@@ -23,127 +23,99 @@
 import xml.etree.cElementTree as ET
 
 
-def shouldIgnore ( s ):
-	"""Should we ignore the key s?
-	(Right now, returns true if s takes the form
-	"__xxxxx...", prepended by two '_' chars
-	"""
-	return len(s) > 1 and s[:2] == '__'
+def shouldIgnore(s):
+    """Should we ignore the key s?
+    (Right now, returns true if s takes the form
+    "__xxxxx...", prepended by two '_' chars
+    """
+    return len(s) > 1 and s[:2] == "__"
 
 
+def woodChipper(tree):
+    """Given a tree structure,
+    sort out the leaves from the subtrees (and also aggregate all the other junk)
+    """
+    leaves = []
+    trees = []
 
+    for k, v in tree.items():
 
-def woodChipper ( tree ):
-	"""Given a tree structure,
-	sort out the leaves from the subtrees (and also aggregate all the other junk)
-	"""
-	leaves	= []
-	trees	= []
+        if not shouldIgnore(k):
 
-	for k,v in tree.items():
+            # Pull out the subtrees
+            if isinstance(v, dict):
+                trees.append((k, v))
 
-		if not shouldIgnore(k):
+            # Pull out the leaves
+            else:
+                leaves.append((k, str(v)))
 
-			# Pull out the subtrees
-			if isinstance(v, dict):
-				trees.append ( (k,v) )
+    return leaves, trees
 
 
-			# Pull out the leaves
-			else:
-				leaves.append ( (k,str(v)) )
+def _transposeTreeHelper(tree, name="unnamed_tree", work=None):
+    """Recursive steps of vvvv"""
 
+    # Sort all this stuff out
+    leaves, trees = woodChipper(tree)
 
-	return leaves, trees
+    # Create this current object
+    root = ET.SubElement(work, name, attrib=dict(leaves))
 
+    # Now add all of our branches
+    for name, subtree in trees:
 
+        # Now pass this root object off to the helper
+        _transposeTreeHelper(subtree, name=name, work=root)
 
 
+def transposeTree(
+    tree,
+    name="unnamed_tree",
+    stringify=True,
+):
+    """Give me a nested dictionary structure, where at each level:
 
+    - Leaves should become XML attributes
+    - Subtrees become subtags
+    """
 
-def _transposeTreeHelper ( tree, name="unnamed_tree", work=None ):
-	"""Recursive steps of vvvv
-	"""
+    # Sort all this stuff out
+    leaves, trees = woodChipper(tree)
 
-	# Sort all this stuff out
-	leaves, trees = woodChipper ( tree )
+    # Create the root element, and add any needed leaves
+    root = ET.Element(name, attrib=dict(leaves))
 
+    # Now add all of our branches
+    for name, subtree in trees:
 
-	# Create this current object
-	root = ET.SubElement(
-		work,
-		name,
-		attrib = dict(leaves)
-	)
+        # Now pass this root object off to the helper
+        _transposeTreeHelper(subtree, name=name, work=root)
 
+    # And return the new tree
+    if stringify:
+        return ET.tostring(root)
 
-	# Now add all of our branches
-	for name, subtree in trees:
+    # Return raw tree
+    else:
+        return root
 
-		# Now pass this root object off to the helper
-		_transposeTreeHelper ( subtree, name=name, work=root )
 
+def fixTag(tag):
+    return tag.split("}", 1)[-1]
 
 
+def parseTree(tree):
 
+    if isinstance(tree, str):
+        tree = ET.fromstring(tree)
 
+    if tree is None:
+        return {}
 
+    x = tree.attrib
 
-def transposeTree ( tree, name="unnamed_tree", stringify=True, ):
-	"""Give me a nested dictionary structure, where at each level:
+    for child in tree:
+        x = {**x, **parseTree(child)}
 
-		- Leaves should become XML attributes
-		- Subtrees become subtags
-	"""
-
-	# Sort all this stuff out
-	leaves, trees = woodChipper ( tree )
-
-
-	# Create the root element, and add any needed leaves
-	root = ET.Element(
-		name,
-		attrib = dict(leaves)
-	)
-
-	# Now add all of our branches
-	for name, subtree in trees:
-
-		# Now pass this root object off to the helper
-		_transposeTreeHelper ( subtree, name=name, work=root )
-
-
-	# And return the new tree
-	if stringify:
-		return ET.tostring(root)
-
-	# Return raw tree
-	else:
-		return root
-
-
-
-
-
-
-
-def fixTag ( tag ):
-	return tag.split('}',1)[-1]
-
-
-
-def parseTree ( tree ):
-
-	if isinstance(tree, str):
-		tree = ET.fromstring(tree)
-
-	if tree is None:
-		return {}
-		
-	x = tree.attrib
-
-	for child in tree:
-		x = { **x, **parseTree(child) }
-	
-
-	return  { fixTag(tree.tag) : x }
+    return {fixTag(tree.tag): x}
diff --git a/ally/Quote/__init__.py b/ally/Quote/__init__.py
index ec670844..7f08c1bd 100644
--- a/ally/Quote/__init__.py
+++ b/ally/Quote/__init__.py
@@ -20,7 +20,7 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from .quote			import quote
-from .stream		import stream
-from .timesales		import timesales
-from .toplists		import toplists
+from .quote import quote
+from .stream import stream
+from .timesales import timesales
+from .toplists import toplists
diff --git a/ally/Quote/quote.py b/ally/Quote/quote.py
index 678917ce..4d766931 100644
--- a/ally/Quote/quote.py
+++ b/ally/Quote/quote.py
@@ -20,171 +20,153 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class Quote(AuthenticatedEndpoint):
+    _type = RequestType.Quote
+    _resource = "market/ext/quotes.json"
+    _method = "POST"
+    _symbols = []
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        quotes = response["quotes"]["quote"]
 
+        if not isinstance(quotes, list):
+            quotes = [quotes]
 
-class Quote ( AuthenticatedEndpoint ):
-	_type		= RequestType.Quote
-	_resource	= 'market/ext/quotes.json'
-	_method		= 'POST'
-	_symbols	= []
+        # and return it to the world
+        return quotes
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
+        if "symbols" not in kwargs.keys():
+            raise KeyError(
+                "Please specify symbols, and pass in list of symbols (or string)"
+            )
+        symbols = kwargs.get("symbols", [])
+        fields = kwargs.get("fields", [])
 
+        # Correctly format Symbols, also store split up symbols
+        if type(symbols) == type(""):
+            # We were passed string
+            fmt_symbols = symbols
+            symbols = symbols.split(",")
+        else:
+            # We were passed list
+            fmt_symbols = ",".join(symbols)
 
+        if isinstance(fields, str):
+            # Fields must have been in format 'x,y,z,...'
+            fields = fields.split(",")
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		quotes = response['quotes']['quote']
+        if "symbol" not in fields and len(fields):
+            fields += ["symbol"]
 
-		if not isinstance(quotes,list):
-			quotes = [quotes]
+        fmt_fields = ",".join(fields)
 
-		# and return it to the world
-		return quotes
+        # Create request paramters according to how we need them
+        params = {"symbols": fmt_symbols}
 
+        if fields != []:
+            params["fids"] = fmt_fields
 
+        data = None
+        # return params, data
+        return data, params
 
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
+        # Create dataframe from our dataset
+        df = (
+            pd.DataFrame(raw)
+            .replace({"na": None})
+            .apply(
+                # And also cast relevent fields to numeric values
+                pd.to_numeric,
+                errors="ignore",
+            )
+            .set_index("symbol")
+        )
 
-		if 'symbols' not in kwargs.keys():
-			raise KeyError('Please specify symbols, and pass in list of symbols (or string)')
-		symbols	= kwargs.get('symbols',[])
-		fields	= kwargs.get('fields',[])
+        return df
 
 
-		# Correctly format Symbols, also store split up symbols
-		if type(symbols) == type(""):
-			# We were passed string
-			fmt_symbols = symbols
-			symbols = symbols.split(',')
-		else:
-			# We were passed list
-			fmt_symbols = ','.join(symbols)
+def quote(
+    self, symbols: list = [], fields: list = [], dataframe=True, block: bool = True
+):
+    """Gets the most current market data on the price of a symbol.
 
+            Args:
+                    symbols:
 
-		if isinstance(fields,str):
-			# Fields must have been in format 'x,y,z,...'
-			fields = fields.split(',')
+                            string or list of strings, each string a symbol to be queried.
+                            Notice symbols=['spy'], symbols='spy both work
 
-		if 'symbol' not in fields:
-			fields += ['symbol']
+                    fields:
 
+                            string or list of strings, each string a field to be grabbed.
+                            By default, get all fields
 
-		fmt_fields = ','.join(fields)
+                    dataframe:
 
+                            flag, specifies whether to return data in pandas dataframe
+                            or flat list of dictionaries.
 
-		# Create request paramters according to how we need them
-		params = { 'symbols':fmt_symbols }
+                    block:
+                            Specify whether to block thread if request exceeds rate limit
 
-		if fields != []:
-			params['fids'] = fmt_fields
+            Returns:
+                    Depends on dataframe flag. Will return pandas dataframe, or possibly
+                    list of dictionaries, each one a single quote.
 
+            Raises:
+                    RateLimitException: If block=False, rate limit problems will be raised
 
+            Examples:
 
-		data = None
-		# return params, data
-		return data, params
+    .. code-block:: python
 
+            # Get the quotes in dataframe format
+            #  Each row will only have elements bid, ask, and last
+            quotes = a.quote(
+                    symbols=['spy','gLD','F','Ibm'], # not case sensitive
+                    fields=['bid','ask,'last'],
+            )
+            # Access a specific symbol by the dataframe
+            print(quotes.loc['SPY'])
 
 
 
+    .. code-block:: python
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+            # Get the quotes in dataframe format
+            quotes = a.quote(
+                    'AAPL',
+                    dataframe=False
+            )
+            # Access a specific symbol in the dict
+            print(quotes['AAPL'])
 
-		# Create dataframe from our dataset
-		df = pd.DataFrame( raw ).replace({'na':None}).apply(
-			# And also cast relevent fields to numeric values
-			pd.to_numeric,
-			errors='ignore'
-		).set_index('symbol')
+    """
 
-		return df
+    result = Quote(
+        auth=self.auth,
+        account_nbr=self.account_nbr,
+        symbols=symbols,
+        fields=fields,
+        block=block,
+    ).request()
 
+    if dataframe:
+        try:
+            result = Quote.DataFrame(result)
+        except:
+            raise
 
-
-
-
-def quote ( self, symbols: list =[], fields: list =[], dataframe=True, block: bool = True ):
-	"""Gets the most current market data on the price of a symbol.
-
-	Args:
-		symbols:
-
-			string or list of strings, each string a symbol to be queried.
-			Notice symbols=['spy'], symbols='spy both work
-
-		fields:
-
-			string or list of strings, each string a field to be grabbed.
-			By default, get all fields
-
-		dataframe:
-
-			flag, specifies whether to return data in pandas dataframe
-			or flat list of dictionaries.
-
-		block:
-			Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		Depends on dataframe flag. Will return pandas dataframe, or possibly
-		list of dictionaries, each one a single quote.
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Examples:
-
-.. code-block:: python
-
-	# Get the quotes in dataframe format
-	#  Each row will only have elements bid, ask, and last
-	quotes = a.quote(
-		symbols=['spy','gLD','F','Ibm'], # not case sensitive
-		fields=['bid','ask,'last'],
-	)
-	# Access a specific symbol by the dataframe
-	print(quotes.loc['SPY'])
-
-
-
-.. code-block:: python
-
-	# Get the quotes in dataframe format
-	quotes = a.quote(
-		'AAPL',
-		dataframe=False
-	)
-	# Access a specific symbol in the dict
-	print(quotes['AAPL'])
-
-	"""
-
-	result = Quote(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		symbols		= symbols,
-		fields		= fields,
-		block		= block
-	).request()
-
-
-	if dataframe:
-		try:
-			result = Quote.DataFrame ( result )
-		except:
-			raise
-
-
-	return result
+    return result
diff --git a/ally/Quote/stream.py b/ally/Quote/stream.py
index 5ffd5be5..c741bad9 100644
--- a/ally/Quote/stream.py
+++ b/ally/Quote/stream.py
@@ -20,89 +20,71 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import StreamEndpoint, RequestType
-import json
+from ..Api import RequestType, StreamEndpoint
 
 
+class Stream(StreamEndpoint):
+    _type = RequestType.Quote
+    _resource = "market/quotes.json"
+    _method = "POST"
+    _symbols = []
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
+        symbols = kwargs.get("symbols", [])
 
-class Stream ( StreamEndpoint ):
-	_type		= RequestType.Quote
-	_resource	= 'market/quotes.json'
-	_method		= 'POST'
-	_symbols	= []
-
-
-
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-
-		symbols	= kwargs.get('symbols',[])
-
-
-		# Correctly format Symbols, also store split up symbols
-		if type(symbols) == type(""):
-			# We were passed string
-			fmt_symbols = symbols
-			symbols = symbols.split(',')
-		else:
-			# We were passed list
-			fmt_symbols = ','.join(symbols)
-
-
-
-		# Store symbols, so we can zip them back up with
-		#  the response object
-		symbols = [ s.upper() for s in symbols ]
-		self._symbols = symbols
-
-		# For aesthetics...
-		fmt_symbols = fmt_symbols.upper()
-
-		# Create request POST data
-		data = { 'symbols':fmt_symbols }
-
-		params = None
-		return params, data
-
-
+        # Correctly format Symbols, also store split up symbols
+        if type(symbols) == type(""):
+            # We were passed string
+            fmt_symbols = symbols
+            symbols = symbols.split(",")
+        else:
+            # We were passed list
+            fmt_symbols = ",".join(symbols)
 
+        # Store symbols, so we can zip them back up with
+        #  the response object
+        symbols = [s.upper() for s in symbols]
+        self._symbols = symbols
 
+        # For aesthetics...
+        fmt_symbols = fmt_symbols.upper()
 
+        # Create request POST data
+        data = {"symbols": fmt_symbols}
 
+        params = None
+        return params, data
 
 
 # stream = template(Stream)
-def stream ( self, symbols: list =[] ):
-	"""Live-streams market quotes for up to 256 stock and options.
+def stream(self, symbols: list = []):
+    """Live-streams market quotes for up to 256 stock and options.
 
-	The stream generator that yields dictionaries. Specify one or more
-	symbols, and the stream object establishes a connection with the API servers,
-	then starts returning symbol-keyed quote objects in real-time.
+            The stream generator that yields dictionaries. Specify one or more
+            symbols, and the stream object establishes a connection with the API servers,
+            then starts returning symbol-keyed quote objects in real-time.
 
-	Args:
-		symbols:
-			string or list of strings, each string a symbol to be queried.
-			Notice symbols=['spy'], symbols='spy both work.
+            Args:
+                    symbols:
+                            string or list of strings, each string a symbol to be queried.
+                            Notice symbols=['spy'], symbols='spy both work.
 
-	Returns:
-		A generator
+            Returns:
+                    A generator
 
-	Example:
+            Example:
 
-.. code-block:: python
+    .. code-block:: python
 
-		for quote in a.stream('tsla'):
-			print(quote)
+                    for quote in a.stream('tsla'):
+                            print(quote)
 
-	"""
+    """
 
-	result = Stream(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		symbols		= symbols
-	).request()
+    result = Stream(
+        auth=self.auth, account_nbr=self.account_nbr, symbols=symbols
+    ).request()
 
-	return result
+    return result
diff --git a/ally/Quote/timesales.py b/ally/Quote/timesales.py
index 47432d0a..ff7bcedd 100644
--- a/ally/Quote/timesales.py
+++ b/ally/Quote/timesales.py
@@ -20,155 +20,139 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class Timesales(AuthenticatedEndpoint):
+    _type = RequestType.Quote
+    _resource = "market/timesales.json"
+    _method = "GET"
+    _symbols = []
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        quotes = response["quotes"]["quote"]
 
+        # and return it to the world
+        return quotes
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
-class Timesales ( AuthenticatedEndpoint ):
-	_type		= RequestType.Quote
-	_resource	= 'market/timesales.json'
-	_method		= 'GET'
-	_symbols	= []
-
-
-
-
-
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		quotes = response['quotes']['quote']
-
-		# and return it to the world
-		return quotes
-
-
-
-
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-
-		if 'symbols' not in kwargs.keys():
-			raise KeyError('Please specify a symbol. Use symbols="sym"')
-		symbols	= kwargs.get('symbols',"")
-
-		# Interval
-		interval = kwargs.get('interval','5min')
-
-		# Start date
-		startdate = kwargs.get('startdate')
-
-		# End date
-		enddate = kwargs.get('enddate')
-
-		params = {
-			'symbols':symbols,
-			'interval':interval,
-			'startdate':startdate,
-			'enddate':enddate
-		}
-
-		data = None
-		return params, data
-
-
-
-
-
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
-
-		# Create dataframe from our dataset
-		df = pd.DataFrame( raw ).apply(
-			# And also cast relevent fields to numeric values
-			pd.to_numeric,
-			errors='ignore'
-		)
-		return df
-
-
-
-
-
-
-def timesales ( self, symbols: str, startdate: str, enddate: str,
-	interval: str = '5min', dataframe=True, block: bool = True ):
-	"""Gets the most current market data on the price of a symbol.
-
-	Gets a dataset of price points and other information for a symbol.
-	Option symbols unfortunately are not accessible from this interface,
-	so only stocks can be used.
-
-	Must specify the start and end date on the range requested.
-	The API can only return 5 days of intraday prices, the 5 most
-	recent trading days, the current day included. Partial data
-	will be returned for the current day, if the query occurs
-	during the trading hours of a trading day.
-
-	Start and end date should take the form "2019-12-31". This
-	interface will be preserved, but datetime instances may be accepted
-	in the future as well.
-
-	Args:
-		symbols:
-			single symbol to query historical quotes on
-
-		startdate:
-			string, the start date of interval
-
-		enddate:
-			string, end date of the interval
-
-		interval:
-			string, specify the size of each time interval.
-			Must be one of ('1min','5min','15min')
-
-		dataframe:
-			flag, specifies whether to return data in pandas dataframe or flat list of dictionaries.
-
-		block: Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		Depends on dataframe flag. Will return pandas dataframe, or possibly
-		list of dictionaries, each one a single quote.
-
-	Raises:
-		RateLimitException: If block=False, rate limit problems will be raised
-
-	Examples:
-
-.. code-block:: python
-
-	gld_history = a.timesales (
-		symbols = 'gld',
-		startdate = '2020-08-21',
-		enddate = '2020-08-19',
-	)
-	print(gld_history.loc[0])
-
-	"""
-	result = Timesales(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		symbols		= symbols,
-		interval	= interval,
-		startdate	= startdate,
-		enddate		= enddate,
-		block		= block
-	).request()
-
-
-	if dataframe:
-		try:
-			result = Timesales.DataFrame ( result )
-		except:
-			raise
-	
-
-	return result
+        if "symbols" not in kwargs.keys():
+            raise KeyError('Please specify a symbol. Use symbols="sym"')
+        symbols = kwargs.get("symbols", "")
+
+        # Interval
+        interval = kwargs.get("interval", "5min")
+
+        # Start date
+        startdate = kwargs.get("startdate")
+
+        # End date
+        enddate = kwargs.get("enddate")
+
+        params = {
+            "symbols": symbols,
+            "interval": interval,
+            "startdate": startdate,
+            "enddate": enddate,
+        }
+
+        data = None
+        return params, data
+
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
+
+        # Create dataframe from our dataset
+        df = pd.DataFrame(raw).apply(
+            # And also cast relevent fields to numeric values
+            pd.to_numeric,
+            errors="ignore",
+        )
+        return df
+
+
+def timesales(
+    self,
+    symbols: str,
+    startdate: str,
+    enddate: str,
+    interval: str = "5min",
+    dataframe=True,
+    block: bool = True,
+):
+    """Gets the most current market data on the price of a symbol.
+
+            Gets a dataset of price points and other information for a symbol.
+            Option symbols unfortunately are not accessible from this interface,
+            so only stocks can be used.
+
+            Must specify the start and end date on the range requested.
+            The API can only return 5 days of intraday prices, the 5 most
+            recent trading days, the current day included. Partial data
+            will be returned for the current day, if the query occurs
+            during the trading hours of a trading day.
+
+            Start and end date should take the form "2019-12-31". This
+            interface will be preserved, but datetime instances may be accepted
+            in the future as well.
+
+            Args:
+                    symbols:
+                            single symbol to query historical quotes on
+
+                    startdate:
+                            string, the start date of interval
+
+                    enddate:
+                            string, end date of the interval
+
+                    interval:
+                            string, specify the size of each time interval.
+                            Must be one of ('1min','5min','15min')
+
+                    dataframe:
+                            flag, specifies whether to return data in pandas dataframe or flat list of dictionaries.
+
+                    block: Specify whether to block thread if request exceeds rate limit
+
+            Returns:
+                    Depends on dataframe flag. Will return pandas dataframe, or possibly
+                    list of dictionaries, each one a single quote.
+
+            Raises:
+                    RateLimitException: If block=False, rate limit problems will be raised
+
+            Examples:
+
+    .. code-block:: python
+
+            gld_history = a.timesales (
+                    symbols = 'gld',
+                    startdate = '2020-08-21',
+                    enddate = '2020-08-19',
+            )
+            print(gld_history.loc[0])
+
+    """
+    result = Timesales(
+        auth=self.auth,
+        account_nbr=self.account_nbr,
+        symbols=symbols,
+        interval=interval,
+        startdate=startdate,
+        enddate=enddate,
+        block=block,
+    ).request()
+
+    if dataframe:
+        try:
+            result = Timesales.DataFrame(result)
+        except:
+            raise
+
+    return result
diff --git a/ally/Quote/toplists.py b/ally/Quote/toplists.py
index ac813f21..415637b6 100644
--- a/ally/Quote/toplists.py
+++ b/ally/Quote/toplists.py
@@ -20,129 +20,120 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api		import AuthenticatedEndpoint, RequestType
+from ..Api import AuthenticatedEndpoint, RequestType
 
 
+class TopLists(AuthenticatedEndpoint):
+    _type = RequestType.Quote
+    _resource = "market/toplists/{}.json"
+    _method = "GET"
 
+    def resolve(self, **kwargs):
+        """Inject the account number into the call"""
+        return self.url().format(kwargs.get("whichList"))
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        quotes = response["quotes"]["quote"]
 
-class TopLists ( AuthenticatedEndpoint ):
-	_type		= RequestType.Quote
-	_resource	= 'market/toplists/{}.json'
-	_method		= 'GET'
+        if type(quotes) != type([]):
+            quotes = [quotes]
 
+        # and return it to the world
+        return quotes
 
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		"""
-		return self.url().format(kwargs.get('whichList'))
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
+        params = {"exchange": kwargs.get("exchange")}
 
+        # return params, data
+        return params, None
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		quotes = response['quotes']['quote']
+    @staticmethod
+    def DataFrame(raw):
+        import pandas as pd
 
-		if type(quotes) != type ([]):
-			quotes = [quotes]
+        # Create dataframe from our dataset
+        df = (
+            pd.DataFrame(raw)
+            .replace({"na": None})
+            .apply(
+                # And also cast relevent fields to numeric values
+                pd.to_numeric,
+                errors="ignore",
+            )
+            .set_index("symbol")
+        )
 
-		# and return it to the world
-		return quotes
+        return df
 
 
+def toplists(
+    self,
+    whichList: str,
+    exchange: str = "Q",
+    dataframe: bool = True,
+    block: bool = True,
+):
+    """Gets the most recent toplists for a given exchange.
 
+            Args:
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
+                    whichList:
+                            Must be one of {'toplosers', 'toppctlosers', 'topvolume', 'topactive', 'topgainers', 'toppctgainers'}
 
-		params = { 'exchange':kwargs.get('exchange') }
+                    exchange:
+                            string, one of
+                            'A' (American Stock Exchange)
+                            'N' (NYSE)
+                            'Q' (NASDAQ)
+                            'U' (NASDAQ Bulletin Board)
+                            'V' (NASDAQ OTC Other)
 
-		# return params, data
-		return params, None
+                    dataframe:
+                            flag, specifies whether to return data in pandas dataframe
+                            or flat list of dictionaries.
 
+                    block:
+                            Specify whether to block thread if request exceeds rate limit
 
+            Returns:
+                    Depends on dataframe flag. Will return pandas dataframe, or possibly
+                    list of dictionaries, each one a single quote.
 
+            Raises:
 
+                    RateLimitException:
+                            If block=False, rate limit problems will be raised
 
-	@staticmethod
-	def DataFrame ( raw ):
-		import pandas as pd
+            Example:
 
-		# Create dataframe from our dataset
-		df = pd.DataFrame( raw ).replace({'na':None}).apply(
-			# And also cast relevent fields to numeric values
-			pd.to_numeric,
-			errors='ignore'
-		).set_index('symbol')
+    .. code-block:: python
 
-		return df
+            a.toplists('tpopctgainers')
 
+                                 chg  chg_sign       last                            name    pchg       pcls  rank        vl
+            symbol
+            BFRA     21.3700     u        41.6900                  BIOFRONTERA AG  105.17    20.3200     1    279216
+            CBMG      5.0100     u        19.2800  CELLULAR BIOMEDICINE GROUP INC   35.11    14.2700     2    793186
 
 
+    """
 
+    result = TopLists(
+        auth=self.auth,
+        account_nbr=self.account_nbr,
+        exchange=exchange,
+        whichList=whichList,
+        block=block,
+    ).request()
 
-def toplists ( self, whichList : str, exchange : str ='Q', dataframe : bool = True, block: bool = True ):
-	"""Gets the most recent toplists for a given exchange.
+    if dataframe:
+        try:
+            result = TopLists.DataFrame(result)
+        except:
+            raise
 
-	Args:
-
-		whichList:
-			Must be one of {'toplosers', 'toppctlosers', 'topvolume', 'topactive', 'topgainers', 'toppctgainers'}
-
-		exchange:
-			string, one of
-			'A' (American Stock Exchange)
-			'N' (NYSE)
-			'Q' (NASDAQ)
-			'U' (NASDAQ Bulletin Board)
-			'V' (NASDAQ OTC Other)
-
-		dataframe:
-			flag, specifies whether to return data in pandas dataframe
-			or flat list of dictionaries.
-
-		block:
-			Specify whether to block thread if request exceeds rate limit
-
-	Returns:
-		Depends on dataframe flag. Will return pandas dataframe, or possibly
-		list of dictionaries, each one a single quote.
-
-	Raises:
-
-		RateLimitException:
-			If block=False, rate limit problems will be raised
-
-	Example:
-
-.. code-block:: python
-
-	a.toplists('tpopctgainers')
-
-			     chg  chg_sign       last                            name    pchg       pcls  rank        vl
-	symbol
-	BFRA     21.3700     u        41.6900                  BIOFRONTERA AG  105.17    20.3200     1    279216
-	CBMG      5.0100     u        19.2800  CELLULAR BIOMEDICINE GROUP INC   35.11    14.2700     2    793186
-
-
-	"""
-
-	result = TopLists(
-		auth		= self.auth,
-		account_nbr	= self.account_nbr,
-		exchange	= exchange,
-		whichList	= whichList,
-		block		= block
-	).request()
-
-	if dataframe:
-		try:
-			result = TopLists.DataFrame ( result )
-		except:
-			raise
-
-
-	return result
+    return result
diff --git a/ally/RateLimit.py b/ally/RateLimit.py
index 3bafd0e1..c44b31f6 100644
--- a/ally/RateLimit.py
+++ b/ally/RateLimit.py
@@ -21,215 +21,197 @@
 # SOFTWARE.
 """Controls the API rate limiting
 
-- Rate limits
+Rate limits
+
 	* 40 per minute, order submission (including submit, modify, cancel)
 	* 60 per minute, market quotes
 	* 180 per minute, user info like balance, summary, etc
 
 """
-from .classes	import RequestType
-from datetime	import datetime, timezone, timedelta
-import json
 import time
-import pytz
-
-__all__ = ['query']
+from datetime import datetime, timedelta, timezone
 
+import pytz
 
-centraltz = pytz.timezone('America/Chicago')
+from .classes import RequestType
+from .exception import RateLimitException
 
+__all__ = ["query"]
 
+centraltz = pytz.timezone("America/Chicago")
 
 _rl_exp_datetime = {
-	RequestType.Order.value: None,
-	RequestType.Quote.value: None,
-	RequestType.Info.value: None
+    RequestType.Order.value: None,
+    RequestType.Quote.value: None,
+    RequestType.Info.value: None,
 }
 _rl_remaining = {
-	RequestType.Order.value: -1,
-	RequestType.Quote.value: -1,
-	RequestType.Info.value: -1
+    RequestType.Order.value: -1,
+    RequestType.Quote.value: -1,
+    RequestType.Info.value: -1,
 }
 _rl_used = {
-	RequestType.Order.value: -1,
-	RequestType.Quote.value: -1,
-	RequestType.Info.value: -1
+    RequestType.Order.value: -1,
+    RequestType.Quote.value: -1,
+    RequestType.Info.value: -1,
 }
 
 ########### UTILS
 
-def extract_ratelimit ( headers_dict ):
-	"""Returns rate limit dict, extracted from full headers.
-	"""
-	return {
-		'used'		: int(headers_dict.get('X-RateLimit-Used',0)),
-		'expire'	: float(headers_dict.get('X-RateLimit-Expire',0)),
-		'limit'		: int(headers_dict.get('X-RateLimit-Limit', 0)),
-		'remain'	: int(headers_dict.get('X-RateLimit-Remaining',0))
-	}
 
-def absolute_ally_time ( ally_time):
-	"""Returns datetime instance of ally's reported time.
+def extract_ratelimit(headers_dict):
+    """Returns rate limit dict, extracted from full headers."""
+    return {
+        "used": int(headers_dict.get("X-RateLimit-Used", 0)),
+        "expire": float(headers_dict.get("X-RateLimit-Expire", 0)),
+        "limit": int(headers_dict.get("X-RateLimit-Limit", 0)),
+        "remain": int(headers_dict.get("X-RateLimit-Remaining", 0)),
+    }
 
-	Args:
 
-		ally_time: float timestamp, the time reported by ally
+def absolute_ally_time(ally_time: float):
+    """Returns datetime instance of ally's reported time.
 
-	Returns:
+    Args:
+        ally_time (float): timestamp, the time reported by ally
 
-		datetime object, timezone-aware
-	"""
-	texp = datetime.fromtimestamp(
-		ally_time,
-		tz=centraltz
-	).replace(tzinfo=timezone.utc)
+    Returns:
+        datetime: timezone-aware
+    """
+    texp = datetime.fromtimestamp(ally_time, tz=centraltz).replace(tzinfo=timezone.utc)
 
-	# API clock is off by around 1 minute. This corrects
-	# TODO: let ally devs know that their api clock is wrong
-	return texp + timedelta( seconds=60.2 )
+    # API clock is off by around 1 minute. This corrects
+    # TODO: let ally devs know that their api clock is wrong
+    return texp + timedelta(seconds=60.2)
 
 
-
-
-def update_vals ( r, req_type_val ):
-	"""Updates the correct records in the right spot.
-	"""
-	_rl_remaining[req_type_val]		= r['remain']
-	_rl_used[req_type_val]			= r['used']
-
+def update_vals(r, req_type_val):
+    """Updates the correct records in the right spot."""
+    _rl_remaining[req_type_val] = r["remain"]
+    _rl_used[req_type_val] = r["used"]
 
 
 ########### METHODS
 
 
-def wait_until_ally_time ( req_type ):
-	"""Blocks thread until certain type's reported expire time.
-
-	Args:
-		req_type:
-			RequestType
-
-	"""
-	# Get our stuff in utc
-	now = datetime.now( tz=timezone.utc )
-
-	# Get the time we have stored
-	a_time = _rl_exp_datetime[req_type.value]
-
-	# Make sure we have a valid time
-	if a_time is None:
-		a_time = now + timedelta(seconds=60.5)
-
-	# Block thread
-	time.sleep( (a_time - now).total_seconds() )
-
-
-
+def wait_until_ally_time(req_type):
+    """Blocks thread until certain type's reported expire time.
 
-def check ( req_type: RequestType, block: bool ):
-	"""Validates whether rate limit exceeded
+    Args:
+        req_type:
+            RequestType
 
-	Args:
-		req_type:
-			RequestType enum value
+    """
+    # Get our stuff in utc
+    now = datetime.now(tz=timezone.utc)
 
-		block:
-			Whether or not to block thread, or raise exception
+    # Get the time we have stored
+    a_time = _rl_exp_datetime[req_type.value]
 
-	Returns:
+    # Make sure we have a valid time
+    if a_time is None:
+        a_time = now + timedelta(seconds=60.5)
 
-		waittime: None, or datetime point in time when next call can occur
+    # Block thread
+    total_seconds = (a_time - now).total_seconds()
+    if total_seconds > 0:
+        time.sleep(total_seconds)
 
-	"""
 
-	if _rl_remaining.get(req_type.value) == 0:
-		if block:
-			wait_until_ally_time( req_type )
-		else:
-			raise RateLimitException ( "Too many attemps." )
+def check(req_type: RequestType, block: bool):
+    """Validates whether rate limit exceeded
 
+    Args:
+        req_type:
+            RequestType enum value
 
+        block:
+            Whether or not to block thread, or raise exception
 
-def normal_update ( headers_dict, req_type ):
-	"""Updates internal rate limit state, so that calls to check() are informed
+    Returns:
+        waittime: None, or datetime point in time when next call can occur
 
-	Args:
-		headers_dict:
-			raw headers for a specific request
+    """
 
-		req_type:
-			one of RequestType enum
+    if _rl_remaining.get(req_type.value) == 0:
+        if block:
+            wait_until_ally_time(req_type)
+        else:
+            raise RateLimitException("Too many attempts.")
 
-	"""
-	rl = extract_ratelimit (headers_dict)
 
+def normal_update(headers_dict, req_type):
+    """Updates internal rate limit state, so that calls to check() are informed
 
-	# 1) Identify quote type
-	# 2) If new endtime is later than our stored endtime, overwrite
-	# 3) conditionally increment
+    Args:
+        headers_dict:
+            raw headers for a specific request
 
-	now = datetime.now()
-	our_expire = _rl_exp_datetime[req_type.value]
+        req_type:
+            one of RequestType enum
 
-	a_time = absolute_ally_time (rl['expire'])
+    """
+    rl = extract_ratelimit(headers_dict)
 
-	if our_expire is None or our_expire < a_time:
+    # 1) Identify quote type
+    # 2) If new endtime is later than our stored endtime, overwrite
+    # 3) conditionally increment
 
-		# Store the new date, and all new values
-		_rl_exp_datetime[req_type.value]	= a_time
-		update_vals ( rl, req_type.value )
+    now = datetime.now()
+    our_expire = _rl_exp_datetime[req_type.value]
 
-	# Only decrement
-	elif _rl_used[req_type.value] < rl['used']:
-		update_vals ( rl, req_type.value )
+    a_time = absolute_ally_time(rl["expire"])
 
+    if our_expire is None or our_expire < a_time:
 
+        # Store the new date, and all new values
+        _rl_exp_datetime[req_type.value] = a_time
+        update_vals(rl, req_type.value)
 
+    # Only decrement
+    elif _rl_used[req_type.value] < rl["used"]:
+        update_vals(rl, req_type.value)
 
-def force_update ( req_type ):
-	"""Informs our information that we should halt all requests for the remainder of the period.
 
-	This should be called on HTTP 429 error, so that we cool down for the rest of the period.
+def force_update(req_type):
+    """Informs our information that we should halt all requests for the remainder of the period.
 
-	Args:
-		req_type:
-			RequestType value
+    This should be called on HTTP 429 error, so that we cool down for the rest of the period.
 
-	"""
-	update_vals (
-		{
-			'remain': 0,
-			'used': 0
-		},
-		req_type.value
-	)
+    Args:
+        req_type:
+            RequestType value
 
+    """
+    update_vals({"remain": 0, "used": 0}, req_type.value)
 
-def snapshot ( req_type ):
-	"""Returns all relevent rate limit information for a given request type.
 
-	Args:
-		req_type:
-			one of RequestType.{Order,Quote,Info}
+def snapshot(req_type):
+    """Returns all relevent rate limit information for a given request type.
 
-	Returns:
-		dictionary, with keys ['used','remaining','expiration']
+    Args:
+        req_type:
+            one of RequestType.{Order,Quote,Info}
 
-	Example:
+    Returns:
+        dictionary, with keys ['used','remaining','expiration']
 
-.. code-block:: python
+    Example:
 
-	>>> ally.RateLimit.snapshot(ally.RequestType.Quote)
+    .. code-block:: python
 
-	{'expiration': datetime.datetime(2020, 6, 22, 17, 5, 42, 55080, tzinfo=datetime.timezone.utc),
-	'remaining': 56,
-	'used': 4}
+        >>> ally.RateLimit.snapshot(ally.RequestType.Quote)
 
-	"""
+        {
+            'expiration': datetime.datetime(2020, 6, 22, 17, 5, 42, 55080, tzinfo=datetime.timezone.utc),
+            'remaining': 56,
+            'used': 4
+        }
 
-	return {
-		'expiration': _rl_exp_datetime.get(req_type.value),
-		'remaining': _rl_remaining.get(req_type.value),
-		'used': _rl_used.get(req_type.value)
-	}
+    """
 
+    return {
+        "expiration": _rl_exp_datetime.get(req_type.value),
+        "remaining": _rl_remaining.get(req_type.value),
+        "used": _rl_used.get(req_type.value),
+    }
diff --git a/ally/Watchlist/__init__.py b/ally/Watchlist/__init__.py
index c862320c..e65d7e09 100644
--- a/ally/Watchlist/__init__.py
+++ b/ally/Watchlist/__init__.py
@@ -20,182 +20,142 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from collections.abc	import MutableMapping, MutableSet
-from datetime			import datetime, timedelta
 import weakref
+from collections.abc import MutableMapping, MutableSet
+from datetime import datetime, timedelta
 
 from .methods import (
-	GetWatchlist,
-	GetWatchlists,
-	CreateWatchlist,
-	AppendWatchlist,
-	DeleteWatchlist,
-	DeleteFromWatchlist
+    AppendWatchlist,
+    CreateWatchlist,
+    DeleteFromWatchlist,
+    DeleteWatchlist,
+    GetWatchlist,
+    GetWatchlists,
 )
 
 
+class WatchlistWrapper(MutableSet):
+    _name = ""
+    _syms = set()
 
-class WatchlistWrapper ( MutableSet ):
-	_name = ""
-	_syms = set()
+    def __init__(self, parent, name, symbols):
+        self._name = name
+        self._syms = set(symbols)
+        self._auth = weakref.ref(parent._auth())
 
-	def __init__ ( self, parent, name, symbols ):
-		self._name = name
-		self._syms = set(symbols)
-		self._auth = weakref.ref(parent._auth())
+    def __str__(self):
+        return str(self._syms)
 
+    def __iter__(self):
+        return self._syms.__iter__()
 
-	def __str__( self ):
-		return str(self._syms)
+    def __contains__(self, x):
+        return self._syms.contains(x)
 
+    def __len__(self):
+        return self._syms.__len__()
 
-	def __iter__ ( self ):
-		return self._syms.__iter__()
+    def add(self, x):
+        if x not in self._syms:
+            result = AppendWatchlist(
+                auth=self._auth(), watchlist_name=self._name, watchlist_symbols=x
+            ).request()
 
+    def discard(self, x):
+        if x in self._syms:
+            result = DeleteFromWatchlist(
+                auth=self._auth(), watchlist_name=self._name, watchlist_symbol=x
+            ).request()
 
-	def __contains__ ( self, x ):
-		return self._syms.contains(x)
 
+class Watchlist(MutableMapping):
+    """Handle an accounts watchlists and symbols in a pythonic way.
 
-	def __len__ ( self ):
-		return self._syms.__len__()
+            The Watchlist account object wraps ally's watchlist
+            functionality and mimics python datatypes.
 
+            Examples:
 
-	def add ( self, x ):
-		if x not in self._syms:
-			result = AppendWatchlist(
-				auth			= self._auth(),
-				watchlist_name		= self._name,
-				watchlist_symbols	= x
-			).request()
+    .. code-block:: python
 
+            # See all of your watchlists
+            list(a.watchlists)
 
-	def discard ( self, x ):
-		if x in self._syms:
-			result = DeleteFromWatchlist(
-				auth				= self._auth(),
-				watchlist_name		= self._name,
-				watchlist_symbol	= x
-			).request()
+            # => ['w-list1', 'my-watchlist',...]
 
 
+    .. code-block:: python
 
+            # See all the symbols associated with a watchlist
+            list(a.watchlist['w-list1'])
 
+            # => ['aapl, 'googl',...]
 
+    .. code-block:: python
 
+            # Create a watchlist, and initialize with symbols
+            a.watchlist['new-watchlist'] = ['aapl,'googl',...]
 
-class Watchlist ( MutableMapping ):
-	"""Handle an accounts watchlists and symbols in a pythonic way.
+    .. code-block:: python
 
-	The Watchlist account object wraps ally's watchlist
-	functionality and mimics python datatypes.
+            # Remove a symbol from a watchlist
+            a.watchlist['new-watchlist'].pop('aapl')
 
-	Examples:
+    .. code-block:: python
 
-.. code-block:: python
+            # Delete a watchlist
+            a.watchlist.pop('new-watchlist')
 
-	# See all of your watchlists
-	list(a.watchlists)
 
-	# => ['w-list1', 'my-watchlist',...]
+    """
 
+    _auth = None
+    _expire = None
 
-.. code-block:: python
+    def __getitem__(self, name):
+        result = GetWatchlist(auth=self._auth(), watchlist_name=name).request()
 
-	# See all the symbols associated with a watchlist
-	list(a.watchlist['w-list1'])
+        return WatchlistWrapper(self, name, result)
 
-	# => ['aapl, 'googl',...]
+    def __setitem__(self, name, symbols):
+        if type(symbols) != type([]):
+            symbols = [str(symbols)]
 
-.. code-block:: python
+        CreateWatchlist(
+            auth=self._auth(), watchlist_name=name, watchlist_symbols=symbols
+        ).request()
 
-	# Create a watchlist, and initialize with symbols
-	a.watchlist['new-watchlist'] = ['aapl,'googl',...]
+    def __delitem__(self, name):
+        DeleteWatchlist(auth=self._auth(), watchlist_name=name).request()
 
-.. code-block:: python
+    @property
+    def _all(self):
+        """Reusable way to get all watchlists"""
+        t = datetime.now()
 
-	# Remove a symbol from a watchlist
-	a.watchlist['new-watchlist'].pop('aapl')
+        if self._expire is None or self._expire < t:
 
-.. code-block:: python
+            # Update cache
+            self._expire = t + timedelta(seconds=0.75)
 
-	# Delete a watchlist
-	a.watchlist.pop('new-watchlist')
+            self._lists = GetWatchlists(
+                auth=self._auth(),
+            ).request()
 
+        return self._lists
 
-	"""
-	_auth = None
-	_expire = None
+    def __str__(self):
+        return str(self._all)
 
+    def __iter__(self):
+        """Return list to run ove
+        Must be wrapped in some special iterator stuff
+        so that python3 will handle it how we want
+        """
+        return self._all.__iter__()
 
-	def __getitem__ ( self, name ):
-		result = GetWatchlist(
-			auth			= self._auth(),
-			watchlist_name	= name
-		).request()
+    def __len__(self):
+        return len(self._all)
 
-		return WatchlistWrapper( self, name, result )
-
-
-	def __setitem__ ( self, name, symbols ):
-		if type(symbols) != type([]):
-			symbols = [str(symbols)]
-
-		CreateWatchlist(
-			auth				= self._auth(),
-			watchlist_name		= name,
-			watchlist_symbols	= symbols
-		).request()
-
-
-
-	def __delitem__ ( self, name ):
-		DeleteWatchlist(
-			auth				= self._auth(),
-			watchlist_name		= name
-		).request()
-
-
-
-	@property
-	def _all ( self ):
-		"""Reusable way to get all watchlists
-		"""
-		t = datetime.now()
-
-		if self._expire is None or self._expire < t:
-
-			# Update cache
-			self._expire = t + timedelta( seconds=0.75 )
-
-			self._lists = GetWatchlists(
-				auth = self._auth(),
-			).request()
-
-		return self._lists
-
-
-
-	def __str__ ( self ):
-		return str(self._all)
-
-
-
-	def __iter__ ( self ):
-		"""Return list to run ove
-		Must be wrapped in some special iterator stuff
-		so that python3 will handle it how we want
-		"""
-		return self._all.__iter__()
-
-
-
-
-	def __len__ ( self ):
-		return len(self._all)
-
-
-
-
-	def __init__ ( self, parent ):
-		self._auth = weakref.ref(parent.auth)
+    def __init__(self, parent):
+        self._auth = weakref.ref(parent.auth)
diff --git a/ally/Watchlist/methods.py b/ally/Watchlist/methods.py
index 3e72c74f..dac73523 100644
--- a/ally/Watchlist/methods.py
+++ b/ally/Watchlist/methods.py
@@ -20,150 +20,101 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from ..Api				import (
-	Endpoint,
-	AuthenticatedEndpoint,
-	RequestType
-)
+import logging
 
+from ..Api import AuthenticatedEndpoint, Endpoint, RequestType
 
+logger = logging.getLogger(__name__)
 
 
+class WatchlistEndpoint(AuthenticatedEndpoint):
+    """Also automatically resolve url to include account number"""
 
-class WatchlistEndpoint ( AuthenticatedEndpoint ):
-	"""Also automatically resolve url to include account number
-	"""
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		"""
-		return self.url().format(kwargs.get('watchlist_name'))
+    def resolve(self, **kwargs):
+        """Inject the account number into the call"""
+        return self.url().format(kwargs.get("watchlist_name"))
 
 
+class GetWatchlists(Endpoint):
+    _type = RequestType.Info
+    _resource = "watchlists.json"
 
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        return [v["id"] for v in response["watchlists"]["watchlist"]]
 
 
+class CreateWatchlist(Endpoint):
+    """Create a watchlist, and add symbols to it (optionally)"""
 
+    _type = RequestType.Info
+    _resource = "watchlists.json"
+    _method = "POST"
 
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
 
+        name = kwargs.get("watchlist_name")
+        symbols = ",".join(kwargs.get("watchlist_symbols"))
 
+        data = {"id": name, "symbols": symbols}
+        return None, data
 
-class GetWatchlists ( Endpoint ):
-	_type		= RequestType.Info
-	_resource	= 'watchlists.json'
 
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		return [
-			v['id'] for v in
-				response['watchlists']['watchlist']
-		]
+class DeleteWatchlist(Endpoint):
+    """Outright delete an entire watchlist"""
 
+    _type = RequestType.Info
+    _resource = "watchlists/{0}.json"
+    _method = "DELETE"
 
 
+class DeleteFromWatchlist(WatchlistEndpoint):
+    """Delete selected symbols from a watchlist"""
 
+    _type = RequestType.Info
+    _resource = "watchlists/{0}/symbols/{1}.json"
+    _method = "DELETE"
 
+    def resolve(self, **kwargs):
+        """Inject the account number into the call"""
+        return self.url().format(
+            kwargs.get("watchlist_name"), kwargs.get("watchlist_symbol")
+        )
 
 
-class CreateWatchlist ( Endpoint ):
-	"""Create a watchlist, and add symbols to it (optionally)
-	"""
-	_type		= RequestType.Info
-	_resource	= 'watchlists.json'
-	_method		= 'POST'
+class GetWatchlist(WatchlistEndpoint):
+    """Get the symbols from some watchlist"""
 
+    _type = RequestType.Info
+    _resource = "watchlists/{0}.json"
 
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
+    def resolve(self, **kwargs):
+        """Inject the account number into the call"""
+        watchlist_name = kwargs.get("watchlist_name").replace("/", r"%2F")
+        logger.debug(watchlist_name)
+        return self.url().format(
+            watchlist_name,
+        )
 
-		name = kwargs.get('watchlist_name')
-		symbols = ','.join( kwargs.get('watchlist_symbols') )
+    def extract(self, response):
+        """Extract certain fields from response"""
+        response = response.json()["response"]
+        syms = response["watchlists"]["watchlist"]["watchlistitem"]
+        syms = list(map(lambda d: d["instrument"]["sym"], syms))
+        return syms
 
-		data = {
-			'id': name,
-			'symbols': symbols
-		}
-		return None, data
 
+class AppendWatchlist(WatchlistEndpoint):
+    """Append some symbols to a watchlist"""
 
+    _type = RequestType.Info
+    _resource = "watchlists/{0}/symbols.json"
+    _method = "POST"
 
-
-
-
-class DeleteWatchlist ( Endpoint ):
-	"""Outright delete an entire watchlist
-	"""
-	_type		= RequestType.Info
-	_resource	= 'watchlists/{0}.json'
-	_method		= 'DELETE'
-
-
-
-class DeleteFromWatchlist ( WatchlistEndpoint ):
-	"""Delete selected symbols from a watchlist
-	"""
-	_type		= RequestType.Info
-	_resource	= 'watchlists/{0}/symbols/{1}.json'
-	_method		= 'DELETE'
-
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		"""
-		return self.url().format(
-			kwargs.get( 'watchlist_name' ),
-			kwargs.get( 'watchlist_symbol' )
-		)
-
-
-
-
-
-
-
-class GetWatchlist ( WatchlistEndpoint ):
-	"""Get the symbols from some watchlist
-	"""
-	_type		= RequestType.Info
-	_resource	= 'watchlists/{0}.json'
-
-
-	def resolve ( self, **kwargs):
-		"""Inject the account number into the call
-		"""
-		watchlist_name = kwargs.get( 'watchlist_name' ).replace('/',r"%2F")
-		# print(watchlist_name)
-		return self.url().format(
-			watchlist_name,
-		)
-
-	def extract ( self, response ):
-		"""Extract certain fields from response
-		"""
-		response = response.json()['response']
-		syms = response['watchlists']['watchlist']['watchlistitem']
-		syms = list ( map (
-			lambda d: d['instrument']['sym'],
-			syms
-		) )
-		return syms
-
-
-
-
-
-
-class AppendWatchlist ( WatchlistEndpoint ):
-	"""Append some symbols to a watchlist
-	"""
-	_type		= RequestType.Info
-	_resource	= 'watchlists/{0}/symbols.json'
-	_method		= 'POST'
-
-	def req_body ( self, **kwargs ):
-		"""Return get params together with post body data
-		"""
-		symbols = ','.join( kwargs.get('watchlist_symbols') )
-		data = { 'symbols': symbols }
-		return None, data
+    def req_body(self, **kwargs):
+        """Return get params together with post body data"""
+        symbols = ",".join(kwargs.get("watchlist_symbols"))
+        data = {"symbols": symbols}
+        return None, data
diff --git a/ally/__init__.py b/ally/__init__.py
index c0100859..685d0eda 100644
--- a/ally/__init__.py
+++ b/ally/__init__.py
@@ -20,10 +20,9 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-"""Ally module.
+"""The ally (__init__) module.
 
-Take control of your Ally Bank finances through Python.
-Buy stocks and options in an instant, and stay up-to-date with your investments.
+Take control of your Ally Bank finances through Python. Buy stocks and options in an instant, and stay up-to-date with your investments.
 
 Ally Bank's investment platform is perfect for smaller investors who value a mature web/mobile interface, and low brokerage fees. I made this wrapper so that I could more easily integrate the platform with Python, and reduce the need for human oversight on my account.
 
@@ -31,6 +30,6 @@
 
 Make sure to read the docss at https://alienbrett.github.io/PyAlly
 """
-from .Ally		import Ally
-from .			import utils, Info, exception, Order, Account, RateLimit
-from .classes	import RequestType
+from . import Account, Info, News, Option, Order, RateLimit, exception, utils
+from .Ally import Ally
+from .classes import RequestType
diff --git a/ally/classes.py b/ally/classes.py
index b1676f70..ca2c3739 100644
--- a/ally/classes.py
+++ b/ally/classes.py
@@ -1,6 +1,7 @@
-from enum	import Enum
+from enum import Enum
+
 
 class RequestType(Enum):
-	Order	= 1
-	Quote	= 2
-	Info	= 3
+    Order = 1
+    Quote = 2
+    Info = 3
diff --git a/ally/exception.py b/ally/exception.py
index 14efaf25..fda1e2e8 100644
--- a/ally/exception.py
+++ b/ally/exception.py
@@ -22,40 +22,41 @@
 
 """The exceptions generated by the module.
 
-	Mainly provide a way to pass through errors from the Ally API servers back to the user.
+Mainly provide a way to pass through errors from the Ally API servers back to the user.
 
 """
 
 
 class ApiKeyException(Exception):
-	"""Keys were not provided in the proper formatting.
-	"""
-	pass
+    """Keys were not provided in the proper formatting."""
+
+    pass
 
 
 class OrderException(Exception):
-	"""Something went wrong in the local order construction.
-	"""
-	pass
+    """Something went wrong in the local order construction."""
+
+    pass
+
 
 class ExecutionException(Exception):
-	"""Ally service encountered error while handling an order object.
-	"""
-	pass
+    """Ally service encountered error while handling an order object."""
 
+    pass
 
 
 class RateLimitException(Exception):
-	"""API service rate limit exhaustion.
-	"""
-	pass
+    """API service rate limit exhaustion."""
+
+    pass
 
 
 # Order formatting exceptions
 
+
 class TimeInForceException(Exception):
-	pass
+    pass
 
 
 class PriceException(Exception):
-	pass
+    pass
diff --git a/ally/utils/__init__.py b/ally/utils/__init__.py
index 45118603..2339fff9 100644
--- a/ally/utils/__init__.py
+++ b/ally/utils/__init__.py
@@ -20,7 +20,7 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-from .option	import *
-from .utils		import *
-from .json		import *
-from .			import tests
+from . import tests
+from .json import *
+from .option import *
+from .utils import *
diff --git a/ally/utils/json.py b/ally/utils/json.py
index bee8ac24..cc4b30eb 100644
--- a/ally/utils/json.py
+++ b/ally/utils/json.py
@@ -22,61 +22,53 @@
 
 import json
 import re
-nonspace = re.compile(r'\S')
+
+nonspace = re.compile(r"\S")
 
 ############################################################################
 class JSONStreamParser:
-	"""Iteratively decode a JSON string into an object.
-	Adapted from solution on page:
-		https://stackoverflow.com/questions/21059466/python-json-parser
-	"""
-
-	s = ""
-
-	def __init__ ( self, s="" ):
-		self.s = s
-		self.decoder = json.JSONDecoder()
-		self.pos = 0
+    """Iteratively decode a JSON string into an object.
+    Adapted from solution on page:
+            https://stackoverflow.com/questions/21059466/python-json-parser
+    """
 
+    s = ""
 
-	def stream_one ( self ):
-		"""Parse one iteration of our currently-held string
-		"""
-		# Search a bit
-		matched = nonspace.search(
-			self.s,
-			self.pos
-		)
+    def __init__(self, s=""):
+        self.s = s
+        self.decoder = json.JSONDecoder()
+        self.pos = 0
 
-		# If we haven't encountered anything,
-		#  there's nothing to return
-		if not matched:
-			return None
+    def stream_one(self):
+        """Parse one iteration of our currently-held string"""
+        # Search a bit
+        matched = nonspace.search(self.s, self.pos)
 
-		# Otherwise, read through this little bit
-		self.pos			= matched.start()
-		try:
-			decoded, self.pos	= self.decoder.raw_decode(
-				self.s,
-				self.pos
-			)
-		except:
-			return None
+        # If we haven't encountered anything,
+        #  there's nothing to return
+        if not matched:
+            return None
 
-		# Return what we were able to find
-		return decoded
+        # Otherwise, read through this little bit
+        self.pos = matched.start()
+        try:
+            decoded, self.pos = self.decoder.raw_decode(self.s, self.pos)
+        except:
+            return None
 
+        # Return what we were able to find
+        return decoded
 
-	def stream ( self,  new_dat="" ):
-		"""Given a single piece of data,
-		Yield objects until there's nothing left to do
-		"""
-		# Append this data into our string queue
-		self.s += new_dat
+    def stream(self, new_dat=""):
+        """Given a single piece of data,
+        Yield objects until there's nothing left to do
+        """
+        # Append this data into our string queue
+        self.s += new_dat
 
-		while True:
-			x = self.stream_one()
-			if x is None:
-				raise StopIteration
-			else:
-				yield x
+        while True:
+            x = self.stream_one()
+            if x is None:
+                raise StopIteration
+            else:
+                yield x
diff --git a/ally/utils/option.py b/ally/utils/option.py
index 0bd1c114..beff85e9 100644
--- a/ally/utils/option.py
+++ b/ally/utils/option.py
@@ -22,82 +22,81 @@
 
 import datetime
 import math
+
 from .utils import *
 
+
 ############################################################################
 def option_format(symbol="", exp_date="1970-01-01", strike=0, direction=""):
-	"""Returns the OCC standardized option name.
-
-	Args:
+    """Returns the OCC standardized option name.
 
-		symbol: the underlying symbol, case insensitive
-		exp_date: date of expiration, in string-form.
-		strike: strike price of the option
-		direction: 'C' or 'call' or the like, for call, otherwise 'p' or 'Put' for put
+    Args:
 
-	Returns:
+            symbol: the underlying symbol, case insensitive
+            exp_date: date of expiration, in string-form.
+            strike: strike price of the option
+            direction: 'C' or 'call' or the like, for call, otherwise 'p' or 'Put' for put
 
-		OCC string, like 'IBM201231C00301000'
+    Returns:
 
+            OCC string, like 'IBM201231C00301000'
 
-	.. code-block:: python
 
-		# Construct the option's OCC symbol
-		>>> ibm_call = ally.utils.option_format(
-			exp_date = '2020-12-31',
-			symbol = 'IBM', # case insensitive
-			direction = 'call',
-			strike = 301
-		)
+    .. code-block:: python
 
-		>>> ibm_call
-		'IBM201231C00301000'
+            # Construct the option's OCC symbol
+            >>> ibm_call = ally.utils.option_format(
+                    exp_date = '2020-12-31',
+                    symbol = 'IBM', # case insensitive
+                    direction = 'call',
+                    strike = 301
+            )
 
+            >>> ibm_call
+            'IBM201231C00301000'
 
-	"""
-	if not (check(symbol) and check(exp_date) and check(str(strike)) and check(direction)):
-		return ""
 
-	# direction into C or P
-	direction = 'C' if 'C' in direction.upper() else'P'
+    """
+    if not (
+        check(symbol) and check(exp_date) and check(str(strike)) and check(direction)
+    ):
+        return ""
 
-	# Pad strike with zeros
-	def format_strike (strike):
-		x	= str(math.floor(float(strike)*1000))
-		return "0" * (8-len(x)) + x
-	# Assemble
-	return str(symbol).upper() +\
-		datetime.datetime.strptime(exp_date,"%Y-%m-%d").strftime("%y%m%d") +\
-		direction + format_strike(strike)
+    # direction into C or P
+    direction = "C" if "C" in direction.upper() else "P"
 
+    # Pad strike with zeros
+    def format_strike(strike):
+        x = str(math.floor(float(strike) * 1000))
+        return "0" * (8 - len(x)) + x
 
+    # Assemble
+    return (
+        str(symbol).upper()
+        + datetime.datetime.strptime(exp_date, "%Y-%m-%d").strftime("%y%m%d")
+        + direction
+        + format_strike(strike)
+    )
 
 
 def option_strike(name):
-	"""Pull apart an OCC standardized option name and
-	retreive the strike price, in integer form"""
-	return int(name[-8:])/1000.0
-
+    """Pull apart an OCC standardized option name and
+    retreive the strike price, in integer form"""
+    return int(name[-8:]) / 1000.0
 
 
 def option_maturity(name):
-	"""Given OCC standardized option name,
-	return the date of maturity"""
-	return datetime.datetime.strptime(name[-15:-9],"%y%m%d").strftime("%Y-%m-%d")
-
+    """Given OCC standardized option name,
+    return the date of maturity"""
+    return datetime.datetime.strptime(name[-15:-9], "%y%m%d").strftime("%Y-%m-%d")
 
 
 def option_callput(name):
-	"""Given OCC standardized option name,
-	return whether its a call or a put"""
-	return 'call' if name.upper()[-9] == 'C' else 'put'
-
+    """Given OCC standardized option name,
+    return whether its a call or a put"""
+    return "call" if name.upper()[-9] == "C" else "put"
 
 
 def option_symbol(name):
-	"""Given OCC standardized option name, return option ticker"""
-	return name[:-15]
-
-
-
-
+    """Given OCC standardized option name, return option ticker"""
+    return name[:-15]
diff --git a/ally/utils/utils.py b/ally/utils/utils.py
index a3cc8351..509e9eae 100644
--- a/ally/utils/utils.py
+++ b/ally/utils/utils.py
@@ -22,24 +22,25 @@
 
 ############################################################################
 def pretty_print_POST(req):
-	"""Not my code,
-	I stole this function off Stackexchange or something. Thanks Anon!
-	"""
-	return '{}\n{}\n{}\n\n{}'.format(
-		'-----------START-----------',
-		req.method + ' ' + req.url,
-		'\n'.join('{}: {}'.format(k, v) for k, v in req.headers.items()),
-		req.body,
-	)
+    """Not my code,
+    I stole this function off Stackexchange or something. Thanks Anon!
+    """
+    return "{}\n{}\n{}\n\n{}".format(
+        "-----------START-----------",
+        req.method + " " + req.url,
+        "\n".join("{}: {}".format(k, v) for k, v in req.headers.items()),
+        req.body,
+    )
+
+
 ############################################################################
 # string typecheck
 def check(s):
-	return type(s) == type("") and len(s) > 0
-
+    return type(s) == type("") and len(s) > 0
 
-def sanitize_input ( s ):
-	"""Given an arbitrary string,
-	escape '/' characters
-	"""
-	return s.replace('/',r"%2F")
 
+def sanitize_input(s):
+    """Given an arbitrary string,
+    escape '/' characters
+    """
+    return s.replace("/", r"%2F")
diff --git a/docs/.buildinfo b/docs/.buildinfo
index b47d67f7..7a363e92 100644
--- a/docs/.buildinfo
+++ b/docs/.buildinfo
@@ -1,4 +1,4 @@
 # Sphinx build info version 1
 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: 97315af83cf402991837a9ee44296b10
+config: 3225c1a2e5c4d06cbdc79c8cb1eb3987
 tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/docs/_sources/account.rst.txt b/docs/_sources/account.rst.txt
index 3475fb66..c499134e 100644
--- a/docs/_sources/account.rst.txt
+++ b/docs/_sources/account.rst.txt
@@ -1,10 +1,6 @@
 Account
 =======
 
-
-
-
 .. autoclass:: ally.Ally
    :members: accounts, balances, holdings, history
-
-
+   :noindex:
diff --git a/docs/_sources/ally.rst.txt b/docs/_sources/ally.rst.txt
index 792ecab9..82c00358 100644
--- a/docs/_sources/ally.rst.txt
+++ b/docs/_sources/ally.rst.txt
@@ -1,8 +1,5 @@
 Ally Object
 ===========
 
-
 .. autoclass:: ally.Ally
    :members: __init__
-
-
diff --git a/docs/_sources/forking.rst.txt b/docs/_sources/forking.rst.txt
deleted file mode 100644
index 6bfbd4a0..00000000
--- a/docs/_sources/forking.rst.txt
+++ /dev/null
@@ -1,57 +0,0 @@
-Maintaining
-============
-
-
-Updating and Deploying Documentation
---------------------------------------
-
-To create a fully-functional fork of the repository in your Github,
-`set up a Github Pages project`_ for the new repository. When setting it up, associate the page
-with the `master` branch. The documentation will now be available publicly.
-
-Edit the files in the ``sphinx/`` directory how you see fit. Documentation for individual classes and files
-might be found in the source, since documentation is partially autogenerated from comments in the actual code.
-
-The documentation must then be generated. Change directories to the ``sphinx/`` folder, then run ``make github``.
-This will build the html web files for the online documentation and place them in the ``docs/`` folder. Add the
-files in the ``docs/`` and ``sphinx/`` in a new commit and push to master. The changes will be reflected on
-your project Github page.
-
-
-Creating a Release
--------------------
-
-It's important to run the unit tests for the package before pushing a full release:
-
-.. code-block:: bash
-
-   python3 ally/tests.py
-
-
-To create a release, make sure to change the version number in 3 different files:
-
-* ``README.md``
-* ``sphinx/index.rst``
-* ``sphinx/conf.py``
-* ``setup.py``
-
-Once this is done, all the documentation pages will reflect the new version, and the package release
-will respect this as well.
-
-Make sure to add new contributers to the ``sphinx/index.rst`` and ``README.md`` pages, if applicable.
-
-To build the package and upload to Pypi, run the commands from the root directory:
-
-
-.. code-block:: bash
-
-   python3 setup.py sdist bdist_wheel
-   twine upload dist/*
-
-The code will now be reflected in Pypi, available for public use.
-
-
-
-
-.. _`set up a Github Pages project`: https://docs.github.com/en/github/working-with-github-pages/creating-a-github-pages-site
-
diff --git a/docs/_sources/getting.started.rst.txt b/docs/_sources/getting.started.rst.txt
deleted file mode 100644
index 7bdf45e5..00000000
--- a/docs/_sources/getting.started.rst.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-Getting Started
-===============
-
-
-Overview
---------
-
-A new API project needs to be created through the account page on Ally's website,
-and the project keys imported so that they can be used with the module.
-
-
-
-Installing
-----------
-
-To install the library, just use pip
-   
-.. code-block:: console
-
-   $ pip install pyally
-
-
-Log into `Ally Invest`_, go to the specific account page, click Tools->API
-
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true
-
-Fill out the API token application as a Personal Application
-
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true
-
-It's **strongly recommended** to store the keys in environment variables.
-
-
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true
-
-To do this, insert the following into ``~/.bashrc``:
-
-.. code-block:: console
-
-   export ALLY_CONSUMER_KEY=XXXXXXXXXXXXXXXXXXXXXXXX
-   export ALLY_CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXX
-   export ALLY_OAUTH_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX
-   export ALLY_OAUTH_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX
-   export ALLY_ACCOUNT_NBR=12345678
-
-
-
-First Steps
------------
-
-
-To import the library, just run
-
-.. code-block:: python
-
-   import ally
-
-
-We need to pass the API keys to the pyally object on instantiation. This can be done in a few ways:
-
-
-
-Keys: Environment Variables
----------------------------
-
-It's **strongly recommended** that the API keys be stored as environment variables.
-This is more secure than other methods, as it conceals the credentials of ally account if
-the code is leaked or distributed. If the account variables are specified as recommended this way,
-instantiation is easy:
-
-.. code-block:: python
-
-   a = ally.Ally()
-
-
-**And you're done!**
-
-
-
-Keys: JSON file
----------------
-
-The object creator also accepts a json file holding the dict keys, and 
-this is about as secure as the environment variable method.
-Place the API keys into a JSON file (this looks very similar to a python dict):
-
-.. code-block:: python
-
-   {
-       'ALLY_RESOURCE_OWNER_SECRET':XXXX,
-       'ALLY_RESOURCE_OWNER_KEY':XXXX,
-       'ALLY_CLIENT_SECRET':XXXX,
-       'ALLY_CLIENT_KEY':XXXX,
-       'ALLY_ACCOUNT_NBR':XXXX
-   }
-
-
-
-Then the object can be instantiated like:
-
-.. code-block:: python
-   
-   a = ally.Ally('/path/to/params.json')
-
-
-
-Keys: Passing Directly
-----------------------
-
-Variables can be passed in on instantiation. This way, no account variables need to be set.
-Keep in mind that this is much less secure for distributable applications, since anyone with these keys
-will have access to the account with which they're associated.
-
-
-
-.. code-block:: python
-
-   params = {
-       'ALLY_RESOURCE_OWNER_SECRET':XXXX,
-       'ALLY_RESOURCE_OWNER_KEY':XXXX,
-       'ALLY_CLIENT_SECRET':XXXX,
-       'ALLY_CLIENT_KEY':XXXX,
-       'ALLY_ACCOUNT_NBR':XXXX
-   }
-   a = ally.Ally(params)
-
-
-
-Now you're ready to make API calls with your new object and start trading.
-
-
-.. _`Ally Invest`: https://secure.ally.com
diff --git a/docs/_sources/index.rst.txt b/docs/_sources/index.rst.txt
index d8e299d9..3b6a84da 100644
--- a/docs/_sources/index.rst.txt
+++ b/docs/_sources/index.rst.txt
@@ -1,8 +1,7 @@
 PyAlly Trading Library
 ==================================
 
-Take control of your `Ally bank`_ finances through Python.
-Buy stocks and options in an instant, and stay up-to-date with your investments.
+Take control of your `Ally bank`_ finances through Python. Buy stocks and options in an instant, and stay up-to-date with your investments.
 
 Ally Bank's investment platform is perfect for smaller investors who value a mature web/mobile interface, and low brokerage fees. I made this wrapper so that I could more easily integrate the platform with Python, and reduce the need for human oversight on my account.
 
@@ -10,7 +9,6 @@ After setting up API keys, PyAlly can provide the basic/essential Ally brokerage
 
 The project can be cloned from github_ or installed through pip on pypi_.
 
-
 Contents
 --------
 
@@ -30,13 +28,10 @@ Contents
    support
    maintaining
 
-
 Version 1.1.2
 ----------------
 
-The lastest redesign preserves many features of the old interface, and incorporates a few new ones.
-Version 1.0 has been designed around a simple interface which should make modifying orders easier, and many operations more pythonic.
-Please note that this version breaks compatibility with all V0.X.X.
+The lastest redesign preserves many features of the old interface, and incorporates a few new ones. Version 1.0 has been designed around a simple interface which should make modifying orders easier, and many operations more pythonic. Please note that this version breaks compatibility with all V0.X.X.
 
 * Added pythonic methods for manipulating account watchlists
 * Added quote streaming support
@@ -48,16 +43,13 @@ Please note that this version breaks compatibility with all V0.X.X.
 * Toplists
 * News
 
-Note that parts of the news searching is broken. Ally's contractor who supplies information for news
-articles has had trouble suppling some information.
+Note that parts of the news searching is broken. Ally's contractor who supplies information for news articles has had trouble suppling some information.
 
 Planned Features
 -----------------
 
 * Multi-leg orders
 
-
-
 Contributors
 ------------
 * `Brett Graves`_
@@ -67,16 +59,12 @@ Contributors
 * `Tianyu`_
 * `Salient`_
 * `Matt Margolin`_
+* `Alex Kennedy`_
 
-
-Message me on Github or `send me an email`_ if you enjoyed the project or thought it could be improved.
-I do my best to code with quality but sometimes it is easier said than done.
-Anyone with an interest with an eye for detail is welcome to contribute.
+Message me on Github or `send me an email`_ if you enjoyed the project or thought it could be improved. I do my best to code with quality but sometimes it is easier said than done. Anyone with an interest with an eye for detail is welcome to contribute.
 
 If you're dying to buy me a beer, I accept venmo at @alienbrett. That said, feel no obligation; this is free software and it's here for you to use.
 
-
-
 .. _`Ally bank`: https://www.ally.com/api/invest/documentation/getting-started/
 
 .. _`Brett Graves`: https://github.com/alienbrett
@@ -93,8 +81,17 @@ If you're dying to buy me a beer, I accept venmo at @alienbrett. That said, feel
 
 .. _`Matt Margolin`: https://github.com/mm0
 
+.. _`Alex Kennedy`: https://github.com/LaikaN57
+
 .. _`send me an email`: mailto:alienbrett648@gmail.com
 
 .. _github: https://github.com/alienbrett/PyAlly
 
 .. _pypi: https://pypi.org/project/pyally/
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/docs/_sources/installing.rst.txt b/docs/_sources/installing.rst.txt
index 15a2a24e..09f4c67f 100644
--- a/docs/_sources/installing.rst.txt
+++ b/docs/_sources/installing.rst.txt
@@ -1,41 +1,35 @@
 Installing
 ===============
 
-
 Overview
 --------
 
-A new API project needs to be created through the account page on Ally's website,
-and the project keys imported so that they can be used with the module.
-
-
+A new API project needs to be created through the account page on Ally's website, and the project keys imported so that they can be used with the module.
 
 Get the Library
 ---------------
 
 To install the library, just use pip
 
-.. code-block:: console
-
-   $ pip install pyally
+.. code-block:: bash
 
+   pip install pyally
 
 Log into `Ally Invest`_, go to the specific account page, click Tools->API
 
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true
+.. image:: https://github.com/mm0/PyAlly/blob/master/docs/_static/images/tools.png?raw=true
 
 Fill out the API token application as a Personal Application
 
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true
+.. image:: https://github.com/mm0/PyAlly/blob/master/docs/_static/images/new_application.png?raw=true
 
 It's **strongly recommended** to store the keys in environment variables.
 
-
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true
+.. image:: https://github.com/mm0/PyAlly/blob/master/docs/_static/images/details.png?raw=true
 
 To do this, insert the following into ``~/.bashrc``:
 
-.. code-block:: console
+.. code-block:: bash
 
    export ALLY_CONSUMER_KEY=XXXXXXXXXXXXXXXXXXXXXXXX
    export ALLY_CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXX
@@ -43,46 +37,32 @@ To do this, insert the following into ``~/.bashrc``:
    export ALLY_OAUTH_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX
    export ALLY_ACCOUNT_NBR=12345678
 
-
-
 First Steps
 -----------
 
-
 To import the library, just run
 
 .. code-block:: python
 
    import ally
 
-
 We need to pass the API keys to the pyally object on instantiation. This can be done in a few ways:
 
-
-
 Keys: Environment Variables
 ---------------------------
 
-It's **strongly recommended** that the API keys be stored as environment variables.
-This is more secure than other methods, as it conceals the credentials of ally account if
-the code is leaked or distributed. If the account variables are specified as recommended this way,
-instantiation is easy:
+It's **strongly recommended** that the API keys be stored as environment variables. This is more secure than other methods, as it conceals the credentials of ally account if the code is leaked or distributed. If the account variables are specified as recommended this way, instantiation is easy:
 
 .. code-block:: python
 
    a = ally.Ally()
 
-
 **And you're done!**
 
-
-
 Keys: JSON file
 ---------------
 
-The object creator also accepts a json file holding the dict keys, and 
-this is about as secure as the environment variable method.
-Place the API keys into a JSON file (this looks very similar to a python dict):
+The object creator also accepts a json file holding the dict keys, and this is about as secure as the environment variable method. Place the API keys into a JSON file (this looks very similar to a python dict):
 
 .. code-block:: python
 
@@ -94,24 +74,16 @@ Place the API keys into a JSON file (this looks very similar to a python dict):
        'ALLY_ACCOUNT_NBR':XXXX
    }
 
-
-
 Then the object can be instantiated like:
 
 .. code-block:: python
 
    a = ally.Ally('/path/to/params.json')
 
-
-
 Keys: Passing Directly
 ----------------------
 
-Variables can be passed in on instantiation. This way, no account variables need to be set.
-Keep in mind that this is much less secure for distributable applications, since anyone with these keys
-will have access to the account with which they're associated.
-
-
+Variables can be passed in on instantiation. This way, no account variables need to be set. Keep in mind that this is much less secure for distributable applications, since anyone with these keys will have access to the account with which they're associated.
 
 .. code-block:: python
 
@@ -124,9 +96,6 @@ will have access to the account with which they're associated.
    }
    a = ally.Ally(params)
 
-
-
 Now you're ready to make API calls with your new object and start trading.
 
-
 .. _`Ally Invest`: https://secure.ally.com
diff --git a/docs/_sources/maintaining.rst.txt b/docs/_sources/maintaining.rst.txt
index d8c1c27d..625a29dd 100644
--- a/docs/_sources/maintaining.rst.txt
+++ b/docs/_sources/maintaining.rst.txt
@@ -1,22 +1,14 @@
 Maintaining
 ============
 
-
 Updating and Deploying Documentation
 --------------------------------------
 
-To create a fully-functional fork of the repository in your Github,
-`set up a Github Pages project`_ for the new repository. When setting it up, associate the page
-with the `master` branch. The documentation will now be available publicly.
-
-Edit the files in the ``sphinx/`` directory how you see fit. Documentation for individual classes and files
-might be found in the source, since documentation is partially autogenerated from comments in the actual code.
+To create a fully-functional fork of the repository in your Github, `set up a Github Pages project`_ for the new repository. When setting it up, associate the page with the `master` branch. The documentation will now be available publicly.
 
-The documentation must then be generated. Change directories to the ``sphinx/`` folder, then run ``make github``.
-This will build the html web files for the online documentation and place them in the ``docs/`` folder. Add the
-files in the ``docs/`` and ``sphinx/`` in a new commit and push to master. The changes will be reflected on
-your project Github page.
+Edit the files in the ``sphinx/`` directory how you see fit. Documentation for individual classes and files might be found in the source, since documentation is partially autogenerated from comments in the actual code.
 
+The documentation must then be generated. Change directories to the ``sphinx/`` folder, then run ``make github``. This will build the html web files for the online documentation and place them in the ``docs/`` folder. Add the files in the ``docs/`` and ``sphinx/`` in a new commit and push to master. The changes will be reflected on your project Github page.
 
 Creating a Release
 -------------------
@@ -27,7 +19,6 @@ It's important to run the unit tests for the package before pushing a full relea
 
    python3 ally/tests.py
 
-
 To create a release, make sure to change the version number in 4 different files:
 
 * ``README.md``
@@ -35,14 +26,12 @@ To create a release, make sure to change the version number in 4 different files
 * ``sphinx/conf.py``
 * ``setup.py``
 
-Once this is done, all the documentation pages will reflect the new version, and the package release
-will respect this as well.
+Once this is done, all the documentation pages will reflect the new version, and the package release will respect this as well.
 
 Make sure to add new contributers to the ``sphinx/index.rst`` and ``README.md`` pages, if applicable.
 
 To build the package and upload to Pypi, run the commands from the root directory:
 
-
 .. code-block:: bash
 
    python3 setup.py sdist bdist_wheel
@@ -50,8 +39,4 @@ To build the package and upload to Pypi, run the commands from the root director
 
 The code will now be reflected in Pypi, available for public use.
 
-
-
-
 .. _`set up a Github Pages project`: https://docs.github.com/en/github/working-with-github-pages/creating-a-github-pages-site
-
diff --git a/docs/_sources/news.rst.txt b/docs/_sources/news.rst.txt
index 1c16f7fb..477e5ced 100644
--- a/docs/_sources/news.rst.txt
+++ b/docs/_sources/news.rst.txt
@@ -1,9 +1,6 @@
 News Searching
 ================
 
-
-
 .. autoclass:: ally.Ally
    :members: searchNews, lookupNews
-
-
+   :noindex:
diff --git a/docs/_sources/option.rst.txt b/docs/_sources/option.rst.txt
index 285b14c6..069fdcdd 100644
--- a/docs/_sources/option.rst.txt
+++ b/docs/_sources/option.rst.txt
@@ -1,10 +1,6 @@
 Option
 =======
 
-
-
-
 .. autoclass:: ally.Ally
    :members: strikes, expirations, search
-
-
+   :noindex:
diff --git a/docs/_sources/quote.rst.txt b/docs/_sources/quote.rst.txt
index 19d1b3bf..1402c4ca 100644
--- a/docs/_sources/quote.rst.txt
+++ b/docs/_sources/quote.rst.txt
@@ -3,3 +3,4 @@ Quotes
 
 .. autoclass:: ally.Ally
    :members: quote, timesales, stream, toplists
+   :noindex:
diff --git a/docs/_sources/ratelimit.rst.txt b/docs/_sources/ratelimit.rst.txt
index 318bb2ee..c5d732aa 100644
--- a/docs/_sources/ratelimit.rst.txt
+++ b/docs/_sources/ratelimit.rst.txt
@@ -3,22 +3,12 @@ Rate Limiting
 
 Ally imposes rate limits for each account, "designed to protect accounts from abuse and servers from load."
 
-PyAlly has thread-safe systems in place to respect these limits,
-and provides information and flexibility when dealing with these limits.
+PyAlly has thread-safe systems in place to respect these limits, and provides information and flexibility when dealing with these limits.
 
-Every function avaliable in the library has a ``block`` keyword that modifies the behavior of the
-function when the rate limit has been exceeded. When true, the function
-will block the calling thread until the API will accept the call, should the function
-encounter a rate limit exception.
-When false, the function will raise a ``ally.exceptions.RateLimitException``. The user
-can then build custom logic around rate limit failures.
+Every function avaliable in the library has a ``block`` keyword that modifies the behavior of the function when the rate limit has been exceeded. When true, the function will block the calling thread until the API will accept the call, should the function encounter a rate limit exception. When false, the function will raise a ``ally.exceptions.RateLimitException``. The user can then build custom logic around rate limit failures.
 
-Also, users can accesss the current state of the rate limits. Rate limit information
-is held on a module-level, and provides only a single set of limits shared across
-all ``ally.Ally()`` instances.
+Also, users can accesss the current state of the rate limits. Rate limit information is held on a module-level, and provides only a single set of limits shared across all ``ally.Ally()`` instances.
 
 Rate limit information can be queried with the ``ally.RateLimit.snapshot()`` function:
 
-.. automodule:: ally.RateLimit
-   :members: snapshot
-
+.. autofunction:: ally.RateLimit.snapshot
diff --git a/docs/_sources/support.rst.txt b/docs/_sources/support.rst.txt
index 8c49d8be..9f9e69ea 100644
--- a/docs/_sources/support.rst.txt
+++ b/docs/_sources/support.rst.txt
@@ -1,13 +1,9 @@
-=======
 Support
 =======
 
+If you find issues or need help with using the project, please check to see if there's an open issue on Github_, and if not, open a new issue on the page.
 
-If you find issues or need help with using the project, please check to see if there's an open
-issue on Github_, and if not, open a new issue on the page.
-
-The community is pretty active and hopefully there will be someone to answer,
-but feel free to `send me an email`_ and I'll get back with an update as soon as I can.
+The community is pretty active and hopefully there will be someone to answer, but feel free to `send me an email`_ and I'll get back with an update as soon as I can.
 
-.. _Github: https://github.com/alienbrett/PyAlly/issues
+.. _Github: https://github.com/mm0/PyAlly/issues
 .. _`send me an email`: mailto:alienbrett648@gmail.com
diff --git a/docs/_sources/trading.rst.txt b/docs/_sources/trading.rst.txt
index 6cb87112..09bbe300 100644
--- a/docs/_sources/trading.rst.txt
+++ b/docs/_sources/trading.rst.txt
@@ -13,10 +13,7 @@ Each order object must have a few attributes:
 * Time
 * Symbol
 
-
-The parameters can be provided all at once on object instantiation, or any of the orders can be
-set or modifed before submitting.
-
+The parameters can be provided all at once on object instantiation, or any of the orders can be set or modifed before submitting.
 
 Submit a Stock Order
 --------------------------
@@ -54,12 +51,11 @@ Buy 8 shares of AAPL at market price, good for the day.
 	>>> o.orderid
 	'SVI-12345678'
 
-
 Order information can be passed to the class on instantiation. Notice that any or all fields can be None, and added later.
 
 .. autoclass:: ally.Order.Order
    :members: __init__
-
+   :noindex:
 
 Viewing Open Orders
 ---------------------
@@ -104,26 +100,19 @@ The full class documentation:
 .. autoclass:: ally.Order.Order
    :members:
 
-
 Dealing With Options
 --------------------
 
-The only difference between how stocks and options must be handled, is that the option contract
-must be changed into its standard OCC symbol first. Then the option can be treated like any other stock, in every other feature.
-The ``ally.utils.option_format`` function formats the options's unique OCC symbol from its parameters:
+The only difference between how stocks and options must be handled, is that the option contract must be changed into its standard OCC symbol first. Then the option can be treated like any other stock, in every other feature. The ``ally.utils.option_format`` function formats the options's unique OCC symbol from its parameters:
 
 .. autofunction:: ally.utils.option_format
 
-
 This symbol can now be traded, same as any other stock or option.
 
-
-Short sell 1 contract (with contract size 100 shares) of the IBM call specified above,
-limit at $18, good-til-cancelled.
+Short sell 1 contract (with contract size 100 shares) of the IBM call specified above, limit at $18, good-til-cancelled.
 
 .. code-block:: python
 
-
 	>>> o = ally.Order.Order(
 		buysell = 'sellshort',
 		symbol = ibm_call,
@@ -132,12 +121,9 @@ limit at $18, good-til-cancelled.
 		qty = 1
 	)
 
-
-
 Changing Order Parameters
 -------------------------
 
-
 Modifying orders, outstanding or local orders, is easy as well.
 
 .. code-block:: python
@@ -157,23 +143,18 @@ Modifying orders, outstanding or local orders, is easy as well.
 	>>> o.buysell
 	<Side.SellShort: 4>
 
-
 Any of these functions can be used to modify the order's parameters:
 
 .. autoclass:: ally.Order.Order
-   :members: set_buysell, set_instrument, set_time, set_pricing, set_orderid
+   :members: set_buysell, set_time, set_pricing, set_orderid
    :noindex:
 
-
 And the order type (Order, Cancel or Modify) can be set as so:
 
 .. code-block:: python
 
 	o.otype = ally.Order.OType.{Order, Modify, Cancel}
 
-
-
-
 Modifying and Cancelling Outstanding Orders
 -----------------------------------------------
 
@@ -191,7 +172,6 @@ The function will do the rest for you.
 		type_ = ally.Order.OType.Cancel # Either OType.Cancel, or OType.Modify
 	)
 
-
 * Directly modify existing order
 
 .. code-block:: python
@@ -209,8 +189,6 @@ The function will do the rest for you.
 	)
 	>>> a.submit ( cxl, preview=False )
 
-
-
 Orders can be revised once submitted but before execution like so:
 
 .. code-block:: python
@@ -221,8 +199,6 @@ Orders can be revised once submitted but before execution like so:
 	# Submit to ally for revision
 	>>> a.submit ( o, preview=False, type_ = ally.Order.OType.Modify )
 
-
-
 Pricing Types
 ---------------
 
@@ -240,6 +216,5 @@ The Ally API supports 5 price types in total.
 .. autoclass:: ally.Order.StopLimit
    :members: __init__
 
-
 .. autoclass:: ally.Order.TrailingStop
    :members: __init__
diff --git a/docs/static/basic.css b/docs/_static/basic.css
similarity index 99%
rename from docs/static/basic.css
rename to docs/_static/basic.css
index 24a49f09..be19270e 100644
--- a/docs/static/basic.css
+++ b/docs/_static/basic.css
@@ -4,7 +4,7 @@
  *
  * Sphinx stylesheet -- basic theme.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
diff --git a/docs/static/css/badge_only.css b/docs/_static/css/badge_only.css
similarity index 100%
rename from docs/static/css/badge_only.css
rename to docs/_static/css/badge_only.css
diff --git a/docs/static/css/fonts/Roboto-Slab-Bold.woff b/docs/_static/css/fonts/Roboto-Slab-Bold.woff
similarity index 100%
rename from docs/static/css/fonts/Roboto-Slab-Bold.woff
rename to docs/_static/css/fonts/Roboto-Slab-Bold.woff
diff --git a/docs/static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/_static/css/fonts/Roboto-Slab-Bold.woff2
similarity index 100%
rename from docs/static/css/fonts/Roboto-Slab-Bold.woff2
rename to docs/_static/css/fonts/Roboto-Slab-Bold.woff2
diff --git a/docs/static/css/fonts/Roboto-Slab-Regular.woff b/docs/_static/css/fonts/Roboto-Slab-Regular.woff
similarity index 100%
rename from docs/static/css/fonts/Roboto-Slab-Regular.woff
rename to docs/_static/css/fonts/Roboto-Slab-Regular.woff
diff --git a/docs/static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/_static/css/fonts/Roboto-Slab-Regular.woff2
similarity index 100%
rename from docs/static/css/fonts/Roboto-Slab-Regular.woff2
rename to docs/_static/css/fonts/Roboto-Slab-Regular.woff2
diff --git a/docs/static/css/fonts/fontawesome-webfont.eot b/docs/_static/css/fonts/fontawesome-webfont.eot
similarity index 100%
rename from docs/static/css/fonts/fontawesome-webfont.eot
rename to docs/_static/css/fonts/fontawesome-webfont.eot
diff --git a/docs/static/css/fonts/fontawesome-webfont.svg b/docs/_static/css/fonts/fontawesome-webfont.svg
similarity index 100%
rename from docs/static/css/fonts/fontawesome-webfont.svg
rename to docs/_static/css/fonts/fontawesome-webfont.svg
diff --git a/docs/static/css/fonts/fontawesome-webfont.ttf b/docs/_static/css/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from docs/static/css/fonts/fontawesome-webfont.ttf
rename to docs/_static/css/fonts/fontawesome-webfont.ttf
diff --git a/docs/static/css/fonts/fontawesome-webfont.woff b/docs/_static/css/fonts/fontawesome-webfont.woff
similarity index 100%
rename from docs/static/css/fonts/fontawesome-webfont.woff
rename to docs/_static/css/fonts/fontawesome-webfont.woff
diff --git a/docs/static/css/fonts/fontawesome-webfont.woff2 b/docs/_static/css/fonts/fontawesome-webfont.woff2
similarity index 100%
rename from docs/static/css/fonts/fontawesome-webfont.woff2
rename to docs/_static/css/fonts/fontawesome-webfont.woff2
diff --git a/docs/static/css/fonts/lato-bold-italic.woff b/docs/_static/css/fonts/lato-bold-italic.woff
similarity index 100%
rename from docs/static/css/fonts/lato-bold-italic.woff
rename to docs/_static/css/fonts/lato-bold-italic.woff
diff --git a/docs/static/css/fonts/lato-bold-italic.woff2 b/docs/_static/css/fonts/lato-bold-italic.woff2
similarity index 100%
rename from docs/static/css/fonts/lato-bold-italic.woff2
rename to docs/_static/css/fonts/lato-bold-italic.woff2
diff --git a/docs/static/css/fonts/lato-bold.woff b/docs/_static/css/fonts/lato-bold.woff
similarity index 100%
rename from docs/static/css/fonts/lato-bold.woff
rename to docs/_static/css/fonts/lato-bold.woff
diff --git a/docs/static/css/fonts/lato-bold.woff2 b/docs/_static/css/fonts/lato-bold.woff2
similarity index 100%
rename from docs/static/css/fonts/lato-bold.woff2
rename to docs/_static/css/fonts/lato-bold.woff2
diff --git a/docs/static/css/fonts/lato-normal-italic.woff b/docs/_static/css/fonts/lato-normal-italic.woff
similarity index 100%
rename from docs/static/css/fonts/lato-normal-italic.woff
rename to docs/_static/css/fonts/lato-normal-italic.woff
diff --git a/docs/static/css/fonts/lato-normal-italic.woff2 b/docs/_static/css/fonts/lato-normal-italic.woff2
similarity index 100%
rename from docs/static/css/fonts/lato-normal-italic.woff2
rename to docs/_static/css/fonts/lato-normal-italic.woff2
diff --git a/docs/static/css/fonts/lato-normal.woff b/docs/_static/css/fonts/lato-normal.woff
similarity index 100%
rename from docs/static/css/fonts/lato-normal.woff
rename to docs/_static/css/fonts/lato-normal.woff
diff --git a/docs/static/css/fonts/lato-normal.woff2 b/docs/_static/css/fonts/lato-normal.woff2
similarity index 100%
rename from docs/static/css/fonts/lato-normal.woff2
rename to docs/_static/css/fonts/lato-normal.woff2
diff --git a/docs/static/css/theme.css b/docs/_static/css/theme.css
similarity index 100%
rename from docs/static/css/theme.css
rename to docs/_static/css/theme.css
diff --git a/docs/static/doctools.js b/docs/_static/doctools.js
similarity index 96%
rename from docs/static/doctools.js
rename to docs/_static/doctools.js
index 7d88f807..61ac9d26 100644
--- a/docs/static/doctools.js
+++ b/docs/_static/doctools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for all documentation.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -29,9 +29,14 @@ if (!window.console || !console.firebug) {
 
 /**
  * small helper function to urldecode strings
+ *
+ * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
  */
 jQuery.urldecode = function(x) {
-  return decodeURIComponent(x).replace(/\+/g, ' ');
+  if (!x) {
+    return x
+  }
+  return decodeURIComponent(x.replace(/\+/g, ' '));
 };
 
 /**
diff --git a/docs/static/documentation_options.js b/docs/_static/documentation_options.js
similarity index 93%
rename from docs/static/documentation_options.js
rename to docs/_static/documentation_options.js
index b283bb6f..1e14c23d 100644
--- a/docs/static/documentation_options.js
+++ b/docs/_static/documentation_options.js
@@ -1,6 +1,6 @@
 var DOCUMENTATION_OPTIONS = {
     URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
-    VERSION: '1.1.1',
+    VERSION: '1.1.2',
     LANGUAGE: 'None',
     COLLAPSE_INDEX: false,
     BUILDER: 'html',
diff --git a/docs/_static/file.png b/docs/_static/file.png
new file mode 100644
index 00000000..a858a410
Binary files /dev/null and b/docs/_static/file.png differ
diff --git a/docs/_static/fonts/Inconsolata-Bold.ttf b/docs/_static/fonts/Inconsolata-Bold.ttf
new file mode 100644
index 00000000..809c1f58
Binary files /dev/null and b/docs/_static/fonts/Inconsolata-Bold.ttf differ
diff --git a/docs/_static/fonts/Inconsolata-Regular.ttf b/docs/_static/fonts/Inconsolata-Regular.ttf
new file mode 100644
index 00000000..fc981ce7
Binary files /dev/null and b/docs/_static/fonts/Inconsolata-Regular.ttf differ
diff --git a/docs/_static/fonts/Inconsolata.ttf b/docs/_static/fonts/Inconsolata.ttf
new file mode 100644
index 00000000..4b8a36d2
Binary files /dev/null and b/docs/_static/fonts/Inconsolata.ttf differ
diff --git a/docs/_static/fonts/Lato-Bold.ttf b/docs/_static/fonts/Lato-Bold.ttf
new file mode 100644
index 00000000..1d23c706
Binary files /dev/null and b/docs/_static/fonts/Lato-Bold.ttf differ
diff --git a/docs/_static/fonts/Lato-Regular.ttf b/docs/_static/fonts/Lato-Regular.ttf
new file mode 100644
index 00000000..0f3d0f83
Binary files /dev/null and b/docs/_static/fonts/Lato-Regular.ttf differ
diff --git a/docs/static/fonts/Lato/lato-bold.eot b/docs/_static/fonts/Lato/lato-bold.eot
similarity index 100%
rename from docs/static/fonts/Lato/lato-bold.eot
rename to docs/_static/fonts/Lato/lato-bold.eot
diff --git a/docs/static/fonts/Lato/lato-bold.ttf b/docs/_static/fonts/Lato/lato-bold.ttf
similarity index 100%
rename from docs/static/fonts/Lato/lato-bold.ttf
rename to docs/_static/fonts/Lato/lato-bold.ttf
diff --git a/docs/static/fonts/Lato/lato-bold.woff b/docs/_static/fonts/Lato/lato-bold.woff
similarity index 100%
rename from docs/static/fonts/Lato/lato-bold.woff
rename to docs/_static/fonts/Lato/lato-bold.woff
diff --git a/docs/static/fonts/Lato/lato-bold.woff2 b/docs/_static/fonts/Lato/lato-bold.woff2
similarity index 100%
rename from docs/static/fonts/Lato/lato-bold.woff2
rename to docs/_static/fonts/Lato/lato-bold.woff2
diff --git a/docs/static/fonts/Lato/lato-bolditalic.eot b/docs/_static/fonts/Lato/lato-bolditalic.eot
similarity index 100%
rename from docs/static/fonts/Lato/lato-bolditalic.eot
rename to docs/_static/fonts/Lato/lato-bolditalic.eot
diff --git a/docs/static/fonts/Lato/lato-bolditalic.ttf b/docs/_static/fonts/Lato/lato-bolditalic.ttf
similarity index 100%
rename from docs/static/fonts/Lato/lato-bolditalic.ttf
rename to docs/_static/fonts/Lato/lato-bolditalic.ttf
diff --git a/docs/static/fonts/Lato/lato-bolditalic.woff b/docs/_static/fonts/Lato/lato-bolditalic.woff
similarity index 100%
rename from docs/static/fonts/Lato/lato-bolditalic.woff
rename to docs/_static/fonts/Lato/lato-bolditalic.woff
diff --git a/docs/static/fonts/Lato/lato-bolditalic.woff2 b/docs/_static/fonts/Lato/lato-bolditalic.woff2
similarity index 100%
rename from docs/static/fonts/Lato/lato-bolditalic.woff2
rename to docs/_static/fonts/Lato/lato-bolditalic.woff2
diff --git a/docs/static/fonts/Lato/lato-italic.eot b/docs/_static/fonts/Lato/lato-italic.eot
similarity index 100%
rename from docs/static/fonts/Lato/lato-italic.eot
rename to docs/_static/fonts/Lato/lato-italic.eot
diff --git a/docs/static/fonts/Lato/lato-italic.ttf b/docs/_static/fonts/Lato/lato-italic.ttf
similarity index 100%
rename from docs/static/fonts/Lato/lato-italic.ttf
rename to docs/_static/fonts/Lato/lato-italic.ttf
diff --git a/docs/static/fonts/Lato/lato-italic.woff b/docs/_static/fonts/Lato/lato-italic.woff
similarity index 100%
rename from docs/static/fonts/Lato/lato-italic.woff
rename to docs/_static/fonts/Lato/lato-italic.woff
diff --git a/docs/static/fonts/Lato/lato-italic.woff2 b/docs/_static/fonts/Lato/lato-italic.woff2
similarity index 100%
rename from docs/static/fonts/Lato/lato-italic.woff2
rename to docs/_static/fonts/Lato/lato-italic.woff2
diff --git a/docs/static/fonts/Lato/lato-regular.eot b/docs/_static/fonts/Lato/lato-regular.eot
similarity index 100%
rename from docs/static/fonts/Lato/lato-regular.eot
rename to docs/_static/fonts/Lato/lato-regular.eot
diff --git a/docs/static/fonts/Lato/lato-regular.ttf b/docs/_static/fonts/Lato/lato-regular.ttf
similarity index 100%
rename from docs/static/fonts/Lato/lato-regular.ttf
rename to docs/_static/fonts/Lato/lato-regular.ttf
diff --git a/docs/static/fonts/Lato/lato-regular.woff b/docs/_static/fonts/Lato/lato-regular.woff
similarity index 100%
rename from docs/static/fonts/Lato/lato-regular.woff
rename to docs/_static/fonts/Lato/lato-regular.woff
diff --git a/docs/static/fonts/Lato/lato-regular.woff2 b/docs/_static/fonts/Lato/lato-regular.woff2
similarity index 100%
rename from docs/static/fonts/Lato/lato-regular.woff2
rename to docs/_static/fonts/Lato/lato-regular.woff2
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_static/fonts/RobotoSlab-Bold.ttf
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
rename to docs/_static/fonts/RobotoSlab-Bold.ttf
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_static/fonts/RobotoSlab-Regular.ttf
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
rename to docs/_static/fonts/RobotoSlab-Regular.ttf
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot
diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf
new file mode 100644
index 00000000..df5d1df2
Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot
diff --git a/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf
new file mode 100644
index 00000000..eb52a790
Binary files /dev/null and b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff
diff --git a/docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
similarity index 100%
rename from docs/static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
rename to docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2
diff --git a/docs/static/fonts/fontawesome-webfont.eot b/docs/_static/fonts/fontawesome-webfont.eot
similarity index 100%
rename from docs/static/fonts/fontawesome-webfont.eot
rename to docs/_static/fonts/fontawesome-webfont.eot
diff --git a/docs/static/fonts/fontawesome-webfont.svg b/docs/_static/fonts/fontawesome-webfont.svg
similarity index 100%
rename from docs/static/fonts/fontawesome-webfont.svg
rename to docs/_static/fonts/fontawesome-webfont.svg
diff --git a/docs/static/fonts/fontawesome-webfont.ttf b/docs/_static/fonts/fontawesome-webfont.ttf
similarity index 100%
rename from docs/static/fonts/fontawesome-webfont.ttf
rename to docs/_static/fonts/fontawesome-webfont.ttf
diff --git a/docs/static/fonts/fontawesome-webfont.woff b/docs/_static/fonts/fontawesome-webfont.woff
similarity index 100%
rename from docs/static/fonts/fontawesome-webfont.woff
rename to docs/_static/fonts/fontawesome-webfont.woff
diff --git a/docs/static/fonts/fontawesome-webfont.woff2 b/docs/_static/fonts/fontawesome-webfont.woff2
similarity index 100%
rename from docs/static/fonts/fontawesome-webfont.woff2
rename to docs/_static/fonts/fontawesome-webfont.woff2
diff --git a/resources/details.PNG b/docs/_static/images/details.png
similarity index 100%
rename from resources/details.PNG
rename to docs/_static/images/details.png
diff --git a/resources/new_application.PNG b/docs/_static/images/new_application.png
similarity index 100%
rename from resources/new_application.PNG
rename to docs/_static/images/new_application.png
diff --git a/resources/tools.PNG b/docs/_static/images/tools.png
similarity index 100%
rename from resources/tools.PNG
rename to docs/_static/images/tools.png
diff --git a/docs/static/jquery-3.5.1.js b/docs/_static/jquery-3.5.1.js
similarity index 100%
rename from docs/static/jquery-3.5.1.js
rename to docs/_static/jquery-3.5.1.js
diff --git a/docs/static/jquery.js b/docs/_static/jquery.js
similarity index 100%
rename from docs/static/jquery.js
rename to docs/_static/jquery.js
diff --git a/docs/static/js/badge_only.js b/docs/_static/js/badge_only.js
similarity index 100%
rename from docs/static/js/badge_only.js
rename to docs/_static/js/badge_only.js
diff --git a/docs/static/js/html5shiv-printshiv.min.js b/docs/_static/js/html5shiv-printshiv.min.js
similarity index 100%
rename from docs/static/js/html5shiv-printshiv.min.js
rename to docs/_static/js/html5shiv-printshiv.min.js
diff --git a/docs/static/js/html5shiv.min.js b/docs/_static/js/html5shiv.min.js
similarity index 100%
rename from docs/static/js/html5shiv.min.js
rename to docs/_static/js/html5shiv.min.js
diff --git a/docs/static/js/modernizr.min.js b/docs/_static/js/modernizr.min.js
similarity index 100%
rename from docs/static/js/modernizr.min.js
rename to docs/_static/js/modernizr.min.js
diff --git a/docs/static/js/theme.js b/docs/_static/js/theme.js
similarity index 100%
rename from docs/static/js/theme.js
rename to docs/_static/js/theme.js
diff --git a/docs/static/language_data.js b/docs/_static/language_data.js
similarity index 98%
rename from docs/static/language_data.js
rename to docs/_static/language_data.js
index d2b4ee91..863704b3 100644
--- a/docs/static/language_data.js
+++ b/docs/_static/language_data.js
@@ -5,7 +5,7 @@
  * This script contains the language-specific data used by searchtools.js,
  * namely the list of stopwords, stemmer, scorer and splitter.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -13,7 +13,8 @@
 var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
 
 
-/* Non-minified version JS is _stemmer.js if file is provided */ 
+/* Non-minified version is copied as a separate JS file, is available */
+
 /**
  * Porter Stemmer
  */
@@ -199,7 +200,6 @@ var Stemmer = function() {
 
 
 
-
 var splitChars = (function() {
     var result = {};
     var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
diff --git a/docs/_static/minus.png b/docs/_static/minus.png
new file mode 100644
index 00000000..d96755fd
Binary files /dev/null and b/docs/_static/minus.png differ
diff --git a/docs/_static/plus.png b/docs/_static/plus.png
new file mode 100644
index 00000000..7107cec9
Binary files /dev/null and b/docs/_static/plus.png differ
diff --git a/docs/static/pygments.css b/docs/_static/pygments.css
similarity index 93%
rename from docs/static/pygments.css
rename to docs/_static/pygments.css
index 13b72433..582d5c3a 100644
--- a/docs/static/pygments.css
+++ b/docs/_static/pygments.css
@@ -1,7 +1,7 @@
 pre { line-height: 125%; }
-td.linenos pre { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }
-span.linenos { color: #000000; background-color: #f0f0f0; padding-left: 5px; padding-right: 5px; }
-td.linenos pre.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
+td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
+td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
 .highlight .hll { background-color: #ffffcc }
 .highlight { background: #f8f8f8; }
diff --git a/docs/static/searchtools.js b/docs/_static/searchtools.js
similarity index 95%
rename from docs/static/searchtools.js
rename to docs/_static/searchtools.js
index 261ecaa9..1a90152e 100644
--- a/docs/static/searchtools.js
+++ b/docs/_static/searchtools.js
@@ -4,7 +4,7 @@
  *
  * Sphinx JavaScript utilities for the full-text search.
  *
- * :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
+ * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
  * :license: BSD, see LICENSE for details.
  *
  */
@@ -248,7 +248,7 @@ var Search = {
       // results left, load the summary and display it
       if (results.length) {
         var item = results.pop();
-        var listItem = $('<li style="display:none"></li>');
+        var listItem = $('<li></li>');
         var requestUrl = "";
         var linkUrl = "";
         if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
@@ -273,9 +273,9 @@ var Search = {
         if (item[3]) {
           listItem.append($('<span> (' + item[3] + ')</span>'));
           Search.output.append(listItem);
-          listItem.slideDown(5, function() {
+          setTimeout(function() {
             displayNextItem();
-          });
+          }, 5);
         } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
           $.ajax({url: requestUrl,
                   dataType: "text",
@@ -285,16 +285,16 @@ var Search = {
                       listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
                     }
                     Search.output.append(listItem);
-                    listItem.slideDown(5, function() {
+                    setTimeout(function() {
                       displayNextItem();
-                    });
+                    }, 5);
                   }});
         } else {
           // no source available, just display title
           Search.output.append(listItem);
-          listItem.slideDown(5, function() {
+          setTimeout(function() {
             displayNextItem();
-          });
+          }, 5);
         }
       }
       // search finished, update title and status message
@@ -379,6 +379,13 @@ var Search = {
     return results;
   },
 
+  /**
+   * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
+   */
+  escapeRegExp : function(string) {
+    return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
+  },
+
   /**
    * search for full-text terms in the index
    */
@@ -402,13 +409,14 @@ var Search = {
       ];
       // add support for partial matches
       if (word.length > 2) {
+        var word_regex = this.escapeRegExp(word);
         for (var w in terms) {
-          if (w.match(word) && !terms[word]) {
+          if (w.match(word_regex) && !terms[word]) {
             _o.push({files: terms[w], score: Scorer.partialTerm})
           }
         }
         for (var w in titleterms) {
-          if (w.match(word) && !titleterms[word]) {
+          if (w.match(word_regex) && !titleterms[word]) {
               _o.push({files: titleterms[w], score: Scorer.partialTitle})
           }
         }
diff --git a/docs/_static/underscore-1.12.0.js b/docs/_static/underscore-1.12.0.js
new file mode 100644
index 00000000..3af6352e
--- /dev/null
+++ b/docs/_static/underscore-1.12.0.js
@@ -0,0 +1,2027 @@
+(function (global, factory) {
+  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+  typeof define === 'function' && define.amd ? define('underscore', factory) :
+  (global = global || self, (function () {
+    var current = global._;
+    var exports = global._ = factory();
+    exports.noConflict = function () { global._ = current; return exports; };
+  }()));
+}(this, (function () {
+  //     Underscore.js 1.12.0
+  //     https://underscorejs.org
+  //     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+  //     Underscore may be freely distributed under the MIT license.
+
+  // Current version.
+  var VERSION = '1.12.0';
+
+  // Establish the root object, `window` (`self`) in the browser, `global`
+  // on the server, or `this` in some virtual machines. We use `self`
+  // instead of `window` for `WebWorker` support.
+  var root = typeof self == 'object' && self.self === self && self ||
+            typeof global == 'object' && global.global === global && global ||
+            Function('return this')() ||
+            {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype;
+  var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var push = ArrayProto.push,
+      slice = ArrayProto.slice,
+      toString = ObjProto.toString,
+      hasOwnProperty = ObjProto.hasOwnProperty;
+
+  // Modern feature detection.
+  var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
+      supportsDataView = typeof DataView !== 'undefined';
+
+  // All **ECMAScript 5+** native function implementations that we hope to use
+  // are declared here.
+  var nativeIsArray = Array.isArray,
+      nativeKeys = Object.keys,
+      nativeCreate = Object.create,
+      nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;
+
+  // Create references to these builtin functions because we override them.
+  var _isNaN = isNaN,
+      _isFinite = isFinite;
+
+  // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.
+  var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');
+  var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
+    'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];
+
+  // The largest integer that can be represented exactly.
+  var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;
+
+  // Some functions take a variable number of arguments, or a few expected
+  // arguments at the beginning and then a variable number of values to operate
+  // on. This helper accumulates all remaining arguments past the function’s
+  // argument length (or an explicit `startIndex`), into an array that becomes
+  // the last argument. Similar to ES6’s "rest parameter".
+  function restArguments(func, startIndex) {
+    startIndex = startIndex == null ? func.length - 1 : +startIndex;
+    return function() {
+      var length = Math.max(arguments.length - startIndex, 0),
+          rest = Array(length),
+          index = 0;
+      for (; index < length; index++) {
+        rest[index] = arguments[index + startIndex];
+      }
+      switch (startIndex) {
+        case 0: return func.call(this, rest);
+        case 1: return func.call(this, arguments[0], rest);
+        case 2: return func.call(this, arguments[0], arguments[1], rest);
+      }
+      var args = Array(startIndex + 1);
+      for (index = 0; index < startIndex; index++) {
+        args[index] = arguments[index];
+      }
+      args[startIndex] = rest;
+      return func.apply(this, args);
+    };
+  }
+
+  // Is a given variable an object?
+  function isObject(obj) {
+    var type = typeof obj;
+    return type === 'function' || type === 'object' && !!obj;
+  }
+
+  // Is a given value equal to null?
+  function isNull(obj) {
+    return obj === null;
+  }
+
+  // Is a given variable undefined?
+  function isUndefined(obj) {
+    return obj === void 0;
+  }
+
+  // Is a given value a boolean?
+  function isBoolean(obj) {
+    return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
+  }
+
+  // Is a given value a DOM element?
+  function isElement(obj) {
+    return !!(obj && obj.nodeType === 1);
+  }
+
+  // Internal function for creating a `toString`-based type tester.
+  function tagTester(name) {
+    var tag = '[object ' + name + ']';
+    return function(obj) {
+      return toString.call(obj) === tag;
+    };
+  }
+
+  var isString = tagTester('String');
+
+  var isNumber = tagTester('Number');
+
+  var isDate = tagTester('Date');
+
+  var isRegExp = tagTester('RegExp');
+
+  var isError = tagTester('Error');
+
+  var isSymbol = tagTester('Symbol');
+
+  var isArrayBuffer = tagTester('ArrayBuffer');
+
+  var isFunction = tagTester('Function');
+
+  // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old
+  // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).
+  var nodelist = root.document && root.document.childNodes;
+  if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {
+    isFunction = function(obj) {
+      return typeof obj == 'function' || false;
+    };
+  }
+
+  var isFunction$1 = isFunction;
+
+  var hasObjectTag = tagTester('Object');
+
+  // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.
+  // In IE 11, the most common among them, this problem also applies to
+  // `Map`, `WeakMap` and `Set`.
+  var hasStringTagBug = (
+        supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))
+      ),
+      isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));
+
+  var isDataView = tagTester('DataView');
+
+  // In IE 10 - Edge 13, we need a different heuristic
+  // to determine whether an object is a `DataView`.
+  function ie10IsDataView(obj) {
+    return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);
+  }
+
+  var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native `Array.isArray`.
+  var isArray = nativeIsArray || tagTester('Array');
+
+  // Internal function to check whether `key` is an own property name of `obj`.
+  function has(obj, key) {
+    return obj != null && hasOwnProperty.call(obj, key);
+  }
+
+  var isArguments = tagTester('Arguments');
+
+  // Define a fallback version of the method in browsers (ahem, IE < 9), where
+  // there isn't any inspectable "Arguments" type.
+  (function() {
+    if (!isArguments(arguments)) {
+      isArguments = function(obj) {
+        return has(obj, 'callee');
+      };
+    }
+  }());
+
+  var isArguments$1 = isArguments;
+
+  // Is a given object a finite number?
+  function isFinite$1(obj) {
+    return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));
+  }
+
+  // Is the given value `NaN`?
+  function isNaN$1(obj) {
+    return isNumber(obj) && _isNaN(obj);
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function constant(value) {
+    return function() {
+      return value;
+    };
+  }
+
+  // Common internal logic for `isArrayLike` and `isBufferLike`.
+  function createSizePropertyCheck(getSizeProperty) {
+    return function(collection) {
+      var sizeProperty = getSizeProperty(collection);
+      return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;
+    }
+  }
+
+  // Internal helper to generate a function to obtain property `key` from `obj`.
+  function shallowProperty(key) {
+    return function(obj) {
+      return obj == null ? void 0 : obj[key];
+    };
+  }
+
+  // Internal helper to obtain the `byteLength` property of an object.
+  var getByteLength = shallowProperty('byteLength');
+
+  // Internal helper to determine whether we should spend extensive checks against
+  // `ArrayBuffer` et al.
+  var isBufferLike = createSizePropertyCheck(getByteLength);
+
+  // Is a given value a typed array?
+  var typedArrayPattern = /\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;
+  function isTypedArray(obj) {
+    // `ArrayBuffer.isView` is the most future-proof, so use it when available.
+    // Otherwise, fall back on the above regular expression.
+    return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :
+                  isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));
+  }
+
+  var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);
+
+  // Internal helper to obtain the `length` property of an object.
+  var getLength = shallowProperty('length');
+
+  // Internal helper to create a simple lookup structure.
+  // `collectNonEnumProps` used to depend on `_.contains`, but this led to
+  // circular imports. `emulatedSet` is a one-off solution that only works for
+  // arrays of strings.
+  function emulatedSet(keys) {
+    var hash = {};
+    for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;
+    return {
+      contains: function(key) { return hash[key]; },
+      push: function(key) {
+        hash[key] = true;
+        return keys.push(key);
+      }
+    };
+  }
+
+  // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't
+  // be iterated by `for key in ...` and thus missed. Extends `keys` in place if
+  // needed.
+  function collectNonEnumProps(obj, keys) {
+    keys = emulatedSet(keys);
+    var nonEnumIdx = nonEnumerableProps.length;
+    var constructor = obj.constructor;
+    var proto = isFunction$1(constructor) && constructor.prototype || ObjProto;
+
+    // Constructor is a special case.
+    var prop = 'constructor';
+    if (has(obj, prop) && !keys.contains(prop)) keys.push(prop);
+
+    while (nonEnumIdx--) {
+      prop = nonEnumerableProps[nonEnumIdx];
+      if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {
+        keys.push(prop);
+      }
+    }
+  }
+
+  // Retrieve the names of an object's own properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`.
+  function keys(obj) {
+    if (!isObject(obj)) return [];
+    if (nativeKeys) return nativeKeys(obj);
+    var keys = [];
+    for (var key in obj) if (has(obj, key)) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  function isEmpty(obj) {
+    if (obj == null) return true;
+    // Skip the more expensive `toString`-based type checks if `obj` has no
+    // `.length`.
+    var length = getLength(obj);
+    if (typeof length == 'number' && (
+      isArray(obj) || isString(obj) || isArguments$1(obj)
+    )) return length === 0;
+    return getLength(keys(obj)) === 0;
+  }
+
+  // Returns whether an object has a given set of `key:value` pairs.
+  function isMatch(object, attrs) {
+    var _keys = keys(attrs), length = _keys.length;
+    if (object == null) return !length;
+    var obj = Object(object);
+    for (var i = 0; i < length; i++) {
+      var key = _keys[i];
+      if (attrs[key] !== obj[key] || !(key in obj)) return false;
+    }
+    return true;
+  }
+
+  // If Underscore is called as a function, it returns a wrapped object that can
+  // be used OO-style. This wrapper holds altered versions of all functions added
+  // through `_.mixin`. Wrapped objects may be chained.
+  function _(obj) {
+    if (obj instanceof _) return obj;
+    if (!(this instanceof _)) return new _(obj);
+    this._wrapped = obj;
+  }
+
+  _.VERSION = VERSION;
+
+  // Extracts the result from a wrapped and chained object.
+  _.prototype.value = function() {
+    return this._wrapped;
+  };
+
+  // Provide unwrapping proxies for some methods used in engine operations
+  // such as arithmetic and JSON stringification.
+  _.prototype.valueOf = _.prototype.toJSON = _.prototype.value;
+
+  _.prototype.toString = function() {
+    return String(this._wrapped);
+  };
+
+  // Internal function to wrap or shallow-copy an ArrayBuffer,
+  // typed array or DataView to a new view, reusing the buffer.
+  function toBufferView(bufferSource) {
+    return new Uint8Array(
+      bufferSource.buffer || bufferSource,
+      bufferSource.byteOffset || 0,
+      getByteLength(bufferSource)
+    );
+  }
+
+  // We use this string twice, so give it a name for minification.
+  var tagDataView = '[object DataView]';
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function eq(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a === 1 / b;
+    // `null` or `undefined` only equal to itself (strict comparison).
+    if (a == null || b == null) return false;
+    // `NaN`s are equivalent, but non-reflexive.
+    if (a !== a) return b !== b;
+    // Exhaust primitive checks
+    var type = typeof a;
+    if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;
+    return deepEq(a, b, aStack, bStack);
+  }
+
+  // Internal recursive comparison function for `_.isEqual`.
+  function deepEq(a, b, aStack, bStack) {
+    // Unwrap any wrapped objects.
+    if (a instanceof _) a = a._wrapped;
+    if (b instanceof _) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className !== toString.call(b)) return false;
+    // Work around a bug in IE 10 - Edge 13.
+    if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {
+      if (!isDataView$1(b)) return false;
+      className = tagDataView;
+    }
+    switch (className) {
+      // These types are compared by value.
+      case '[object RegExp]':
+        // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return '' + a === '' + b;
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive.
+        // Object(NaN) is equivalent to NaN.
+        if (+a !== +a) return +b !== +b;
+        // An `egal` comparison is performed for other numeric values.
+        return +a === 0 ? 1 / +a === 1 / b : +a === +b;
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a === +b;
+      case '[object Symbol]':
+        return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);
+      case '[object ArrayBuffer]':
+      case tagDataView:
+        // Coerce to typed array so we can fall through.
+        return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);
+    }
+
+    var areArrays = className === '[object Array]';
+    if (!areArrays && isTypedArray$1(a)) {
+        var byteLength = getByteLength(a);
+        if (byteLength !== getByteLength(b)) return false;
+        if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;
+        areArrays = true;
+    }
+    if (!areArrays) {
+      if (typeof a != 'object' || typeof b != 'object') return false;
+
+      // Objects with different constructors are not equivalent, but `Object`s or `Array`s
+      // from different frames are.
+      var aCtor = a.constructor, bCtor = b.constructor;
+      if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&
+                               isFunction$1(bCtor) && bCtor instanceof bCtor)
+                          && ('constructor' in a && 'constructor' in b)) {
+        return false;
+      }
+    }
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+
+    // Initializing stack of traversed objects.
+    // It's done here since we only need them for objects and arrays comparison.
+    aStack = aStack || [];
+    bStack = bStack || [];
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] === a) return bStack[length] === b;
+    }
+
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+
+    // Recursively compare objects and arrays.
+    if (areArrays) {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      length = a.length;
+      if (length !== b.length) return false;
+      // Deep compare the contents, ignoring non-numeric properties.
+      while (length--) {
+        if (!eq(a[length], b[length], aStack, bStack)) return false;
+      }
+    } else {
+      // Deep compare objects.
+      var _keys = keys(a), key;
+      length = _keys.length;
+      // Ensure that both objects contain the same number of properties before comparing deep equality.
+      if (keys(b).length !== length) return false;
+      while (length--) {
+        // Deep compare each member
+        key = _keys[length];
+        if (!(has(b, key) && eq(a[key], b[key], aStack, bStack))) return false;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return true;
+  }
+
+  // Perform a deep comparison to check if two objects are equal.
+  function isEqual(a, b) {
+    return eq(a, b);
+  }
+
+  // Retrieve all the enumerable property names of an object.
+  function allKeys(obj) {
+    if (!isObject(obj)) return [];
+    var keys = [];
+    for (var key in obj) keys.push(key);
+    // Ahem, IE < 9.
+    if (hasEnumBug) collectNonEnumProps(obj, keys);
+    return keys;
+  }
+
+  // Since the regular `Object.prototype.toString` type tests don't work for
+  // some types in IE 11, we use a fingerprinting heuristic instead, based
+  // on the methods. It's not great, but it's the best we got.
+  // The fingerprint method lists are defined below.
+  function ie11fingerprint(methods) {
+    var length = getLength(methods);
+    return function(obj) {
+      if (obj == null) return false;
+      // `Map`, `WeakMap` and `Set` have no enumerable keys.
+      var keys = allKeys(obj);
+      if (getLength(keys)) return false;
+      for (var i = 0; i < length; i++) {
+        if (!isFunction$1(obj[methods[i]])) return false;
+      }
+      // If we are testing against `WeakMap`, we need to ensure that
+      // `obj` doesn't have a `forEach` method in order to distinguish
+      // it from a regular `Map`.
+      return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);
+    };
+  }
+
+  // In the interest of compact minification, we write
+  // each string in the fingerprints only once.
+  var forEachName = 'forEach',
+      hasName = 'has',
+      commonInit = ['clear', 'delete'],
+      mapTail = ['get', hasName, 'set'];
+
+  // `Map`, `WeakMap` and `Set` each have slightly different
+  // combinations of the above sublists.
+  var mapMethods = commonInit.concat(forEachName, mapTail),
+      weakMapMethods = commonInit.concat(mapTail),
+      setMethods = ['add'].concat(commonInit, forEachName, hasName);
+
+  var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');
+
+  var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');
+
+  var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');
+
+  var isWeakSet = tagTester('WeakSet');
+
+  // Retrieve the values of an object's properties.
+  function values(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var values = Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[_keys[i]];
+    }
+    return values;
+  }
+
+  // Convert an object into a list of `[key, value]` pairs.
+  // The opposite of `_.object` with one argument.
+  function pairs(obj) {
+    var _keys = keys(obj);
+    var length = _keys.length;
+    var pairs = Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [_keys[i], obj[_keys[i]]];
+    }
+    return pairs;
+  }
+
+  // Invert the keys and values of an object. The values must be serializable.
+  function invert(obj) {
+    var result = {};
+    var _keys = keys(obj);
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      result[obj[_keys[i]]] = _keys[i];
+    }
+    return result;
+  }
+
+  // Return a sorted list of the function names available on the object.
+  function functions(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (isFunction$1(obj[key])) names.push(key);
+    }
+    return names.sort();
+  }
+
+  // An internal function for creating assigner functions.
+  function createAssigner(keysFunc, defaults) {
+    return function(obj) {
+      var length = arguments.length;
+      if (defaults) obj = Object(obj);
+      if (length < 2 || obj == null) return obj;
+      for (var index = 1; index < length; index++) {
+        var source = arguments[index],
+            keys = keysFunc(source),
+            l = keys.length;
+        for (var i = 0; i < l; i++) {
+          var key = keys[i];
+          if (!defaults || obj[key] === void 0) obj[key] = source[key];
+        }
+      }
+      return obj;
+    };
+  }
+
+  // Extend a given object with all the properties in passed-in object(s).
+  var extend = createAssigner(allKeys);
+
+  // Assigns a given object with all the own properties in the passed-in
+  // object(s).
+  // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)
+  var extendOwn = createAssigner(keys);
+
+  // Fill in a given object with default properties.
+  var defaults = createAssigner(allKeys, true);
+
+  // Create a naked function reference for surrogate-prototype-swapping.
+  function ctor() {
+    return function(){};
+  }
+
+  // An internal function for creating a new object that inherits from another.
+  function baseCreate(prototype) {
+    if (!isObject(prototype)) return {};
+    if (nativeCreate) return nativeCreate(prototype);
+    var Ctor = ctor();
+    Ctor.prototype = prototype;
+    var result = new Ctor;
+    Ctor.prototype = null;
+    return result;
+  }
+
+  // Creates an object that inherits from the given prototype object.
+  // If additional properties are provided then they will be added to the
+  // created object.
+  function create(prototype, props) {
+    var result = baseCreate(prototype);
+    if (props) extendOwn(result, props);
+    return result;
+  }
+
+  // Create a (shallow-cloned) duplicate of an object.
+  function clone(obj) {
+    if (!isObject(obj)) return obj;
+    return isArray(obj) ? obj.slice() : extend({}, obj);
+  }
+
+  // Invokes `interceptor` with the `obj` and then returns `obj`.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  function tap(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  }
+
+  // Normalize a (deep) property `path` to array.
+  // Like `_.iteratee`, this function can be customized.
+  function toPath(path) {
+    return isArray(path) ? path : [path];
+  }
+  _.toPath = toPath;
+
+  // Internal wrapper for `_.toPath` to enable minification.
+  // Similar to `cb` for `_.iteratee`.
+  function toPath$1(path) {
+    return _.toPath(path);
+  }
+
+  // Internal function to obtain a nested property in `obj` along `path`.
+  function deepGet(obj, path) {
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      if (obj == null) return void 0;
+      obj = obj[path[i]];
+    }
+    return length ? obj : void 0;
+  }
+
+  // Get the value of the (deep) property on `path` from `object`.
+  // If any property in `path` does not exist or if the value is
+  // `undefined`, return `defaultValue` instead.
+  // The `path` is normalized through `_.toPath`.
+  function get(object, path, defaultValue) {
+    var value = deepGet(object, toPath$1(path));
+    return isUndefined(value) ? defaultValue : value;
+  }
+
+  // Shortcut function for checking if an object has a given property directly on
+  // itself (in other words, not on a prototype). Unlike the internal `has`
+  // function, this public version can also traverse nested properties.
+  function has$1(obj, path) {
+    path = toPath$1(path);
+    var length = path.length;
+    for (var i = 0; i < length; i++) {
+      var key = path[i];
+      if (!has(obj, key)) return false;
+      obj = obj[key];
+    }
+    return !!length;
+  }
+
+  // Keep the identity function around for default iteratees.
+  function identity(value) {
+    return value;
+  }
+
+  // Returns a predicate for checking whether an object has a given set of
+  // `key:value` pairs.
+  function matcher(attrs) {
+    attrs = extendOwn({}, attrs);
+    return function(obj) {
+      return isMatch(obj, attrs);
+    };
+  }
+
+  // Creates a function that, when passed an object, will traverse that object’s
+  // properties down the given `path`, specified as an array of keys or indices.
+  function property(path) {
+    path = toPath$1(path);
+    return function(obj) {
+      return deepGet(obj, path);
+    };
+  }
+
+  // Internal function that returns an efficient (for current engines) version
+  // of the passed-in callback, to be repeatedly applied in other Underscore
+  // functions.
+  function optimizeCb(func, context, argCount) {
+    if (context === void 0) return func;
+    switch (argCount == null ? 3 : argCount) {
+      case 1: return function(value) {
+        return func.call(context, value);
+      };
+      // The 2-argument case is omitted because we’re not using it.
+      case 3: return function(value, index, collection) {
+        return func.call(context, value, index, collection);
+      };
+      case 4: return function(accumulator, value, index, collection) {
+        return func.call(context, accumulator, value, index, collection);
+      };
+    }
+    return function() {
+      return func.apply(context, arguments);
+    };
+  }
+
+  // An internal function to generate callbacks that can be applied to each
+  // element in a collection, returning the desired result — either `_.identity`,
+  // an arbitrary callback, a property matcher, or a property accessor.
+  function baseIteratee(value, context, argCount) {
+    if (value == null) return identity;
+    if (isFunction$1(value)) return optimizeCb(value, context, argCount);
+    if (isObject(value) && !isArray(value)) return matcher(value);
+    return property(value);
+  }
+
+  // External wrapper for our callback generator. Users may customize
+  // `_.iteratee` if they want additional predicate/iteratee shorthand styles.
+  // This abstraction hides the internal-only `argCount` argument.
+  function iteratee(value, context) {
+    return baseIteratee(value, context, Infinity);
+  }
+  _.iteratee = iteratee;
+
+  // The function we call internally to generate a callback. It invokes
+  // `_.iteratee` if overridden, otherwise `baseIteratee`.
+  function cb(value, context, argCount) {
+    if (_.iteratee !== iteratee) return _.iteratee(value, context);
+    return baseIteratee(value, context, argCount);
+  }
+
+  // Returns the results of applying the `iteratee` to each element of `obj`.
+  // In contrast to `_.map` it returns an object.
+  function mapObject(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = keys(obj),
+        length = _keys.length,
+        results = {};
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys[index];
+      results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Predicate-generating function. Often useful outside of Underscore.
+  function noop(){}
+
+  // Generates a function for a given object that returns a given property.
+  function propertyOf(obj) {
+    if (obj == null) return noop;
+    return function(path) {
+      return get(obj, path);
+    };
+  }
+
+  // Run a function **n** times.
+  function times(n, iteratee, context) {
+    var accum = Array(Math.max(0, n));
+    iteratee = optimizeCb(iteratee, context, 1);
+    for (var i = 0; i < n; i++) accum[i] = iteratee(i);
+    return accum;
+  }
+
+  // Return a random integer between `min` and `max` (inclusive).
+  function random(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  }
+
+  // A (possibly faster) way to get the current timestamp as an integer.
+  var now = Date.now || function() {
+    return new Date().getTime();
+  };
+
+  // Internal helper to generate functions for escaping and unescaping strings
+  // to/from HTML interpolation.
+  function createEscaper(map) {
+    var escaper = function(match) {
+      return map[match];
+    };
+    // Regexes for identifying a key that needs to be escaped.
+    var source = '(?:' + keys(map).join('|') + ')';
+    var testRegexp = RegExp(source);
+    var replaceRegexp = RegExp(source, 'g');
+    return function(string) {
+      string = string == null ? '' : '' + string;
+      return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;
+    };
+  }
+
+  // Internal list of HTML entities for escaping.
+  var escapeMap = {
+    '&': '&amp;',
+    '<': '&lt;',
+    '>': '&gt;',
+    '"': '&quot;',
+    "'": '&#x27;',
+    '`': '&#x60;'
+  };
+
+  // Function for escaping strings to HTML interpolation.
+  var _escape = createEscaper(escapeMap);
+
+  // Internal list of HTML entities for unescaping.
+  var unescapeMap = invert(escapeMap);
+
+  // Function for unescaping strings from HTML interpolation.
+  var _unescape = createEscaper(unescapeMap);
+
+  // By default, Underscore uses ERB-style template delimiters. Change the
+  // following template settings to use alternative delimiters.
+  var templateSettings = _.templateSettings = {
+    evaluate: /<%([\s\S]+?)%>/g,
+    interpolate: /<%=([\s\S]+?)%>/g,
+    escape: /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `_.templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'": "'",
+    '\\': '\\',
+    '\r': 'r',
+    '\n': 'n',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g;
+
+  function escapeChar(match) {
+    return '\\' + escapes[match];
+  }
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  // NB: `oldSettings` only exists for backwards compatibility.
+  function template(text, settings, oldSettings) {
+    if (!settings && oldSettings) settings = oldSettings;
+    settings = defaults({}, settings, _.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset).replace(escapeRegExp, escapeChar);
+      index = offset + match.length;
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      } else if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      } else if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+
+      // Adobe VMs need the match returned to produce the correct offset.
+      return match;
+    });
+    source += "';\n";
+
+    // If a variable is not specified, place data values in local scope.
+    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + 'return __p;\n';
+
+    var render;
+    try {
+      render = new Function(settings.variable || 'obj', '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    var template = function(data) {
+      return render.call(this, data, _);
+    };
+
+    // Provide the compiled source as a convenience for precompilation.
+    var argument = settings.variable || 'obj';
+    template.source = 'function(' + argument + '){\n' + source + '}';
+
+    return template;
+  }
+
+  // Traverses the children of `obj` along `path`. If a child is a function, it
+  // is invoked with its parent as context. Returns the value of the final
+  // child, or `fallback` if any child is undefined.
+  function result(obj, path, fallback) {
+    path = toPath$1(path);
+    var length = path.length;
+    if (!length) {
+      return isFunction$1(fallback) ? fallback.call(obj) : fallback;
+    }
+    for (var i = 0; i < length; i++) {
+      var prop = obj == null ? void 0 : obj[path[i]];
+      if (prop === void 0) {
+        prop = fallback;
+        i = length; // Ensure we don't continue iterating.
+      }
+      obj = isFunction$1(prop) ? prop.call(obj) : prop;
+    }
+    return obj;
+  }
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  function uniqueId(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  }
+
+  // Start chaining a wrapped Underscore object.
+  function chain(obj) {
+    var instance = _(obj);
+    instance._chain = true;
+    return instance;
+  }
+
+  // Internal function to execute `sourceFunc` bound to `context` with optional
+  // `args`. Determines whether to execute a function as a constructor or as a
+  // normal function.
+  function executeBound(sourceFunc, boundFunc, context, callingContext, args) {
+    if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);
+    var self = baseCreate(sourceFunc.prototype);
+    var result = sourceFunc.apply(self, args);
+    if (isObject(result)) return result;
+    return self;
+  }
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context. `_` acts
+  // as a placeholder by default, allowing any combination of arguments to be
+  // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.
+  var partial = restArguments(function(func, boundArgs) {
+    var placeholder = partial.placeholder;
+    var bound = function() {
+      var position = 0, length = boundArgs.length;
+      var args = Array(length);
+      for (var i = 0; i < length; i++) {
+        args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];
+      }
+      while (position < arguments.length) args.push(arguments[position++]);
+      return executeBound(func, bound, this, this, args);
+    };
+    return bound;
+  });
+
+  partial.placeholder = _;
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally).
+  var bind = restArguments(function(func, context, args) {
+    if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');
+    var bound = restArguments(function(callArgs) {
+      return executeBound(func, bound, context, this, args.concat(callArgs));
+    });
+    return bound;
+  });
+
+  // Internal helper for collection methods to determine whether a collection
+  // should be iterated as an array or as an object.
+  // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength
+  // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094
+  var isArrayLike = createSizePropertyCheck(getLength);
+
+  // Internal implementation of a recursive `flatten` function.
+  function flatten(input, depth, strict, output) {
+    output = output || [];
+    if (!depth && depth !== 0) {
+      depth = Infinity;
+    } else if (depth <= 0) {
+      return output.concat(input);
+    }
+    var idx = output.length;
+    for (var i = 0, length = getLength(input); i < length; i++) {
+      var value = input[i];
+      if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {
+        // Flatten current level of array or arguments object.
+        if (depth > 1) {
+          flatten(value, depth - 1, strict, output);
+          idx = output.length;
+        } else {
+          var j = 0, len = value.length;
+          while (j < len) output[idx++] = value[j++];
+        }
+      } else if (!strict) {
+        output[idx++] = value;
+      }
+    }
+    return output;
+  }
+
+  // Bind a number of an object's methods to that object. Remaining arguments
+  // are the method names to be bound. Useful for ensuring that all callbacks
+  // defined on an object belong to it.
+  var bindAll = restArguments(function(obj, keys) {
+    keys = flatten(keys, false, false);
+    var index = keys.length;
+    if (index < 1) throw new Error('bindAll must be passed function names');
+    while (index--) {
+      var key = keys[index];
+      obj[key] = bind(obj[key], obj);
+    }
+    return obj;
+  });
+
+  // Memoize an expensive function by storing its results.
+  function memoize(func, hasher) {
+    var memoize = function(key) {
+      var cache = memoize.cache;
+      var address = '' + (hasher ? hasher.apply(this, arguments) : key);
+      if (!has(cache, address)) cache[address] = func.apply(this, arguments);
+      return cache[address];
+    };
+    memoize.cache = {};
+    return memoize;
+  }
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  var delay = restArguments(function(func, wait, args) {
+    return setTimeout(function() {
+      return func.apply(null, args);
+    }, wait);
+  });
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  var defer = partial(delay, _, 1);
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  function throttle(func, wait, options) {
+    var timeout, context, args, result;
+    var previous = 0;
+    if (!options) options = {};
+
+    var later = function() {
+      previous = options.leading === false ? 0 : now();
+      timeout = null;
+      result = func.apply(context, args);
+      if (!timeout) context = args = null;
+    };
+
+    var throttled = function() {
+      var _now = now();
+      if (!previous && options.leading === false) previous = _now;
+      var remaining = wait - (_now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0 || remaining > wait) {
+        if (timeout) {
+          clearTimeout(timeout);
+          timeout = null;
+        }
+        previous = _now;
+        result = func.apply(context, args);
+        if (!timeout) context = args = null;
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+
+    throttled.cancel = function() {
+      clearTimeout(timeout);
+      previous = 0;
+      timeout = context = args = null;
+    };
+
+    return throttled;
+  }
+
+  // When a sequence of calls of the returned function ends, the argument
+  // function is triggered. The end of a sequence is defined by the `wait`
+  // parameter. If `immediate` is passed, the argument function will be
+  // triggered at the beginning of the sequence instead of at the end.
+  function debounce(func, wait, immediate) {
+    var timeout, previous, args, result, context;
+
+    var later = function() {
+      var passed = now() - previous;
+      if (wait > passed) {
+        timeout = setTimeout(later, wait - passed);
+      } else {
+        timeout = null;
+        if (!immediate) result = func.apply(context, args);
+        // This check is needed because `func` can recursively invoke `debounced`.
+        if (!timeout) args = context = null;
+      }
+    };
+
+    var debounced = restArguments(function(_args) {
+      context = this;
+      args = _args;
+      previous = now();
+      if (!timeout) {
+        timeout = setTimeout(later, wait);
+        if (immediate) result = func.apply(context, args);
+      }
+      return result;
+    });
+
+    debounced.cancel = function() {
+      clearTimeout(timeout);
+      timeout = args = context = null;
+    };
+
+    return debounced;
+  }
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  function wrap(func, wrapper) {
+    return partial(wrapper, func);
+  }
+
+  // Returns a negated version of the passed-in predicate.
+  function negate(predicate) {
+    return function() {
+      return !predicate.apply(this, arguments);
+    };
+  }
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  function compose() {
+    var args = arguments;
+    var start = args.length - 1;
+    return function() {
+      var i = start;
+      var result = args[start].apply(this, arguments);
+      while (i--) result = args[i].call(this, result);
+      return result;
+    };
+  }
+
+  // Returns a function that will only be executed on and after the Nth call.
+  function after(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  }
+
+  // Returns a function that will only be executed up to (but not including) the
+  // Nth call.
+  function before(times, func) {
+    var memo;
+    return function() {
+      if (--times > 0) {
+        memo = func.apply(this, arguments);
+      }
+      if (times <= 1) func = null;
+      return memo;
+    };
+  }
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  var once = partial(before, 2);
+
+  // Returns the first key on an object that passes a truth test.
+  function findKey(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = keys(obj), key;
+    for (var i = 0, length = _keys.length; i < length; i++) {
+      key = _keys[i];
+      if (predicate(obj[key], key, obj)) return key;
+    }
+  }
+
+  // Internal function to generate `_.findIndex` and `_.findLastIndex`.
+  function createPredicateIndexFinder(dir) {
+    return function(array, predicate, context) {
+      predicate = cb(predicate, context);
+      var length = getLength(array);
+      var index = dir > 0 ? 0 : length - 1;
+      for (; index >= 0 && index < length; index += dir) {
+        if (predicate(array[index], index, array)) return index;
+      }
+      return -1;
+    };
+  }
+
+  // Returns the first index on an array-like that passes a truth test.
+  var findIndex = createPredicateIndexFinder(1);
+
+  // Returns the last index on an array-like that passes a truth test.
+  var findLastIndex = createPredicateIndexFinder(-1);
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  function sortedIndex(array, obj, iteratee, context) {
+    iteratee = cb(iteratee, context, 1);
+    var value = iteratee(obj);
+    var low = 0, high = getLength(array);
+    while (low < high) {
+      var mid = Math.floor((low + high) / 2);
+      if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;
+    }
+    return low;
+  }
+
+  // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.
+  function createIndexFinder(dir, predicateFind, sortedIndex) {
+    return function(array, item, idx) {
+      var i = 0, length = getLength(array);
+      if (typeof idx == 'number') {
+        if (dir > 0) {
+          i = idx >= 0 ? idx : Math.max(idx + length, i);
+        } else {
+          length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;
+        }
+      } else if (sortedIndex && idx && length) {
+        idx = sortedIndex(array, item);
+        return array[idx] === item ? idx : -1;
+      }
+      if (item !== item) {
+        idx = predicateFind(slice.call(array, i, length), isNaN$1);
+        return idx >= 0 ? idx + i : -1;
+      }
+      for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {
+        if (array[idx] === item) return idx;
+      }
+      return -1;
+    };
+  }
+
+  // Return the position of the first occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  var indexOf = createIndexFinder(1, findIndex, sortedIndex);
+
+  // Return the position of the last occurrence of an item in an array,
+  // or -1 if the item is not included in the array.
+  var lastIndexOf = createIndexFinder(-1, findLastIndex);
+
+  // Return the first value which passes a truth test.
+  function find(obj, predicate, context) {
+    var keyFinder = isArrayLike(obj) ? findIndex : findKey;
+    var key = keyFinder(obj, predicate, context);
+    if (key !== void 0 && key !== -1) return obj[key];
+  }
+
+  // Convenience version of a common use case of `_.find`: getting the first
+  // object containing specific `key:value` pairs.
+  function findWhere(obj, attrs) {
+    return find(obj, matcher(attrs));
+  }
+
+  // The cornerstone for collection functions, an `each`
+  // implementation, aka `forEach`.
+  // Handles raw objects in addition to array-likes. Treats all
+  // sparse array-likes as if they were dense.
+  function each(obj, iteratee, context) {
+    iteratee = optimizeCb(iteratee, context);
+    var i, length;
+    if (isArrayLike(obj)) {
+      for (i = 0, length = obj.length; i < length; i++) {
+        iteratee(obj[i], i, obj);
+      }
+    } else {
+      var _keys = keys(obj);
+      for (i = 0, length = _keys.length; i < length; i++) {
+        iteratee(obj[_keys[i]], _keys[i], obj);
+      }
+    }
+    return obj;
+  }
+
+  // Return the results of applying the iteratee to each element.
+  function map(obj, iteratee, context) {
+    iteratee = cb(iteratee, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length,
+        results = Array(length);
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      results[index] = iteratee(obj[currentKey], currentKey, obj);
+    }
+    return results;
+  }
+
+  // Internal helper to create a reducing function, iterating left or right.
+  function createReduce(dir) {
+    // Wrap code that reassigns argument variables in a separate function than
+    // the one that accesses `arguments.length` to avoid a perf hit. (#1991)
+    var reducer = function(obj, iteratee, memo, initial) {
+      var _keys = !isArrayLike(obj) && keys(obj),
+          length = (_keys || obj).length,
+          index = dir > 0 ? 0 : length - 1;
+      if (!initial) {
+        memo = obj[_keys ? _keys[index] : index];
+        index += dir;
+      }
+      for (; index >= 0 && index < length; index += dir) {
+        var currentKey = _keys ? _keys[index] : index;
+        memo = iteratee(memo, obj[currentKey], currentKey, obj);
+      }
+      return memo;
+    };
+
+    return function(obj, iteratee, memo, context) {
+      var initial = arguments.length >= 3;
+      return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);
+    };
+  }
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`.
+  var reduce = createReduce(1);
+
+  // The right-associative version of reduce, also known as `foldr`.
+  var reduceRight = createReduce(-1);
+
+  // Return all the elements that pass a truth test.
+  function filter(obj, predicate, context) {
+    var results = [];
+    predicate = cb(predicate, context);
+    each(obj, function(value, index, list) {
+      if (predicate(value, index, list)) results.push(value);
+    });
+    return results;
+  }
+
+  // Return all the elements for which a truth test fails.
+  function reject(obj, predicate, context) {
+    return filter(obj, negate(cb(predicate)), context);
+  }
+
+  // Determine whether all of the elements pass a truth test.
+  function every(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (!predicate(obj[currentKey], currentKey, obj)) return false;
+    }
+    return true;
+  }
+
+  // Determine if at least one element in the object passes a truth test.
+  function some(obj, predicate, context) {
+    predicate = cb(predicate, context);
+    var _keys = !isArrayLike(obj) && keys(obj),
+        length = (_keys || obj).length;
+    for (var index = 0; index < length; index++) {
+      var currentKey = _keys ? _keys[index] : index;
+      if (predicate(obj[currentKey], currentKey, obj)) return true;
+    }
+    return false;
+  }
+
+  // Determine if the array or object contains a given item (using `===`).
+  function contains(obj, item, fromIndex, guard) {
+    if (!isArrayLike(obj)) obj = values(obj);
+    if (typeof fromIndex != 'number' || guard) fromIndex = 0;
+    return indexOf(obj, item, fromIndex) >= 0;
+  }
+
+  // Invoke a method (with arguments) on every item in a collection.
+  var invoke = restArguments(function(obj, path, args) {
+    var contextPath, func;
+    if (isFunction$1(path)) {
+      func = path;
+    } else {
+      path = toPath$1(path);
+      contextPath = path.slice(0, -1);
+      path = path[path.length - 1];
+    }
+    return map(obj, function(context) {
+      var method = func;
+      if (!method) {
+        if (contextPath && contextPath.length) {
+          context = deepGet(context, contextPath);
+        }
+        if (context == null) return void 0;
+        method = context[path];
+      }
+      return method == null ? method : method.apply(context, args);
+    });
+  });
+
+  // Convenience version of a common use case of `_.map`: fetching a property.
+  function pluck(obj, key) {
+    return map(obj, property(key));
+  }
+
+  // Convenience version of a common use case of `_.filter`: selecting only
+  // objects containing specific `key:value` pairs.
+  function where(obj, attrs) {
+    return filter(obj, matcher(attrs));
+  }
+
+  // Return the maximum element (or element-based computation).
+  function max(obj, iteratee, context) {
+    var result = -Infinity, lastComputed = -Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value > result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed > lastComputed || computed === -Infinity && result === -Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Return the minimum element (or element-based computation).
+  function min(obj, iteratee, context) {
+    var result = Infinity, lastComputed = Infinity,
+        value, computed;
+    if (iteratee == null || typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null) {
+      obj = isArrayLike(obj) ? obj : values(obj);
+      for (var i = 0, length = obj.length; i < length; i++) {
+        value = obj[i];
+        if (value != null && value < result) {
+          result = value;
+        }
+      }
+    } else {
+      iteratee = cb(iteratee, context);
+      each(obj, function(v, index, list) {
+        computed = iteratee(v, index, list);
+        if (computed < lastComputed || computed === Infinity && result === Infinity) {
+          result = v;
+          lastComputed = computed;
+        }
+      });
+    }
+    return result;
+  }
+
+  // Sample **n** random values from a collection using the modern version of the
+  // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  // If **n** is not specified, returns a single random element.
+  // The internal `guard` argument allows it to work with `_.map`.
+  function sample(obj, n, guard) {
+    if (n == null || guard) {
+      if (!isArrayLike(obj)) obj = values(obj);
+      return obj[random(obj.length - 1)];
+    }
+    var sample = isArrayLike(obj) ? clone(obj) : values(obj);
+    var length = getLength(sample);
+    n = Math.max(Math.min(n, length), 0);
+    var last = length - 1;
+    for (var index = 0; index < n; index++) {
+      var rand = random(index, last);
+      var temp = sample[index];
+      sample[index] = sample[rand];
+      sample[rand] = temp;
+    }
+    return sample.slice(0, n);
+  }
+
+  // Shuffle a collection.
+  function shuffle(obj) {
+    return sample(obj, Infinity);
+  }
+
+  // Sort the object's values by a criterion produced by an iteratee.
+  function sortBy(obj, iteratee, context) {
+    var index = 0;
+    iteratee = cb(iteratee, context);
+    return pluck(map(obj, function(value, key, list) {
+      return {
+        value: value,
+        index: index++,
+        criteria: iteratee(value, key, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  }
+
+  // An internal function used for aggregate "group by" operations.
+  function group(behavior, partition) {
+    return function(obj, iteratee, context) {
+      var result = partition ? [[], []] : {};
+      iteratee = cb(iteratee, context);
+      each(obj, function(value, index) {
+        var key = iteratee(value, index, obj);
+        behavior(result, value, key);
+      });
+      return result;
+    };
+  }
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  var groupBy = group(function(result, value, key) {
+    if (has(result, key)) result[key].push(value); else result[key] = [value];
+  });
+
+  // Indexes the object's values by a criterion, similar to `_.groupBy`, but for
+  // when you know that your index values will be unique.
+  var indexBy = group(function(result, value, key) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  var countBy = group(function(result, value, key) {
+    if (has(result, key)) result[key]++; else result[key] = 1;
+  });
+
+  // Split a collection into two arrays: one whose elements all pass the given
+  // truth test, and one whose elements all do not pass the truth test.
+  var partition = group(function(result, value, pass) {
+    result[pass ? 0 : 1].push(value);
+  }, true);
+
+  // Safely create a real, live array from anything iterable.
+  var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;
+  function toArray(obj) {
+    if (!obj) return [];
+    if (isArray(obj)) return slice.call(obj);
+    if (isString(obj)) {
+      // Keep surrogate pair characters together.
+      return obj.match(reStrSymbol);
+    }
+    if (isArrayLike(obj)) return map(obj, identity);
+    return values(obj);
+  }
+
+  // Return the number of elements in a collection.
+  function size(obj) {
+    if (obj == null) return 0;
+    return isArrayLike(obj) ? obj.length : keys(obj).length;
+  }
+
+  // Internal `_.pick` helper function to determine whether `key` is an enumerable
+  // property name of `obj`.
+  function keyInObj(value, key, obj) {
+    return key in obj;
+  }
+
+  // Return a copy of the object only containing the allowed properties.
+  var pick = restArguments(function(obj, keys) {
+    var result = {}, iteratee = keys[0];
+    if (obj == null) return result;
+    if (isFunction$1(iteratee)) {
+      if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);
+      keys = allKeys(obj);
+    } else {
+      iteratee = keyInObj;
+      keys = flatten(keys, false, false);
+      obj = Object(obj);
+    }
+    for (var i = 0, length = keys.length; i < length; i++) {
+      var key = keys[i];
+      var value = obj[key];
+      if (iteratee(value, key, obj)) result[key] = value;
+    }
+    return result;
+  });
+
+  // Return a copy of the object without the disallowed properties.
+  var omit = restArguments(function(obj, keys) {
+    var iteratee = keys[0], context;
+    if (isFunction$1(iteratee)) {
+      iteratee = negate(iteratee);
+      if (keys.length > 1) context = keys[1];
+    } else {
+      keys = map(flatten(keys, false, false), String);
+      iteratee = function(value, key) {
+        return !contains(keys, key);
+      };
+    }
+    return pick(obj, iteratee, context);
+  });
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N.
+  function initial(array, n, guard) {
+    return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));
+  }
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  function first(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[0];
+    return initial(array, array.length - n);
+  }
+
+  // Returns everything but the first entry of the `array`. Especially useful on
+  // the `arguments` object. Passing an **n** will return the rest N values in the
+  // `array`.
+  function rest(array, n, guard) {
+    return slice.call(array, n == null || guard ? 1 : n);
+  }
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array.
+  function last(array, n, guard) {
+    if (array == null || array.length < 1) return n == null || guard ? void 0 : [];
+    if (n == null || guard) return array[array.length - 1];
+    return rest(array, Math.max(0, array.length - n));
+  }
+
+  // Trim out all falsy values from an array.
+  function compact(array) {
+    return filter(array, Boolean);
+  }
+
+  // Flatten out an array, either recursively (by default), or up to `depth`.
+  // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.
+  function flatten$1(array, depth) {
+    return flatten(array, depth, false);
+  }
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  var difference = restArguments(function(array, rest) {
+    rest = flatten(rest, true, true);
+    return filter(array, function(value){
+      return !contains(rest, value);
+    });
+  });
+
+  // Return a version of the array that does not contain the specified value(s).
+  var without = restArguments(function(array, otherArrays) {
+    return difference(array, otherArrays);
+  });
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // The faster algorithm will not work with an iteratee if the iteratee
+  // is not a one-to-one function, so providing an iteratee will disable
+  // the faster algorithm.
+  function uniq(array, isSorted, iteratee, context) {
+    if (!isBoolean(isSorted)) {
+      context = iteratee;
+      iteratee = isSorted;
+      isSorted = false;
+    }
+    if (iteratee != null) iteratee = cb(iteratee, context);
+    var result = [];
+    var seen = [];
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var value = array[i],
+          computed = iteratee ? iteratee(value, i, array) : value;
+      if (isSorted && !iteratee) {
+        if (!i || seen !== computed) result.push(value);
+        seen = computed;
+      } else if (iteratee) {
+        if (!contains(seen, computed)) {
+          seen.push(computed);
+          result.push(value);
+        }
+      } else if (!contains(result, value)) {
+        result.push(value);
+      }
+    }
+    return result;
+  }
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  var union = restArguments(function(arrays) {
+    return uniq(flatten(arrays, true, true));
+  });
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  function intersection(array) {
+    var result = [];
+    var argsLength = arguments.length;
+    for (var i = 0, length = getLength(array); i < length; i++) {
+      var item = array[i];
+      if (contains(result, item)) continue;
+      var j;
+      for (j = 1; j < argsLength; j++) {
+        if (!contains(arguments[j], item)) break;
+      }
+      if (j === argsLength) result.push(item);
+    }
+    return result;
+  }
+
+  // Complement of zip. Unzip accepts an array of arrays and groups
+  // each array's elements on shared indices.
+  function unzip(array) {
+    var length = array && max(array, getLength).length || 0;
+    var result = Array(length);
+
+    for (var index = 0; index < length; index++) {
+      result[index] = pluck(array, index);
+    }
+    return result;
+  }
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  var zip = restArguments(unzip);
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values. Passing by pairs is the reverse of `_.pairs`.
+  function object(list, values) {
+    var result = {};
+    for (var i = 0, length = getLength(list); i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  }
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](https://docs.python.org/library/functions.html#range).
+  function range(start, stop, step) {
+    if (stop == null) {
+      stop = start || 0;
+      start = 0;
+    }
+    if (!step) {
+      step = stop < start ? -1 : 1;
+    }
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var range = Array(length);
+
+    for (var idx = 0; idx < length; idx++, start += step) {
+      range[idx] = start;
+    }
+
+    return range;
+  }
+
+  // Chunk a single array into multiple arrays, each containing `count` or fewer
+  // items.
+  function chunk(array, count) {
+    if (count == null || count < 1) return [];
+    var result = [];
+    var i = 0, length = array.length;
+    while (i < length) {
+      result.push(slice.call(array, i, i += count));
+    }
+    return result;
+  }
+
+  // Helper function to continue chaining intermediate results.
+  function chainResult(instance, obj) {
+    return instance._chain ? _(obj).chain() : obj;
+  }
+
+  // Add your own custom functions to the Underscore object.
+  function mixin(obj) {
+    each(functions(obj), function(name) {
+      var func = _[name] = obj[name];
+      _.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return chainResult(this, func.apply(_, args));
+      };
+    });
+    return _;
+  }
+
+  // Add all mutator `Array` functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) {
+        method.apply(obj, arguments);
+        if ((name === 'shift' || name === 'splice') && obj.length === 0) {
+          delete obj[0];
+        }
+      }
+      return chainResult(this, obj);
+    };
+  });
+
+  // Add all accessor `Array` functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      var obj = this._wrapped;
+      if (obj != null) obj = method.apply(obj, arguments);
+      return chainResult(this, obj);
+    };
+  });
+
+  // Named Exports
+
+  var allExports = {
+    __proto__: null,
+    VERSION: VERSION,
+    restArguments: restArguments,
+    isObject: isObject,
+    isNull: isNull,
+    isUndefined: isUndefined,
+    isBoolean: isBoolean,
+    isElement: isElement,
+    isString: isString,
+    isNumber: isNumber,
+    isDate: isDate,
+    isRegExp: isRegExp,
+    isError: isError,
+    isSymbol: isSymbol,
+    isArrayBuffer: isArrayBuffer,
+    isDataView: isDataView$1,
+    isArray: isArray,
+    isFunction: isFunction$1,
+    isArguments: isArguments$1,
+    isFinite: isFinite$1,
+    isNaN: isNaN$1,
+    isTypedArray: isTypedArray$1,
+    isEmpty: isEmpty,
+    isMatch: isMatch,
+    isEqual: isEqual,
+    isMap: isMap,
+    isWeakMap: isWeakMap,
+    isSet: isSet,
+    isWeakSet: isWeakSet,
+    keys: keys,
+    allKeys: allKeys,
+    values: values,
+    pairs: pairs,
+    invert: invert,
+    functions: functions,
+    methods: functions,
+    extend: extend,
+    extendOwn: extendOwn,
+    assign: extendOwn,
+    defaults: defaults,
+    create: create,
+    clone: clone,
+    tap: tap,
+    get: get,
+    has: has$1,
+    mapObject: mapObject,
+    identity: identity,
+    constant: constant,
+    noop: noop,
+    toPath: toPath,
+    property: property,
+    propertyOf: propertyOf,
+    matcher: matcher,
+    matches: matcher,
+    times: times,
+    random: random,
+    now: now,
+    escape: _escape,
+    unescape: _unescape,
+    templateSettings: templateSettings,
+    template: template,
+    result: result,
+    uniqueId: uniqueId,
+    chain: chain,
+    iteratee: iteratee,
+    partial: partial,
+    bind: bind,
+    bindAll: bindAll,
+    memoize: memoize,
+    delay: delay,
+    defer: defer,
+    throttle: throttle,
+    debounce: debounce,
+    wrap: wrap,
+    negate: negate,
+    compose: compose,
+    after: after,
+    before: before,
+    once: once,
+    findKey: findKey,
+    findIndex: findIndex,
+    findLastIndex: findLastIndex,
+    sortedIndex: sortedIndex,
+    indexOf: indexOf,
+    lastIndexOf: lastIndexOf,
+    find: find,
+    detect: find,
+    findWhere: findWhere,
+    each: each,
+    forEach: each,
+    map: map,
+    collect: map,
+    reduce: reduce,
+    foldl: reduce,
+    inject: reduce,
+    reduceRight: reduceRight,
+    foldr: reduceRight,
+    filter: filter,
+    select: filter,
+    reject: reject,
+    every: every,
+    all: every,
+    some: some,
+    any: some,
+    contains: contains,
+    includes: contains,
+    include: contains,
+    invoke: invoke,
+    pluck: pluck,
+    where: where,
+    max: max,
+    min: min,
+    shuffle: shuffle,
+    sample: sample,
+    sortBy: sortBy,
+    groupBy: groupBy,
+    indexBy: indexBy,
+    countBy: countBy,
+    partition: partition,
+    toArray: toArray,
+    size: size,
+    pick: pick,
+    omit: omit,
+    first: first,
+    head: first,
+    take: first,
+    initial: initial,
+    last: last,
+    rest: rest,
+    tail: rest,
+    drop: rest,
+    compact: compact,
+    flatten: flatten$1,
+    without: without,
+    uniq: uniq,
+    unique: uniq,
+    union: union,
+    intersection: intersection,
+    difference: difference,
+    unzip: unzip,
+    transpose: unzip,
+    zip: zip,
+    object: object,
+    range: range,
+    chunk: chunk,
+    mixin: mixin,
+    'default': _
+  };
+
+  // Default Export
+
+  // Add all of the Underscore functions to the wrapper object.
+  var _$1 = mixin(allExports);
+  // Legacy Node.js API.
+  _$1._ = _$1;
+
+  return _$1;
+
+})));
+//# sourceMappingURL=underscore.js.map
diff --git a/docs/_static/underscore.js b/docs/_static/underscore.js
new file mode 100644
index 00000000..166240ef
--- /dev/null
+++ b/docs/_static/underscore.js
@@ -0,0 +1,6 @@
+!function(n,r){"object"==typeof exports&&"undefined"!=typeof module?module.exports=r():"function"==typeof define&&define.amd?define("underscore",r):(n=n||self,function(){var t=n._,e=n._=r();e.noConflict=function(){return n._=t,e}}())}(this,(function(){
+//     Underscore.js 1.12.0
+//     https://underscorejs.org
+//     (c) 2009-2020 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+var n="1.12.0",r="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||Function("return this")()||{},t=Array.prototype,e=Object.prototype,u="undefined"!=typeof Symbol?Symbol.prototype:null,o=t.push,i=t.slice,a=e.toString,f=e.hasOwnProperty,c="undefined"!=typeof ArrayBuffer,l="undefined"!=typeof DataView,s=Array.isArray,p=Object.keys,v=Object.create,h=c&&ArrayBuffer.isView,y=isNaN,g=isFinite,d=!{toString:null}.propertyIsEnumerable("toString"),b=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"],m=Math.pow(2,53)-1;function j(n,r){return r=null==r?n.length-1:+r,function(){for(var t=Math.max(arguments.length-r,0),e=Array(t),u=0;u<t;u++)e[u]=arguments[u+r];switch(r){case 0:return n.call(this,e);case 1:return n.call(this,arguments[0],e);case 2:return n.call(this,arguments[0],arguments[1],e)}var o=Array(r+1);for(u=0;u<r;u++)o[u]=arguments[u];return o[r]=e,n.apply(this,o)}}function _(n){var r=typeof n;return"function"===r||"object"===r&&!!n}function w(n){return void 0===n}function A(n){return!0===n||!1===n||"[object Boolean]"===a.call(n)}function x(n){var r="[object "+n+"]";return function(n){return a.call(n)===r}}var S=x("String"),O=x("Number"),M=x("Date"),E=x("RegExp"),B=x("Error"),N=x("Symbol"),I=x("ArrayBuffer"),k=x("Function"),T=r.document&&r.document.childNodes;"function"!=typeof/./&&"object"!=typeof Int8Array&&"function"!=typeof T&&(k=function(n){return"function"==typeof n||!1});var D=k,R=x("Object"),F=l&&R(new DataView(new ArrayBuffer(8))),V="undefined"!=typeof Map&&R(new Map),P=x("DataView");var q=F?function(n){return null!=n&&D(n.getInt8)&&I(n.buffer)}:P,U=s||x("Array");function W(n,r){return null!=n&&f.call(n,r)}var z=x("Arguments");!function(){z(arguments)||(z=function(n){return W(n,"callee")})}();var L=z;function C(n){return O(n)&&y(n)}function K(n){return function(){return n}}function J(n){return function(r){var t=n(r);return"number"==typeof t&&t>=0&&t<=m}}function $(n){return function(r){return null==r?void 0:r[n]}}var G=$("byteLength"),H=J(G),Q=/\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\]/;var X=c?function(n){return h?h(n)&&!q(n):H(n)&&Q.test(a.call(n))}:K(!1),Y=$("length");function Z(n,r){r=function(n){for(var r={},t=n.length,e=0;e<t;++e)r[n[e]]=!0;return{contains:function(n){return r[n]},push:function(t){return r[t]=!0,n.push(t)}}}(r);var t=b.length,u=n.constructor,o=D(u)&&u.prototype||e,i="constructor";for(W(n,i)&&!r.contains(i)&&r.push(i);t--;)(i=b[t])in n&&n[i]!==o[i]&&!r.contains(i)&&r.push(i)}function nn(n){if(!_(n))return[];if(p)return p(n);var r=[];for(var t in n)W(n,t)&&r.push(t);return d&&Z(n,r),r}function rn(n,r){var t=nn(r),e=t.length;if(null==n)return!e;for(var u=Object(n),o=0;o<e;o++){var i=t[o];if(r[i]!==u[i]||!(i in u))return!1}return!0}function tn(n){return n instanceof tn?n:this instanceof tn?void(this._wrapped=n):new tn(n)}function en(n){return new Uint8Array(n.buffer||n,n.byteOffset||0,G(n))}tn.VERSION=n,tn.prototype.value=function(){return this._wrapped},tn.prototype.valueOf=tn.prototype.toJSON=tn.prototype.value,tn.prototype.toString=function(){return String(this._wrapped)};var un="[object DataView]";function on(n,r,t,e){if(n===r)return 0!==n||1/n==1/r;if(null==n||null==r)return!1;if(n!=n)return r!=r;var o=typeof n;return("function"===o||"object"===o||"object"==typeof r)&&function n(r,t,e,o){r instanceof tn&&(r=r._wrapped);t instanceof tn&&(t=t._wrapped);var i=a.call(r);if(i!==a.call(t))return!1;if(F&&"[object Object]"==i&&q(r)){if(!q(t))return!1;i=un}switch(i){case"[object RegExp]":case"[object String]":return""+r==""+t;case"[object Number]":return+r!=+r?+t!=+t:0==+r?1/+r==1/t:+r==+t;case"[object Date]":case"[object Boolean]":return+r==+t;case"[object Symbol]":return u.valueOf.call(r)===u.valueOf.call(t);case"[object ArrayBuffer]":case un:return n(en(r),en(t),e,o)}var f="[object Array]"===i;if(!f&&X(r)){if(G(r)!==G(t))return!1;if(r.buffer===t.buffer&&r.byteOffset===t.byteOffset)return!0;f=!0}if(!f){if("object"!=typeof r||"object"!=typeof t)return!1;var c=r.constructor,l=t.constructor;if(c!==l&&!(D(c)&&c instanceof c&&D(l)&&l instanceof l)&&"constructor"in r&&"constructor"in t)return!1}o=o||[];var s=(e=e||[]).length;for(;s--;)if(e[s]===r)return o[s]===t;if(e.push(r),o.push(t),f){if((s=r.length)!==t.length)return!1;for(;s--;)if(!on(r[s],t[s],e,o))return!1}else{var p,v=nn(r);if(s=v.length,nn(t).length!==s)return!1;for(;s--;)if(p=v[s],!W(t,p)||!on(r[p],t[p],e,o))return!1}return e.pop(),o.pop(),!0}(n,r,t,e)}function an(n){if(!_(n))return[];var r=[];for(var t in n)r.push(t);return d&&Z(n,r),r}function fn(n){var r=Y(n);return function(t){if(null==t)return!1;var e=an(t);if(Y(e))return!1;for(var u=0;u<r;u++)if(!D(t[n[u]]))return!1;return n!==hn||!D(t[cn])}}var cn="forEach",ln="has",sn=["clear","delete"],pn=["get",ln,"set"],vn=sn.concat(cn,pn),hn=sn.concat(pn),yn=["add"].concat(sn,cn,ln),gn=V?fn(vn):x("Map"),dn=V?fn(hn):x("WeakMap"),bn=V?fn(yn):x("Set"),mn=x("WeakSet");function jn(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=n[r[u]];return e}function _n(n){for(var r={},t=nn(n),e=0,u=t.length;e<u;e++)r[n[t[e]]]=t[e];return r}function wn(n){var r=[];for(var t in n)D(n[t])&&r.push(t);return r.sort()}function An(n,r){return function(t){var e=arguments.length;if(r&&(t=Object(t)),e<2||null==t)return t;for(var u=1;u<e;u++)for(var o=arguments[u],i=n(o),a=i.length,f=0;f<a;f++){var c=i[f];r&&void 0!==t[c]||(t[c]=o[c])}return t}}var xn=An(an),Sn=An(nn),On=An(an,!0);function Mn(n){if(!_(n))return{};if(v)return v(n);var r=function(){};r.prototype=n;var t=new r;return r.prototype=null,t}function En(n){return _(n)?U(n)?n.slice():xn({},n):n}function Bn(n){return U(n)?n:[n]}function Nn(n){return tn.toPath(n)}function In(n,r){for(var t=r.length,e=0;e<t;e++){if(null==n)return;n=n[r[e]]}return t?n:void 0}function kn(n,r,t){var e=In(n,Nn(r));return w(e)?t:e}function Tn(n){return n}function Dn(n){return n=Sn({},n),function(r){return rn(r,n)}}function Rn(n){return n=Nn(n),function(r){return In(r,n)}}function Fn(n,r,t){if(void 0===r)return n;switch(null==t?3:t){case 1:return function(t){return n.call(r,t)};case 3:return function(t,e,u){return n.call(r,t,e,u)};case 4:return function(t,e,u,o){return n.call(r,t,e,u,o)}}return function(){return n.apply(r,arguments)}}function Vn(n,r,t){return null==n?Tn:D(n)?Fn(n,r,t):_(n)&&!U(n)?Dn(n):Rn(n)}function Pn(n,r){return Vn(n,r,1/0)}function qn(n,r,t){return tn.iteratee!==Pn?tn.iteratee(n,r):Vn(n,r,t)}function Un(){}function Wn(n,r){return null==r&&(r=n,n=0),n+Math.floor(Math.random()*(r-n+1))}tn.toPath=Bn,tn.iteratee=Pn;var zn=Date.now||function(){return(new Date).getTime()};function Ln(n){var r=function(r){return n[r]},t="(?:"+nn(n).join("|")+")",e=RegExp(t),u=RegExp(t,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,r):n}}var Cn={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;","`":"&#x60;"},Kn=Ln(Cn),Jn=Ln(_n(Cn)),$n=tn.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g},Gn=/(.)^/,Hn={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},Qn=/\\|'|\r|\n|\u2028|\u2029/g;function Xn(n){return"\\"+Hn[n]}var Yn=0;function Zn(n,r,t,e,u){if(!(e instanceof r))return n.apply(t,u);var o=Mn(n.prototype),i=n.apply(o,u);return _(i)?i:o}var nr=j((function(n,r){var t=nr.placeholder,e=function(){for(var u=0,o=r.length,i=Array(o),a=0;a<o;a++)i[a]=r[a]===t?arguments[u++]:r[a];for(;u<arguments.length;)i.push(arguments[u++]);return Zn(n,e,this,this,i)};return e}));nr.placeholder=tn;var rr=j((function(n,r,t){if(!D(n))throw new TypeError("Bind must be called on a function");var e=j((function(u){return Zn(n,e,r,this,t.concat(u))}));return e})),tr=J(Y);function er(n,r,t,e){if(e=e||[],r||0===r){if(r<=0)return e.concat(n)}else r=1/0;for(var u=e.length,o=0,i=Y(n);o<i;o++){var a=n[o];if(tr(a)&&(U(a)||L(a)))if(r>1)er(a,r-1,t,e),u=e.length;else for(var f=0,c=a.length;f<c;)e[u++]=a[f++];else t||(e[u++]=a)}return e}var ur=j((function(n,r){var t=(r=er(r,!1,!1)).length;if(t<1)throw new Error("bindAll must be passed function names");for(;t--;){var e=r[t];n[e]=rr(n[e],n)}return n}));var or=j((function(n,r,t){return setTimeout((function(){return n.apply(null,t)}),r)})),ir=nr(or,tn,1);function ar(n){return function(){return!n.apply(this,arguments)}}function fr(n,r){var t;return function(){return--n>0&&(t=r.apply(this,arguments)),n<=1&&(r=null),t}}var cr=nr(fr,2);function lr(n,r,t){r=qn(r,t);for(var e,u=nn(n),o=0,i=u.length;o<i;o++)if(r(n[e=u[o]],e,n))return e}function sr(n){return function(r,t,e){t=qn(t,e);for(var u=Y(r),o=n>0?0:u-1;o>=0&&o<u;o+=n)if(t(r[o],o,r))return o;return-1}}var pr=sr(1),vr=sr(-1);function hr(n,r,t,e){for(var u=(t=qn(t,e,1))(r),o=0,i=Y(n);o<i;){var a=Math.floor((o+i)/2);t(n[a])<u?o=a+1:i=a}return o}function yr(n,r,t){return function(e,u,o){var a=0,f=Y(e);if("number"==typeof o)n>0?a=o>=0?o:Math.max(o+f,a):f=o>=0?Math.min(o+1,f):o+f+1;else if(t&&o&&f)return e[o=t(e,u)]===u?o:-1;if(u!=u)return(o=r(i.call(e,a,f),C))>=0?o+a:-1;for(o=n>0?a:f-1;o>=0&&o<f;o+=n)if(e[o]===u)return o;return-1}}var gr=yr(1,pr,hr),dr=yr(-1,vr);function br(n,r,t){var e=(tr(n)?pr:lr)(n,r,t);if(void 0!==e&&-1!==e)return n[e]}function mr(n,r,t){var e,u;if(r=Fn(r,t),tr(n))for(e=0,u=n.length;e<u;e++)r(n[e],e,n);else{var o=nn(n);for(e=0,u=o.length;e<u;e++)r(n[o[e]],o[e],n)}return n}function jr(n,r,t){r=qn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=Array(u),i=0;i<u;i++){var a=e?e[i]:i;o[i]=r(n[a],a,n)}return o}function _r(n){var r=function(r,t,e,u){var o=!tr(r)&&nn(r),i=(o||r).length,a=n>0?0:i-1;for(u||(e=r[o?o[a]:a],a+=n);a>=0&&a<i;a+=n){var f=o?o[a]:a;e=t(e,r[f],f,r)}return e};return function(n,t,e,u){var o=arguments.length>=3;return r(n,Fn(t,u,4),e,o)}}var wr=_r(1),Ar=_r(-1);function xr(n,r,t){var e=[];return r=qn(r,t),mr(n,(function(n,t,u){r(n,t,u)&&e.push(n)})),e}function Sr(n,r,t){r=qn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(!r(n[i],i,n))return!1}return!0}function Or(n,r,t){r=qn(r,t);for(var e=!tr(n)&&nn(n),u=(e||n).length,o=0;o<u;o++){var i=e?e[o]:o;if(r(n[i],i,n))return!0}return!1}function Mr(n,r,t,e){return tr(n)||(n=jn(n)),("number"!=typeof t||e)&&(t=0),gr(n,r,t)>=0}var Er=j((function(n,r,t){var e,u;return D(r)?u=r:(r=Nn(r),e=r.slice(0,-1),r=r[r.length-1]),jr(n,(function(n){var o=u;if(!o){if(e&&e.length&&(n=In(n,e)),null==n)return;o=n[r]}return null==o?o:o.apply(n,t)}))}));function Br(n,r){return jr(n,Rn(r))}function Nr(n,r,t){var e,u,o=-1/0,i=-1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e>o&&(o=e);else r=qn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))>i||u===-1/0&&o===-1/0)&&(o=n,i=u)}));return o}function Ir(n,r,t){if(null==r||t)return tr(n)||(n=jn(n)),n[Wn(n.length-1)];var e=tr(n)?En(n):jn(n),u=Y(e);r=Math.max(Math.min(r,u),0);for(var o=u-1,i=0;i<r;i++){var a=Wn(i,o),f=e[i];e[i]=e[a],e[a]=f}return e.slice(0,r)}function kr(n,r){return function(t,e,u){var o=r?[[],[]]:{};return e=qn(e,u),mr(t,(function(r,u){var i=e(r,u,t);n(o,r,i)})),o}}var Tr=kr((function(n,r,t){W(n,t)?n[t].push(r):n[t]=[r]})),Dr=kr((function(n,r,t){n[t]=r})),Rr=kr((function(n,r,t){W(n,t)?n[t]++:n[t]=1})),Fr=kr((function(n,r,t){n[t?0:1].push(r)}),!0),Vr=/[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g;function Pr(n,r,t){return r in t}var qr=j((function(n,r){var t={},e=r[0];if(null==n)return t;D(e)?(r.length>1&&(e=Fn(e,r[1])),r=an(n)):(e=Pr,r=er(r,!1,!1),n=Object(n));for(var u=0,o=r.length;u<o;u++){var i=r[u],a=n[i];e(a,i,n)&&(t[i]=a)}return t})),Ur=j((function(n,r){var t,e=r[0];return D(e)?(e=ar(e),r.length>1&&(t=r[1])):(r=jr(er(r,!1,!1),String),e=function(n,t){return!Mr(r,t)}),qr(n,e,t)}));function Wr(n,r,t){return i.call(n,0,Math.max(0,n.length-(null==r||t?1:r)))}function zr(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[0]:Wr(n,n.length-r)}function Lr(n,r,t){return i.call(n,null==r||t?1:r)}var Cr=j((function(n,r){return r=er(r,!0,!0),xr(n,(function(n){return!Mr(r,n)}))})),Kr=j((function(n,r){return Cr(n,r)}));function Jr(n,r,t,e){A(r)||(e=t,t=r,r=!1),null!=t&&(t=qn(t,e));for(var u=[],o=[],i=0,a=Y(n);i<a;i++){var f=n[i],c=t?t(f,i,n):f;r&&!t?(i&&o===c||u.push(f),o=c):t?Mr(o,c)||(o.push(c),u.push(f)):Mr(u,f)||u.push(f)}return u}var $r=j((function(n){return Jr(er(n,!0,!0))}));function Gr(n){for(var r=n&&Nr(n,Y).length||0,t=Array(r),e=0;e<r;e++)t[e]=Br(n,e);return t}var Hr=j(Gr);function Qr(n,r){return n._chain?tn(r).chain():r}function Xr(n){return mr(wn(n),(function(r){var t=tn[r]=n[r];tn.prototype[r]=function(){var n=[this._wrapped];return o.apply(n,arguments),Qr(this,t.apply(tn,n))}})),tn}mr(["pop","push","reverse","shift","sort","splice","unshift"],(function(n){var r=t[n];tn.prototype[n]=function(){var t=this._wrapped;return null!=t&&(r.apply(t,arguments),"shift"!==n&&"splice"!==n||0!==t.length||delete t[0]),Qr(this,t)}})),mr(["concat","join","slice"],(function(n){var r=t[n];tn.prototype[n]=function(){var n=this._wrapped;return null!=n&&(n=r.apply(n,arguments)),Qr(this,n)}}));var Yr=Xr({__proto__:null,VERSION:n,restArguments:j,isObject:_,isNull:function(n){return null===n},isUndefined:w,isBoolean:A,isElement:function(n){return!(!n||1!==n.nodeType)},isString:S,isNumber:O,isDate:M,isRegExp:E,isError:B,isSymbol:N,isArrayBuffer:I,isDataView:q,isArray:U,isFunction:D,isArguments:L,isFinite:function(n){return!N(n)&&g(n)&&!isNaN(parseFloat(n))},isNaN:C,isTypedArray:X,isEmpty:function(n){if(null==n)return!0;var r=Y(n);return"number"==typeof r&&(U(n)||S(n)||L(n))?0===r:0===Y(nn(n))},isMatch:rn,isEqual:function(n,r){return on(n,r)},isMap:gn,isWeakMap:dn,isSet:bn,isWeakSet:mn,keys:nn,allKeys:an,values:jn,pairs:function(n){for(var r=nn(n),t=r.length,e=Array(t),u=0;u<t;u++)e[u]=[r[u],n[r[u]]];return e},invert:_n,functions:wn,methods:wn,extend:xn,extendOwn:Sn,assign:Sn,defaults:On,create:function(n,r){var t=Mn(n);return r&&Sn(t,r),t},clone:En,tap:function(n,r){return r(n),n},get:kn,has:function(n,r){for(var t=(r=Nn(r)).length,e=0;e<t;e++){var u=r[e];if(!W(n,u))return!1;n=n[u]}return!!t},mapObject:function(n,r,t){r=qn(r,t);for(var e=nn(n),u=e.length,o={},i=0;i<u;i++){var a=e[i];o[a]=r(n[a],a,n)}return o},identity:Tn,constant:K,noop:Un,toPath:Bn,property:Rn,propertyOf:function(n){return null==n?Un:function(r){return kn(n,r)}},matcher:Dn,matches:Dn,times:function(n,r,t){var e=Array(Math.max(0,n));r=Fn(r,t,1);for(var u=0;u<n;u++)e[u]=r(u);return e},random:Wn,now:zn,escape:Kn,unescape:Jn,templateSettings:$n,template:function(n,r,t){!r&&t&&(r=t),r=On({},r,tn.templateSettings);var e,u=RegExp([(r.escape||Gn).source,(r.interpolate||Gn).source,(r.evaluate||Gn).source].join("|")+"|$","g"),o=0,i="__p+='";n.replace(u,(function(r,t,e,u,a){return i+=n.slice(o,a).replace(Qn,Xn),o=a+r.length,t?i+="'+\n((__t=("+t+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":u&&(i+="';\n"+u+"\n__p+='"),r})),i+="';\n",r.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{e=new Function(r.variable||"obj","_",i)}catch(n){throw n.source=i,n}var a=function(n){return e.call(this,n,tn)},f=r.variable||"obj";return a.source="function("+f+"){\n"+i+"}",a},result:function(n,r,t){var e=(r=Nn(r)).length;if(!e)return D(t)?t.call(n):t;for(var u=0;u<e;u++){var o=null==n?void 0:n[r[u]];void 0===o&&(o=t,u=e),n=D(o)?o.call(n):o}return n},uniqueId:function(n){var r=++Yn+"";return n?n+r:r},chain:function(n){var r=tn(n);return r._chain=!0,r},iteratee:Pn,partial:nr,bind:rr,bindAll:ur,memoize:function(n,r){var t=function(e){var u=t.cache,o=""+(r?r.apply(this,arguments):e);return W(u,o)||(u[o]=n.apply(this,arguments)),u[o]};return t.cache={},t},delay:or,defer:ir,throttle:function(n,r,t){var e,u,o,i,a=0;t||(t={});var f=function(){a=!1===t.leading?0:zn(),e=null,i=n.apply(u,o),e||(u=o=null)},c=function(){var c=zn();a||!1!==t.leading||(a=c);var l=r-(c-a);return u=this,o=arguments,l<=0||l>r?(e&&(clearTimeout(e),e=null),a=c,i=n.apply(u,o),e||(u=o=null)):e||!1===t.trailing||(e=setTimeout(f,l)),i};return c.cancel=function(){clearTimeout(e),a=0,e=u=o=null},c},debounce:function(n,r,t){var e,u,o=function(r,t){e=null,t&&(u=n.apply(r,t))},i=j((function(i){if(e&&clearTimeout(e),t){var a=!e;e=setTimeout(o,r),a&&(u=n.apply(this,i))}else e=or(o,r,this,i);return u}));return i.cancel=function(){clearTimeout(e),e=null},i},wrap:function(n,r){return nr(r,n)},negate:ar,compose:function(){var n=arguments,r=n.length-1;return function(){for(var t=r,e=n[r].apply(this,arguments);t--;)e=n[t].call(this,e);return e}},after:function(n,r){return function(){if(--n<1)return r.apply(this,arguments)}},before:fr,once:cr,findKey:lr,findIndex:pr,findLastIndex:vr,sortedIndex:hr,indexOf:gr,lastIndexOf:dr,find:br,detect:br,findWhere:function(n,r){return br(n,Dn(r))},each:mr,forEach:mr,map:jr,collect:jr,reduce:wr,foldl:wr,inject:wr,reduceRight:Ar,foldr:Ar,filter:xr,select:xr,reject:function(n,r,t){return xr(n,ar(qn(r)),t)},every:Sr,all:Sr,some:Or,any:Or,contains:Mr,includes:Mr,include:Mr,invoke:Er,pluck:Br,where:function(n,r){return xr(n,Dn(r))},max:Nr,min:function(n,r,t){var e,u,o=1/0,i=1/0;if(null==r||"number"==typeof r&&"object"!=typeof n[0]&&null!=n)for(var a=0,f=(n=tr(n)?n:jn(n)).length;a<f;a++)null!=(e=n[a])&&e<o&&(o=e);else r=qn(r,t),mr(n,(function(n,t,e){((u=r(n,t,e))<i||u===1/0&&o===1/0)&&(o=n,i=u)}));return o},shuffle:function(n){return Ir(n,1/0)},sample:Ir,sortBy:function(n,r,t){var e=0;return r=qn(r,t),Br(jr(n,(function(n,t,u){return{value:n,index:e++,criteria:r(n,t,u)}})).sort((function(n,r){var t=n.criteria,e=r.criteria;if(t!==e){if(t>e||void 0===t)return 1;if(t<e||void 0===e)return-1}return n.index-r.index})),"value")},groupBy:Tr,indexBy:Dr,countBy:Rr,partition:Fr,toArray:function(n){return n?U(n)?i.call(n):S(n)?n.match(Vr):tr(n)?jr(n,Tn):jn(n):[]},size:function(n){return null==n?0:tr(n)?n.length:nn(n).length},pick:qr,omit:Ur,first:zr,head:zr,take:zr,initial:Wr,last:function(n,r,t){return null==n||n.length<1?null==r||t?void 0:[]:null==r||t?n[n.length-1]:Lr(n,Math.max(0,n.length-r))},rest:Lr,tail:Lr,drop:Lr,compact:function(n){return xr(n,Boolean)},flatten:function(n,r){return er(n,r,!1)},without:Kr,uniq:Jr,unique:Jr,union:$r,intersection:function(n){for(var r=[],t=arguments.length,e=0,u=Y(n);e<u;e++){var o=n[e];if(!Mr(r,o)){var i;for(i=1;i<t&&Mr(arguments[i],o);i++);i===t&&r.push(o)}}return r},difference:Cr,unzip:Gr,transpose:Gr,zip:Hr,object:function(n,r){for(var t={},e=0,u=Y(n);e<u;e++)r?t[n[e]]=r[e]:t[n[e][0]]=n[e][1];return t},range:function(n,r,t){null==r&&(r=n||0,n=0),t||(t=r<n?-1:1);for(var e=Math.max(Math.ceil((r-n)/t),0),u=Array(e),o=0;o<e;o++,n+=t)u[o]=n;return u},chunk:function(n,r){if(null==r||r<1)return[];for(var t=[],e=0,u=n.length;e<u;)t.push(i.call(n,e,e+=r));return t},mixin:Xr,default:tn});return Yr._=Yr,Yr}));
\ No newline at end of file
diff --git a/docs/account.html b/docs/account.html
index ddb11150..b5341ac6 100644
--- a/docs/account.html
+++ b/docs/account.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Account &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Account &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/account.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -162,11 +165,13 @@
   <div class="section" id="account">
 <h1>Account<a class="headerlink" href="#account" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
-<dt id="ally.Ally">
-<em class="property">class </em><code class="sig-prename descclassname">ally.</code><code class="sig-name descname">Ally</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">params</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="p">:</span> <span class="n">float</span> <span class="o">=</span> <span class="default_value">1.0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="py method">
-<dt id="ally.Ally.accounts">
-<code class="sig-name descname">accounts</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">dataframe</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.accounts" title="Permalink to this definition">¶</a></dt>
+<dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.</span></code><code class="sig-name descname"><span class="pre">Ally</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span></dt>
+<dd><p>The ally.Ally.Ally class.</p>
+<p>This is the main class for this library.</p>
+<dl class="py method">
+<dt>
+<code class="sig-name descname"><span class="pre">accounts</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets list of available accounts, and some basic metrics for each one.</p>
 <p>Calls the ‘accounts.json’ endpoint to get the current list of accounts.
 This includes account number, cash account balances, and P/L.</p>
@@ -191,8 +196,8 @@ <h1>Account<a class="headerlink" href="#account" title="Permalink to this headli
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.balances">
-<code class="sig-name descname">balances</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">dataframe</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.balances" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">balances</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets current cash and various account metrics.</p>
 <p>Calls the ‘accounts/./balances.json’ endpoint to get the current list of balances.
 This includes margin amounts, cash, etc.</p>
@@ -217,8 +222,8 @@ <h1>Account<a class="headerlink" href="#account" title="Permalink to this headli
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.history">
-<code class="sig-name descname">history</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">dataframe</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.history" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">history</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets the transaction history for the account.</p>
 <p>Calls the ‘accounts/./history.json’ endpoint to get list of all trade
 and cash  movement history for an account. This includes dividends, cash
@@ -245,8 +250,8 @@ <h1>Account<a class="headerlink" href="#account" title="Permalink to this headli
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.holdings">
-<code class="sig-name descname">holdings</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">dataframe</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.holdings" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">holdings</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets all current account holdings.</p>
 <p>Calls the ‘accounts/./history.json’ endpoint to get list of all current account
 holdings, including stocks and options. This also includes current market value,
@@ -277,37 +282,29 @@ <h1>Account<a class="headerlink" href="#account" title="Permalink to this headli
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="trading.html" class="btn btn-neutral float-right" title="Trading" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="ally.html" class="btn btn-neutral float-left" title="Ally Object" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="trading.html" class="btn btn-neutral float-right" title="Trading" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="ally.html" class="btn btn-neutral float-left" title="Ally Object" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/ally.html b/docs/ally.html
index 1f832796..83bab4a5 100644
--- a/docs/ally.html
+++ b/docs/ally.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Ally Object &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Ally Object &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/ally.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -163,13 +166,14 @@
 <h1>Ally Object<a class="headerlink" href="#ally-object" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
 <dt id="ally.Ally">
-<em class="property">class </em><code class="sig-prename descclassname">ally.</code><code class="sig-name descname">Ally</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">params</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="p">:</span> <span class="n">float</span> <span class="o">=</span> <span class="default_value">1.0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="py method">
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.</span></code><code class="sig-name descname"><span class="pre">Ally</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally" title="Permalink to this definition">¶</a></dt>
+<dd><p>The ally.Ally.Ally class.</p>
+<p>This is the main class for this library.</p>
+<dl class="py method">
 <dt id="ally.Ally.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">params</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="p">:</span> <span class="n">float</span> <span class="o">=</span> <span class="default_value">1.0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.__init__" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.__init__" title="Permalink to this definition">¶</a></dt>
 <dd><p>Manages all facets of your Ally Invest account.</p>
-<blockquote>
-<div><dl>
+<dl class="simple">
 <dt>Manage your account</dt><dd><p>Track the current and past state of your account. Visit the <a class="reference external" href="account.html">Account</a> page for full details.</p>
 <ul class="simple">
 <li><p>Balances (gets all current cash and margin balances)</p></li>
@@ -184,32 +188,34 @@ <h1>Ally Object<a class="headerlink" href="#ally-object" title="Permalink to thi
 <li><p>Quote Streaming (get quotes for up to 256 symbols in real-time, as prices update)</p></li>
 </ul>
 </dd>
-<dt>Place trades</dt><dd><p>Trades can be placed, modified (after being created locally, and even after submitting), or cancelled.
-Order objects described in <a class="reference external" href="trading.html">Trading</a> in detail.</p>
+<dt>Place trades</dt><dd><p>Trades can be placed, modified (after being created locally, and even after submitting), or cancelled. Order objects described in <a class="reference external" href="trading.html">Trading</a> in detail.</p>
 </dd>
-<dt>Arguments:</dt><dd><p><code class="docutils literal notranslate"><span class="pre">timeout</span></code>: float, number of seconds to wait before failing unresponsive api call</p>
-<p><code class="docutils literal notranslate"><span class="pre">params</span></code>: provide keys in the form of:</p>
-<blockquote>
-<div><ol class="arabic simple">
+</dl>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>timeout</strong> (<em>float</em>) – number of seconds to wait before failing unresponsive api call</p></li>
+<li><p><strong>params</strong> – <p>provide keys in the form of:</p>
+<ol class="arabic simple">
 <li><p>A dictionary: { ALLY_OAUTH_SECRET: …}</p></li>
 <li><p>A string: (filename to json file containing api keys)</p></li>
 <li><p>None (default): Grab the api keys from environment variables</p></li>
 </ol>
 <p>For any of the mediums above, be sure to provide all of the keys:</p>
-</div></blockquote>
-</dd>
-</dl>
-</div></blockquote>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
-        <span class="s1">&#39;ALLY_OAUTH_SECRET&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
-        <span class="s1">&#39;ALLY_OAUTH_TOKEN&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
-        <span class="s1">&#39;ALLY_CONSUMER_SECRET&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
-        <span class="s1">&#39;ALLY_CONSUMER_KEY&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
-        <span class="s1">&#39;ALLY_ACCOUNT_NBR&#39;</span><span class="p">:</span> <span class="o">...</span>
+    <span class="s1">&#39;ALLY_OAUTH_SECRET&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
+    <span class="s1">&#39;ALLY_OAUTH_TOKEN&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
+    <span class="s1">&#39;ALLY_CONSUMER_SECRET&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
+    <span class="s1">&#39;ALLY_CONSUMER_KEY&#39;</span><span class="p">:</span> <span class="o">...</span><span class="p">,</span>
+    <span class="s1">&#39;ALLY_ACCOUNT_NBR&#39;</span><span class="p">:</span> <span class="o">...</span>
 <span class="p">}</span>
 </pre></div>
 </div>
-<span class="target" id="module-ally.Ally"></span></dd></dl>
+</p></li>
+</ul>
+</dd>
+</dl>
+</dd></dl>
 
 </dd></dl>
 
@@ -220,37 +226,29 @@ <h1>Ally Object<a class="headerlink" href="#ally-object" title="Permalink to thi
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="account.html" class="btn btn-neutral float-right" title="Account" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="installing.html" class="btn btn-neutral float-left" title="Installing" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="account.html" class="btn btn-neutral float-right" title="Account" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="installing.html" class="btn btn-neutral float-left" title="Installing" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/forking.html b/docs/forking.html
deleted file mode 100644
index 09b957fe..00000000
--- a/docs/forking.html
+++ /dev/null
@@ -1,247 +0,0 @@
-
-
-<!DOCTYPE html>
-<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
-<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
-<head>
-  <meta charset="utf-8">
-  
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  
-  <title>Maintaining &mdash; PyAlly 1.0.5 documentation</title>
-  
-
-  
-  
-  
-  
-
-  
-  <script type="text/javascript" src="static/js/modernizr.min.js"></script>
-  
-    
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
-        <script src="static/language_data.js"></script>
-    
-    <script type="text/javascript" src="static/js/theme.js"></script>
-
-    
-
-  
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="prev" title="Support" href="support.html" /> 
-</head>
-
-<body class="wy-body-for-nav">
-
-   
-  <div class="wy-grid-for-nav">
-    
-    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
-      <div class="wy-side-scroll">
-        <div class="wy-side-nav-search" >
-          
-
-          
-            <a href="index.html" class="icon icon-home"> PyAlly
-          
-
-          
-          </a>
-
-          
-            
-            
-          
-
-          
-<div role="search">
-  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
-    <input type="text" name="q" placeholder="Search docs" />
-    <input type="hidden" name="check_keywords" value="yes" />
-    <input type="hidden" name="area" value="default" />
-  </form>
-</div>
-
-          
-        </div>
-
-        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
-          
-            
-            
-              
-            
-            
-              <ul class="current">
-<li class="toctree-l1"><a class="reference internal" href="installing.html">Installing</a></li>
-<li class="toctree-l1"><a class="reference internal" href="ally.html">Ally Object</a></li>
-<li class="toctree-l1"><a class="reference internal" href="account.html">Account</a></li>
-<li class="toctree-l1"><a class="reference internal" href="trading.html">Trading</a></li>
-<li class="toctree-l1"><a class="reference internal" href="quote.html">Quotes</a></li>
-<li class="toctree-l1"><a class="reference internal" href="ratelimit.html">Rate Limiting</a></li>
-<li class="toctree-l1"><a class="reference internal" href="watchlist.html">Watchlists</a></li>
-<li class="toctree-l1"><a class="reference internal" href="info.html">Info</a></li>
-<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li>
-<li class="toctree-l1 current"><a class="current reference internal" href="#">Maintaining</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="#updating-and-deploying-documentation">Updating and Deploying Documentation</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#creating-a-release">Creating a Release</a></li>
-</ul>
-</li>
-</ul>
-
-            
-          
-        </div>
-      </div>
-    </nav>
-
-    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
-
-      
-      <nav class="wy-nav-top" aria-label="top navigation">
-        
-          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
-          <a href="index.html">PyAlly</a>
-        
-      </nav>
-
-
-      <div class="wy-nav-content">
-        
-        <div class="rst-content">
-        
-          
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div role="navigation" aria-label="breadcrumbs navigation">
-
-  <ul class="wy-breadcrumbs">
-    
-      <li><a href="index.html">Docs</a> &raquo;</li>
-        
-      <li>Maintaining</li>
-    
-    
-      <li class="wy-breadcrumbs-aside">
-        
-            
-            <a href="_sources/forking.rst.txt" rel="nofollow"> View page source</a>
-          
-        
-      </li>
-    
-  </ul>
-
-  
-  <hr/>
-</div>
-          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
-           <div itemprop="articleBody">
-            
-  <div class="section" id="maintaining">
-<h1>Maintaining<a class="headerlink" href="#maintaining" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="updating-and-deploying-documentation">
-<h2>Updating and Deploying Documentation<a class="headerlink" href="#updating-and-deploying-documentation" title="Permalink to this headline">¶</a></h2>
-<p>To create a fully-functional fork of the repository in your Github,
-<a class="reference external" href="https://docs.github.com/en/github/working-with-github-pages/creating-a-github-pages-site">set up a Github Pages project</a> for the new repository. When setting it up, associate the page
-with the <cite>master</cite> branch. The documentation will now be available publicly.</p>
-<p>Edit the files in the <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> directory how you see fit. Documentation for individual classes and files
-might be found in the source, since documentation is partially autogenerated from comments in the actual code.</p>
-<p>The documentation must then be generated. Change directories to the <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> folder, then run <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">github</span></code>.
-This will build the html web files for the online documentation and place them in the <code class="docutils literal notranslate"><span class="pre">docs/</span></code> folder. Add the
-files in the <code class="docutils literal notranslate"><span class="pre">docs/</span></code> and <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> in a new commit and push to master. The changes will be reflected on
-your project Github page.</p>
-</div>
-<div class="section" id="creating-a-release">
-<h2>Creating a Release<a class="headerlink" href="#creating-a-release" title="Permalink to this headline">¶</a></h2>
-<p>It’s important to run the unit tests for the package before pushing a full release:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>python3 ally/tests.py
-</pre></div>
-</div>
-<p>To create a release, make sure to change the version number in 3 different files:</p>
-<ul class="simple">
-<li><p><code class="docutils literal notranslate"><span class="pre">README.md</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">sphinx/index.rst</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">sphinx/conf.py</span></code></p></li>
-<li><p><code class="docutils literal notranslate"><span class="pre">setup.py</span></code></p></li>
-</ul>
-<p>Once this is done, all the documentation pages will reflect the new version, and the package release
-will respect this as well.</p>
-<p>Make sure to add new contributers to the <code class="docutils literal notranslate"><span class="pre">sphinx/index.rst</span></code> and <code class="docutils literal notranslate"><span class="pre">README.md</span></code> pages, if applicable.</p>
-<p>To build the package and upload to Pypi, run the commands from the root directory:</p>
-<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>python3 setup.py sdist bdist_wheel
-twine upload dist/*
-</pre></div>
-</div>
-<p>The code will now be reflected in Pypi, available for public use.</p>
-</div>
-</div>
-
-
-           </div>
-           
-          </div>
-          <footer>
-  
-    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-      
-        <a href="support.html" class="btn btn-neutral float-left" title="Support" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
-    </div>
-  
-
-  <hr/>
-
-  <div role="contentinfo">
-    <p>
-        &copy; Copyright 2020, Brett Graves
-
-    </p>
-  </div>
-  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 
-
-</footer>
-
-        </div>
-      </div>
-
-    </section>
-
-  </div>
-  
-
-
-  <script type="text/javascript">
-      jQuery(function () {
-          SphinxRtdTheme.Navigation.enable(true);
-      });
-  </script>
-
-  
-  
-    
-   
-
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/genindex.html b/docs/genindex.html
index c2ac8ce7..d34bfd34 100644
--- a/docs/genindex.html
+++ b/docs/genindex.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Index &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Index &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="#" />
@@ -48,7 +51,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -132,6 +135,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -143,7 +148,7 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
+          
         
       </li>
     
@@ -161,15 +166,11 @@ <h1 id="index">Index</h1>
 <div class="genindex-jumpbox">
  <a href="#_"><strong>_</strong></a>
  | <a href="#A"><strong>A</strong></a>
- | <a href="#B"><strong>B</strong></a>
  | <a href="#C"><strong>C</strong></a>
- | <a href="#E"><strong>E</strong></a>
  | <a href="#F"><strong>F</strong></a>
- | <a href="#H"><strong>H</strong></a>
  | <a href="#L"><strong>L</strong></a>
  | <a href="#M"><strong>M</strong></a>
  | <a href="#O"><strong>O</strong></a>
- | <a href="#Q"><strong>Q</strong></a>
  | <a href="#S"><strong>S</strong></a>
  | <a href="#T"><strong>T</strong></a>
  | <a href="#W"><strong>W</strong></a>
@@ -184,8 +185,6 @@ <h2 id="_">_</h2>
         <li><a href="trading.html#ally.Order.Limit.__init__">(ally.Order.Limit method)</a>
 </li>
         <li><a href="trading.html#ally.Order.Market.__init__">(ally.Order.Market method)</a>
-</li>
-        <li><a href="trading.html#ally.Order.Order.__init__">(ally.Order.Order method)</a>
 </li>
         <li><a href="trading.html#ally.Order.Stop.__init__">(ally.Order.Stop method)</a>
 </li>
@@ -200,17 +199,8 @@ <h2 id="_">_</h2>
 <h2 id="A">A</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="account.html#ally.Ally.accounts">accounts() (ally.Ally method)</a>
+      <li><a href="ally.html#ally.Ally">Ally (class in ally)</a>
 </li>
-      <li><a href="account.html#ally.Ally">Ally (class in ally)</a>, <a href="ally.html#ally.Ally">[1]</a>, <a href="news.html#ally.Ally">[2]</a>, <a href="option.html#ally.Ally">[3]</a>, <a href="quote.html#ally.Ally">[4]</a>
-</li>
-      <li>
-    ally.Ally
-
-      <ul>
-        <li><a href="ally.html#module-ally.Ally">module</a>
-</li>
-      </ul></li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
       <li>
@@ -220,21 +210,6 @@ <h2 id="A">A</h2>
         <li><a href="info.html#module-ally.Info">module</a>
 </li>
       </ul></li>
-      <li>
-    ally.RateLimit
-
-      <ul>
-        <li><a href="ratelimit.html#module-ally.RateLimit">module</a>
-</li>
-      </ul></li>
-  </ul></td>
-</tr></table>
-
-<h2 id="B">B</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="account.html#ally.Ally.balances">balances() (ally.Ally method)</a>
-</li>
   </ul></td>
 </tr></table>
 
@@ -252,14 +227,6 @@ <h2 id="C">C</h2>
   </ul></td>
 </tr></table>
 
-<h2 id="E">E</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="option.html#ally.Ally.expirations">expirations() (ally.Ally method)</a>
-</li>
-  </ul></td>
-</tr></table>
-
 <h2 id="F">F</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
@@ -268,26 +235,10 @@ <h2 id="F">F</h2>
   </ul></td>
 </tr></table>
 
-<h2 id="H">H</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="account.html#ally.Ally.history">history() (ally.Ally method)</a>
-</li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="account.html#ally.Ally.holdings">holdings() (ally.Ally method)</a>
-</li>
-  </ul></td>
-</tr></table>
-
 <h2 id="L">L</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="trading.html#ally.Order.Limit">Limit (class in ally.Order)</a>
-</li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="news.html#ally.Ally.lookupNews">lookupNews() (ally.Ally method)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -297,15 +248,13 @@ <h2 id="M">M</h2>
   <td style="width: 33%; vertical-align: top;"><ul>
       <li><a href="trading.html#ally.Order.Market">Market (class in ally.Order)</a>
 </li>
+  </ul></td>
+  <td style="width: 33%; vertical-align: top;"><ul>
       <li>
     module
 
       <ul>
-        <li><a href="ally.html#module-ally.Ally">ally.Ally</a>
-</li>
         <li><a href="info.html#module-ally.Info">ally.Info</a>
-</li>
-        <li><a href="ratelimit.html#module-ally.RateLimit">ally.RateLimit</a>
 </li>
       </ul></li>
   </ul></td>
@@ -318,15 +267,7 @@ <h2 id="O">O</h2>
 </li>
   </ul></td>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="trading.html#ally.Order.Order">Order (class in ally.Order)</a>, <a href="trading.html#id0">[1]</a>
-</li>
-  </ul></td>
-</tr></table>
-
-<h2 id="Q">Q</h2>
-<table style="width: 100%" class="indextable genindextable"><tr>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="quote.html#ally.Ally.quote">quote() (ally.Ally method)</a>
+      <li><a href="trading.html#ally.Order.Order">Order (class in ally.Order)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -334,10 +275,6 @@ <h2 id="Q">Q</h2>
 <h2 id="S">S</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="option.html#ally.Ally.search">search() (ally.Ally method)</a>
-</li>
-      <li><a href="news.html#ally.Ally.searchNews">searchNews() (ally.Ally method)</a>
-</li>
       <li><a href="trading.html#ally.Order.Order.set_account">set_account() (ally.Order.Order method)</a>
 </li>
       <li><a href="trading.html#ally.Order.Order.set_buysell">set_buysell() (ally.Order.Order method)</a>
@@ -367,10 +304,6 @@ <h2 id="S">S</h2>
       <li><a href="trading.html#ally.Order.Stop">Stop (class in ally.Order)</a>
 </li>
       <li><a href="trading.html#ally.Order.StopLimit">StopLimit (class in ally.Order)</a>
-</li>
-      <li><a href="quote.html#ally.Ally.stream">stream() (ally.Ally method)</a>
-</li>
-      <li><a href="option.html#ally.Ally.strikes">strikes() (ally.Ally method)</a>
 </li>
   </ul></td>
 </tr></table>
@@ -378,12 +311,6 @@ <h2 id="S">S</h2>
 <h2 id="T">T</h2>
 <table style="width: 100%" class="indextable genindextable"><tr>
   <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="quote.html#ally.Ally.timesales">timesales() (ally.Ally method)</a>
-</li>
-  </ul></td>
-  <td style="width: 33%; vertical-align: top;"><ul>
-      <li><a href="quote.html#ally.Ally.toplists">toplists() (ally.Ally method)</a>
-</li>
       <li><a href="trading.html#ally.Order.TrailingStop">TrailingStop (class in ally.Order)</a>
 </li>
   </ul></td>
@@ -403,28 +330,25 @@ <h2 id="W">W</h2>
            
           </div>
           <footer>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/getting.started.html b/docs/getting.started.html
deleted file mode 100644
index d8800099..00000000
--- a/docs/getting.started.html
+++ /dev/null
@@ -1,295 +0,0 @@
-
-
-<!DOCTYPE html>
-<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
-<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
-<head>
-  <meta charset="utf-8">
-  
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
-  
-  <title>Getting Started &mdash; PyAlly 1.0.0 documentation</title>
-  
-
-  
-  
-  
-  
-
-  
-  <script type="text/javascript" src="static/js/modernizr.min.js"></script>
-  
-    
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
-        <script src="static/language_data.js"></script>
-    
-    <script type="text/javascript" src="static/js/theme.js"></script>
-
-    
-
-  
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
-    <link rel="index" title="Index" href="genindex.html" />
-    <link rel="search" title="Search" href="search.html" />
-    <link rel="next" title="Ally Object" href="ally.html" />
-    <link rel="prev" title="PyAlly Trading Library" href="index.html" /> 
-</head>
-
-<body class="wy-body-for-nav">
-
-   
-  <div class="wy-grid-for-nav">
-    
-    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
-      <div class="wy-side-scroll">
-        <div class="wy-side-nav-search" >
-          
-
-          
-            <a href="index.html" class="icon icon-home"> PyAlly
-          
-
-          
-          </a>
-
-          
-            
-            
-          
-
-          
-<div role="search">
-  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
-    <input type="text" name="q" placeholder="Search docs" />
-    <input type="hidden" name="check_keywords" value="yes" />
-    <input type="hidden" name="area" value="default" />
-  </form>
-</div>
-
-          
-        </div>
-
-        <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
-          
-            
-            
-              
-            
-            
-              <ul class="current">
-<li class="toctree-l1 current"><a class="current reference internal" href="#">Getting Started</a><ul>
-<li class="toctree-l2"><a class="reference internal" href="#overview">Overview</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#installing">Installing</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#first-steps">First Steps</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#keys-environment-variables">Keys: Environment Variables</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#keys-json-file">Keys: JSON file</a></li>
-<li class="toctree-l2"><a class="reference internal" href="#keys-passing-directly">Keys: Passing Directly</a></li>
-</ul>
-</li>
-<li class="toctree-l1"><a class="reference internal" href="ally.html">Ally Object</a></li>
-<li class="toctree-l1"><a class="reference internal" href="account.html">Account</a></li>
-<li class="toctree-l1"><a class="reference internal" href="trading.html">Trading</a></li>
-<li class="toctree-l1"><a class="reference internal" href="support.html">Support</a></li>
-</ul>
-
-            
-          
-        </div>
-      </div>
-    </nav>
-
-    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
-
-      
-      <nav class="wy-nav-top" aria-label="top navigation">
-        
-          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
-          <a href="index.html">PyAlly</a>
-        
-      </nav>
-
-
-      <div class="wy-nav-content">
-        
-        <div class="rst-content">
-        
-          
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-<div role="navigation" aria-label="breadcrumbs navigation">
-
-  <ul class="wy-breadcrumbs">
-    
-      <li><a href="index.html">Docs</a> &raquo;</li>
-        
-      <li>Getting Started</li>
-    
-    
-      <li class="wy-breadcrumbs-aside">
-        
-            
-            <a href="_sources/getting.started.rst.txt" rel="nofollow"> View page source</a>
-          
-        
-      </li>
-    
-  </ul>
-
-  
-  <hr/>
-</div>
-          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
-           <div itemprop="articleBody">
-            
-  <div class="section" id="getting-started">
-<h1>Getting Started<a class="headerlink" href="#getting-started" title="Permalink to this headline">¶</a></h1>
-<div class="section" id="overview">
-<h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
-<p>A new API project needs to be created through the account page on Ally’s website,
-and the project keys imported so that they can be used with the module.</p>
-</div>
-<div class="section" id="installing">
-<h2>Installing<a class="headerlink" href="#installing" title="Permalink to this headline">¶</a></h2>
-<p>To install the library, just use pip</p>
-<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$</span> pip install pyally
-</pre></div>
-</div>
-<p>Log into <a class="reference external" href="https://secure.ally.com">Ally Invest</a>, go to the specific account page, click Tools-&gt;API</p>
-<img alt="https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true" src="https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true" />
-<p>Fill out the API token application as a Personal Application</p>
-<img alt="https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true" src="https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true" />
-<p>It’s <strong>strongly recommended</strong> to store the keys in environment variables.</p>
-<img alt="https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true" src="https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true" />
-<p>To do this, insert the following into <code class="docutils literal notranslate"><span class="pre">~/.bashrc</span></code>:</p>
-<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">export ALLY_CONSUMER_KEY=XXXXXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_OAUTH_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_OAUTH_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_ACCOUNT_NBR=12345678</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="first-steps">
-<h2>First Steps<a class="headerlink" href="#first-steps" title="Permalink to this headline">¶</a></h2>
-<p>To import the library, just run</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">ally</span>
-</pre></div>
-</div>
-<p>We need to pass the API keys to the pyally object on instantiation. This can be done in a few ways:</p>
-</div>
-<div class="section" id="keys-environment-variables">
-<h2>Keys: Environment Variables<a class="headerlink" href="#keys-environment-variables" title="Permalink to this headline">¶</a></h2>
-<p>It’s <strong>strongly recommended</strong> that the API keys be stored as environment variables.
-This is more secure than other methods, as it conceals the credentials of ally account if
-the code is leaked or distributed. If the account variables are specified as recommended this way,
-instantiation is easy:</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">ally</span><span class="o">.</span><span class="n">Ally</span><span class="p">()</span>
-</pre></div>
-</div>
-<p><strong>And you’re done!</strong></p>
-</div>
-<div class="section" id="keys-json-file">
-<h2>Keys: JSON file<a class="headerlink" href="#keys-json-file" title="Permalink to this headline">¶</a></h2>
-<p>The object creator also accepts a json file holding the dict keys, and
-this is about as secure as the environment variable method.
-Place the API keys into a JSON file (this looks very similar to a python dict):</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
-    <span class="s1">&#39;ALLY_RESOURCE_OWNER_SECRET&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_RESOURCE_OWNER_KEY&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_CLIENT_SECRET&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_CLIENT_KEY&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_ACCOUNT_NBR&#39;</span><span class="p">:</span><span class="n">XXXX</span>
-<span class="p">}</span>
-</pre></div>
-</div>
-<p>Then the object can be instantiated like:</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">ally</span><span class="o">.</span><span class="n">Ally</span><span class="p">(</span><span class="s1">&#39;/path/to/params.json&#39;</span><span class="p">)</span>
-</pre></div>
-</div>
-</div>
-<div class="section" id="keys-passing-directly">
-<h2>Keys: Passing Directly<a class="headerlink" href="#keys-passing-directly" title="Permalink to this headline">¶</a></h2>
-<p>Variables can be passed in on instantiation. This way, no account variables need to be set.
-Keep in mind that this is much less secure for distributable applications, since anyone with these keys
-will have access to the account with which they’re associated.</p>
-<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
-    <span class="s1">&#39;ALLY_RESOURCE_OWNER_SECRET&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_RESOURCE_OWNER_KEY&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_CLIENT_SECRET&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_CLIENT_KEY&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
-    <span class="s1">&#39;ALLY_ACCOUNT_NBR&#39;</span><span class="p">:</span><span class="n">XXXX</span>
-<span class="p">}</span>
-<span class="n">a</span> <span class="o">=</span> <span class="n">ally</span><span class="o">.</span><span class="n">Ally</span><span class="p">(</span><span class="n">params</span><span class="p">)</span>
-</pre></div>
-</div>
-<p>Now you’re ready to make API calls with your new object and start trading.</p>
-</div>
-</div>
-
-
-           </div>
-           
-          </div>
-          <footer>
-  
-    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="ally.html" class="btn btn-neutral float-right" title="Ally Object" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="index.html" class="btn btn-neutral float-left" title="PyAlly Trading Library" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
-    </div>
-  
-
-  <hr/>
-
-  <div role="contentinfo">
-    <p>
-        &copy; Copyright 2020, Brett Graves
-
-    </p>
-  </div>
-  Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>. 
-
-</footer>
-
-        </div>
-      </div>
-
-    </section>
-
-  </div>
-  
-
-
-  <script type="text/javascript">
-      jQuery(function () {
-          SphinxRtdTheme.Navigation.enable(true);
-      });
-  </script>
-
-  
-  
-    
-   
-
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
index 0dc72f2c..3e4012e7 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>PyAlly Trading Library &mdash; PyAlly 1.1.1 documentation</title>
+  <title>PyAlly Trading Library &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -49,7 +52,7 @@
           
 
           
-            <a href="#" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="#" class="icon icon-home"> PyAlly
           
 
           
@@ -133,6 +136,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -144,8 +149,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/index.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -160,8 +163,7 @@
             
   <div class="section" id="pyally-trading-library">
 <h1>PyAlly Trading Library<a class="headerlink" href="#pyally-trading-library" title="Permalink to this headline">¶</a></h1>
-<p>Take control of your <a class="reference external" href="https://www.ally.com/api/invest/documentation/getting-started/">Ally bank</a> finances through Python.
-Buy stocks and options in an instant, and stay up-to-date with your investments.</p>
+<p>Take control of your <a class="reference external" href="https://www.ally.com/api/invest/documentation/getting-started/">Ally bank</a> finances through Python. Buy stocks and options in an instant, and stay up-to-date with your investments.</p>
 <p>Ally Bank’s investment platform is perfect for smaller investors who value a mature web/mobile interface, and low brokerage fees. I made this wrapper so that I could more easily integrate the platform with Python, and reduce the need for human oversight on my account.</p>
 <p>After setting up API keys, PyAlly can provide the basic/essential Ally brokerage transaction functions from a simple python request.</p>
 <p>The project can be cloned from <a class="reference external" href="https://github.com/alienbrett/PyAlly">github</a> or installed through pip on <a class="reference external" href="https://pypi.org/project/pyally/">pypi</a>.</p>
@@ -207,9 +209,7 @@ <h2>Contents<a class="headerlink" href="#contents" title="Permalink to this head
 </div>
 <div class="section" id="version-1-1-2">
 <h2>Version 1.1.2<a class="headerlink" href="#version-1-1-2" title="Permalink to this headline">¶</a></h2>
-<p>The lastest redesign preserves many features of the old interface, and incorporates a few new ones.
-Version 1.0 has been designed around a simple interface which should make modifying orders easier, and many operations more pythonic.
-Please note that this version breaks compatibility with all V0.X.X.</p>
+<p>The lastest redesign preserves many features of the old interface, and incorporates a few new ones. Version 1.0 has been designed around a simple interface which should make modifying orders easier, and many operations more pythonic. Please note that this version breaks compatibility with all V0.X.X.</p>
 <ul class="simple">
 <li><p>Added pythonic methods for manipulating account watchlists</p></li>
 <li><p>Added quote streaming support</p></li>
@@ -221,8 +221,7 @@ <h2>Version 1.1.2<a class="headerlink" href="#version-1-1-2" title="Permalink to
 <li><p>Toplists</p></li>
 <li><p>News</p></li>
 </ul>
-<p>Note that parts of the news searching is broken. Ally’s contractor who supplies information for news
-articles has had trouble suppling some information.</p>
+<p>Note that parts of the news searching is broken. Ally’s contractor who supplies information for news articles has had trouble suppling some information.</p>
 </div>
 <div class="section" id="planned-features">
 <h2>Planned Features<a class="headerlink" href="#planned-features" title="Permalink to this headline">¶</a></h2>
@@ -240,12 +239,19 @@ <h2>Contributors<a class="headerlink" href="#contributors" title="Permalink to t
 <li><p><a class="reference external" href="https://github.com/Tianyu00">Tianyu</a></p></li>
 <li><p><a class="reference external" href="https://github.com/Salient">Salient</a></p></li>
 <li><p><a class="reference external" href="https://github.com/mm0">Matt Margolin</a></p></li>
+<li><p><a class="reference external" href="https://github.com/LaikaN57">Alex Kennedy</a></p></li>
 </ul>
-<p>Message me on Github or <a class="reference external" href="mailto:alienbrett648&#37;&#52;&#48;gmail&#46;com">send me an email</a> if you enjoyed the project or thought it could be improved.
-I do my best to code with quality but sometimes it is easier said than done.
-Anyone with an interest with an eye for detail is welcome to contribute.</p>
+<p>Message me on Github or <a class="reference external" href="mailto:alienbrett648&#37;&#52;&#48;gmail&#46;com">send me an email</a> if you enjoyed the project or thought it could be improved. I do my best to code with quality but sometimes it is easier said than done. Anyone with an interest with an eye for detail is welcome to contribute.</p>
 <p>If you’re dying to buy me a beer, I accept venmo at &#64;alienbrett. That said, feel no obligation; this is free software and it’s here for you to use.</p>
 </div>
+</div>
+<div class="section" id="indices-and-tables">
+<h1>Indices and tables<a class="headerlink" href="#indices-and-tables" title="Permalink to this headline">¶</a></h1>
+<ul class="simple">
+<li><p><a class="reference internal" href="genindex.html"><span class="std std-ref">Index</span></a></p></li>
+<li><p><a class="reference internal" href="py-modindex.html"><span class="std std-ref">Module Index</span></a></p></li>
+<li><p><a class="reference internal" href="search.html"><span class="std std-ref">Search Page</span></a></p></li>
+</ul>
 </div>
 
 
@@ -253,35 +259,28 @@ <h2>Contributors<a class="headerlink" href="#contributors" title="Permalink to t
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="installing.html" class="btn btn-neutral float-right" title="Installing" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
+        <a href="installing.html" class="btn btn-neutral float-right" title="Installing" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/info.html b/docs/info.html
index 2db7902f..1bd726ea 100644
--- a/docs/info.html
+++ b/docs/info.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Info &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Info &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/info.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -162,49 +165,48 @@
   <div class="section" id="module-ally.Info">
 <span id="info"></span><h1>Info<a class="headerlink" href="#module-ally.Info" title="Permalink to this headline">¶</a></h1>
 <p>Gets information from the API service not directly tied to a particular account.</p>
+<p>Gets information about the clock and status.</p>
 <dl class="py class">
 <dt id="ally.Info.Clock">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Info.</code><code class="sig-name descname">Clock</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">auth</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.Clock" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Info.</span></code><code class="sig-name descname"><span class="pre">Clock</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">auth</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.Clock" title="Permalink to this definition">¶</a></dt>
 <dd></dd></dl>
 
 <dl class="py class">
 <dt id="ally.Info.Status">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Info.</code><code class="sig-name descname">Status</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">auth</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="o">**</span><span class="n">kwargs</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.Status" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Info.</span></code><code class="sig-name descname"><span class="pre">Status</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">auth</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">kwargs</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.Status" title="Permalink to this definition">¶</a></dt>
 <dd></dd></dl>
 
 <dl class="py function">
 <dt id="ally.Info.clock">
-<code class="sig-prename descclassname">ally.Info.</code><code class="sig-name descname">clock</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.clock" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname"><span class="pre">ally.Info.</span></code><code class="sig-name descname"><span class="pre">clock</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.clock" title="Permalink to this definition">¶</a></dt>
 <dd><p>Return the current market clock.</p>
-<blockquote>
-<div><p>Gets a simple dict with timestamp and the status of the market (pre-market, post-market, etc.),
+<p>Gets a simple dict with timestamp and the status of the market (pre-market, post-market, etc.),
 including the next time that the market clock changes status.</p>
-<dl class="simple">
-<dt>Args:</dt><dd><dl class="simple">
-<dt>block:</dt><dd><p>Specify whether to block thread if request exceeds rate limit</p>
-</dd>
-</dl>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><p><strong>block</strong> – Specify whether to block thread if request exceeds rate limit</p>
 </dd>
-<dt>Returns:</dt><dd><p>A dictionary with timestamp, current market status, and any error information.</p>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p>A dictionary with timestamp, current market status, and any error information.</p>
 </dd>
-<dt>Raises:</dt><dd><p>RateLimitException: If block=False, rate limit problems will be raised</p>
+<dt class="field-odd">Raises</dt>
+<dd class="field-odd"><p><strong>RateLimitException</strong> – If block=False, rate limit problems will be raised</p>
 </dd>
 </dl>
 <p>Example:</p>
-</div></blockquote>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># Equivalent to the static function</span>
 <span class="c1">#   ally.Info.clock()</span>
 <span class="n">a</span><span class="o">.</span><span class="n">clock</span><span class="p">()</span>
 
 <span class="c1"># =&gt; {</span>
-        <span class="s1">&#39;date&#39;</span><span class="p">:</span> <span class="s1">&#39;2020-06-14 18:03:58.0-04:00&#39;</span><span class="p">,</span>
-        <span class="s1">&#39;unixtime&#39;</span><span class="p">:</span> <span class="s1">&#39;1592172240.069&#39;</span><span class="p">,</span>
-        <span class="s1">&#39;status&#39;</span><span class="p">:</span> <span class="p">{</span>
-                <span class="s1">&#39;current&#39;</span><span class="p">:</span> <span class="s1">&#39;close&#39;</span><span class="p">,</span>
-                <span class="s1">&#39;next&#39;</span><span class="p">:</span> <span class="s1">&#39;pre&#39;</span><span class="p">,</span>
-                <span class="s1">&#39;change_at&#39;</span><span class="p">:</span> <span class="s1">&#39;08:00:00&#39;</span>
-        <span class="p">},</span>
-        <span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="s1">&#39;Success&#39;</span><span class="p">,</span>
+    <span class="s1">&#39;date&#39;</span><span class="p">:</span> <span class="s1">&#39;2020-06-14 18:03:58.0-04:00&#39;</span><span class="p">,</span>
+    <span class="s1">&#39;unixtime&#39;</span><span class="p">:</span> <span class="s1">&#39;1592172240.069&#39;</span><span class="p">,</span>
+    <span class="s1">&#39;status&#39;</span><span class="p">:</span> <span class="p">{</span>
+        <span class="s1">&#39;current&#39;</span><span class="p">:</span> <span class="s1">&#39;close&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;next&#39;</span><span class="p">:</span> <span class="s1">&#39;pre&#39;</span><span class="p">,</span>
+        <span class="s1">&#39;change_at&#39;</span><span class="p">:</span> <span class="s1">&#39;08:00:00&#39;</span>
+    <span class="p">},</span>
+    <span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="s1">&#39;Success&#39;</span><span class="p">,</span>
 <span class="p">}</span>
 </pre></div>
 </div>
@@ -212,30 +214,28 @@
 
 <dl class="py function">
 <dt id="ally.Info.status">
-<code class="sig-prename descclassname">ally.Info.</code><code class="sig-name descname">status</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.status" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname"><span class="pre">ally.Info.</span></code><code class="sig-name descname"><span class="pre">status</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Info.status" title="Permalink to this definition">¶</a></dt>
 <dd><p>Return the status of the API service.</p>
-<blockquote>
-<div><p>Gets a simple dict with timestamp and the current status (up, down, etc.) of the service.</p>
-<dl class="simple">
-<dt>Args:</dt><dd><dl class="simple">
-<dt>block:</dt><dd><p>Specify whether to block thread if request exceeds rate limit</p>
-</dd>
-</dl>
+<p>Gets a simple dict with timestamp and the current status (up, down, etc.) of the service.</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><p><strong>block</strong> – Specify whether to block thread if request exceeds rate limit</p>
 </dd>
-<dt>Returns:</dt><dd><p>A dictionary with current time, and the status of the API service.</p>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p>A dictionary with current time, and the status of the API service.</p>
 </dd>
-<dt>Raises:</dt><dd><p>RateLimitException: If block=False, rate limit problems will be raised</p>
+<dt class="field-odd">Raises</dt>
+<dd class="field-odd"><p><strong>RateLimitException</strong> – If block=False, rate limit problems will be raised</p>
 </dd>
 </dl>
 <p>Example:</p>
-</div></blockquote>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="c1"># Equivalent to the static function</span>
 <span class="c1">#   ally.Info.status()</span>
 <span class="n">a</span><span class="o">.</span><span class="n">status</span><span class="p">()</span>
 
 <span class="c1"># =&gt; {</span>
-        <span class="s1">&#39;time&#39;</span><span class="p">:</span> <span class="s1">&#39;Sun, 14, Jun 2020 18:17:06 GMT&#39;</span><span class="p">,</span>
-        <span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="s1">&#39;Success&#39;</span>
+    <span class="s1">&#39;time&#39;</span><span class="p">:</span> <span class="s1">&#39;Sun, 14, Jun 2020 18:17:06 GMT&#39;</span><span class="p">,</span>
+    <span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="s1">&#39;Success&#39;</span>
 <span class="p">}</span>
 </pre></div>
 </div>
@@ -248,37 +248,29 @@
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="support.html" class="btn btn-neutral float-right" title="Support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="watchlist.html" class="btn btn-neutral float-left" title="Watchlists" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="support.html" class="btn btn-neutral float-right" title="Support" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="watchlist.html" class="btn btn-neutral float-left" title="Watchlists" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/installing.html b/docs/installing.html
index 6c114345..c0bb1fb9 100644
--- a/docs/installing.html
+++ b/docs/installing.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Installing &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Installing &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -142,6 +145,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -153,8 +158,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/installing.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -171,27 +174,26 @@
 <h1>Installing<a class="headerlink" href="#installing" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="overview">
 <h2>Overview<a class="headerlink" href="#overview" title="Permalink to this headline">¶</a></h2>
-<p>A new API project needs to be created through the account page on Ally’s website,
-and the project keys imported so that they can be used with the module.</p>
+<p>A new API project needs to be created through the account page on Ally’s website, and the project keys imported so that they can be used with the module.</p>
 </div>
 <div class="section" id="get-the-library">
 <h2>Get the Library<a class="headerlink" href="#get-the-library" title="Permalink to this headline">¶</a></h2>
 <p>To install the library, just use pip</p>
-<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$</span> pip install pyally
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>pip install pyally
 </pre></div>
 </div>
 <p>Log into <a class="reference external" href="https://secure.ally.com">Ally Invest</a>, go to the specific account page, click Tools-&gt;API</p>
-<img alt="https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true" src="https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true" />
+<img alt="https://github.com/mm0/PyAlly/blob/master/docs/_static/images/tools.png?raw=true" src="https://github.com/mm0/PyAlly/blob/master/docs/_static/images/tools.png?raw=true" />
 <p>Fill out the API token application as a Personal Application</p>
-<img alt="https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true" src="https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true" />
+<img alt="https://github.com/mm0/PyAlly/blob/master/docs/_static/images/new_application.png?raw=true" src="https://github.com/mm0/PyAlly/blob/master/docs/_static/images/new_application.png?raw=true" />
 <p>It’s <strong>strongly recommended</strong> to store the keys in environment variables.</p>
-<img alt="https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true" src="https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true" />
+<img alt="https://github.com/mm0/PyAlly/blob/master/docs/_static/images/details.png?raw=true" src="https://github.com/mm0/PyAlly/blob/master/docs/_static/images/details.png?raw=true" />
 <p>To do this, insert the following into <code class="docutils literal notranslate"><span class="pre">~/.bashrc</span></code>:</p>
-<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">export ALLY_CONSUMER_KEY=XXXXXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_OAUTH_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_OAUTH_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX</span>
-<span class="go">export ALLY_ACCOUNT_NBR=12345678</span>
+<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span><span class="nb">export</span> <span class="nv">ALLY_CONSUMER_KEY</span><span class="o">=</span>XXXXXXXXXXXXXXXXXXXXXXXX
+<span class="nb">export</span> <span class="nv">ALLY_CONSUMER_SECRET</span><span class="o">=</span>XXXXXXXXXXXXXXXXXXXXX
+<span class="nb">export</span> <span class="nv">ALLY_OAUTH_TOKEN</span><span class="o">=</span>XXXXXXXXXXXXXXXXXXXXXXXXX
+<span class="nb">export</span> <span class="nv">ALLY_OAUTH_SECRET</span><span class="o">=</span>XXXXXXXXXXXXXXXXXXXXXXXX
+<span class="nb">export</span> <span class="nv">ALLY_ACCOUNT_NBR</span><span class="o">=</span><span class="m">12345678</span>
 </pre></div>
 </div>
 </div>
@@ -205,10 +207,7 @@ <h2>First Steps<a class="headerlink" href="#first-steps" title="Permalink to thi
 </div>
 <div class="section" id="keys-environment-variables">
 <h2>Keys: Environment Variables<a class="headerlink" href="#keys-environment-variables" title="Permalink to this headline">¶</a></h2>
-<p>It’s <strong>strongly recommended</strong> that the API keys be stored as environment variables.
-This is more secure than other methods, as it conceals the credentials of ally account if
-the code is leaked or distributed. If the account variables are specified as recommended this way,
-instantiation is easy:</p>
+<p>It’s <strong>strongly recommended</strong> that the API keys be stored as environment variables. This is more secure than other methods, as it conceals the credentials of ally account if the code is leaked or distributed. If the account variables are specified as recommended this way, instantiation is easy:</p>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span> <span class="o">=</span> <span class="n">ally</span><span class="o">.</span><span class="n">Ally</span><span class="p">()</span>
 </pre></div>
 </div>
@@ -216,9 +215,7 @@ <h2>Keys: Environment Variables<a class="headerlink" href="#keys-environment-var
 </div>
 <div class="section" id="keys-json-file">
 <h2>Keys: JSON file<a class="headerlink" href="#keys-json-file" title="Permalink to this headline">¶</a></h2>
-<p>The object creator also accepts a json file holding the dict keys, and
-this is about as secure as the environment variable method.
-Place the API keys into a JSON file (this looks very similar to a python dict):</p>
+<p>The object creator also accepts a json file holding the dict keys, and this is about as secure as the environment variable method. Place the API keys into a JSON file (this looks very similar to a python dict):</p>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="p">{</span>
     <span class="s1">&#39;ALLY_CONSUMER_SECRET&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
     <span class="s1">&#39;ALLY_CONSUMER_KEY&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
@@ -235,9 +232,7 @@ <h2>Keys: JSON file<a class="headerlink" href="#keys-json-file" title="Permalink
 </div>
 <div class="section" id="keys-passing-directly">
 <h2>Keys: Passing Directly<a class="headerlink" href="#keys-passing-directly" title="Permalink to this headline">¶</a></h2>
-<p>Variables can be passed in on instantiation. This way, no account variables need to be set.
-Keep in mind that this is much less secure for distributable applications, since anyone with these keys
-will have access to the account with which they’re associated.</p>
+<p>Variables can be passed in on instantiation. This way, no account variables need to be set. Keep in mind that this is much less secure for distributable applications, since anyone with these keys will have access to the account with which they’re associated.</p>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">params</span> <span class="o">=</span> <span class="p">{</span>
     <span class="s1">&#39;ALLY_CONSUMER_SECRET&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
     <span class="s1">&#39;ALLY_CONSUMER_KEY&#39;</span><span class="p">:</span><span class="n">XXXX</span><span class="p">,</span>
@@ -257,37 +252,29 @@ <h2>Keys: Passing Directly<a class="headerlink" href="#keys-passing-directly" ti
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="ally.html" class="btn btn-neutral float-right" title="Ally Object" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="index.html" class="btn btn-neutral float-left" title="PyAlly Trading Library" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="ally.html" class="btn btn-neutral float-right" title="Ally Object" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="index.html" class="btn btn-neutral float-left" title="PyAlly Trading Library" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/maintaining.html b/docs/maintaining.html
index 5c633737..bd37422f 100644
--- a/docs/maintaining.html
+++ b/docs/maintaining.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Maintaining &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Maintaining &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -49,7 +52,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -137,6 +140,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -148,8 +153,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/maintaining.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -166,15 +169,9 @@
 <h1>Maintaining<a class="headerlink" href="#maintaining" title="Permalink to this headline">¶</a></h1>
 <div class="section" id="updating-and-deploying-documentation">
 <h2>Updating and Deploying Documentation<a class="headerlink" href="#updating-and-deploying-documentation" title="Permalink to this headline">¶</a></h2>
-<p>To create a fully-functional fork of the repository in your Github,
-<a class="reference external" href="https://docs.github.com/en/github/working-with-github-pages/creating-a-github-pages-site">set up a Github Pages project</a> for the new repository. When setting it up, associate the page
-with the <cite>master</cite> branch. The documentation will now be available publicly.</p>
-<p>Edit the files in the <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> directory how you see fit. Documentation for individual classes and files
-might be found in the source, since documentation is partially autogenerated from comments in the actual code.</p>
-<p>The documentation must then be generated. Change directories to the <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> folder, then run <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">github</span></code>.
-This will build the html web files for the online documentation and place them in the <code class="docutils literal notranslate"><span class="pre">docs/</span></code> folder. Add the
-files in the <code class="docutils literal notranslate"><span class="pre">docs/</span></code> and <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> in a new commit and push to master. The changes will be reflected on
-your project Github page.</p>
+<p>To create a fully-functional fork of the repository in your Github, <a class="reference external" href="https://docs.github.com/en/github/working-with-github-pages/creating-a-github-pages-site">set up a Github Pages project</a> for the new repository. When setting it up, associate the page with the <cite>master</cite> branch. The documentation will now be available publicly.</p>
+<p>Edit the files in the <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> directory how you see fit. Documentation for individual classes and files might be found in the source, since documentation is partially autogenerated from comments in the actual code.</p>
+<p>The documentation must then be generated. Change directories to the <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> folder, then run <code class="docutils literal notranslate"><span class="pre">make</span> <span class="pre">github</span></code>. This will build the html web files for the online documentation and place them in the <code class="docutils literal notranslate"><span class="pre">docs/</span></code> folder. Add the files in the <code class="docutils literal notranslate"><span class="pre">docs/</span></code> and <code class="docutils literal notranslate"><span class="pre">sphinx/</span></code> in a new commit and push to master. The changes will be reflected on your project Github page.</p>
 </div>
 <div class="section" id="creating-a-release">
 <h2>Creating a Release<a class="headerlink" href="#creating-a-release" title="Permalink to this headline">¶</a></h2>
@@ -189,8 +186,7 @@ <h2>Creating a Release<a class="headerlink" href="#creating-a-release" title="Pe
 <li><p><code class="docutils literal notranslate"><span class="pre">sphinx/conf.py</span></code></p></li>
 <li><p><code class="docutils literal notranslate"><span class="pre">setup.py</span></code></p></li>
 </ul>
-<p>Once this is done, all the documentation pages will reflect the new version, and the package release
-will respect this as well.</p>
+<p>Once this is done, all the documentation pages will reflect the new version, and the package release will respect this as well.</p>
 <p>Make sure to add new contributers to the <code class="docutils literal notranslate"><span class="pre">sphinx/index.rst</span></code> and <code class="docutils literal notranslate"><span class="pre">README.md</span></code> pages, if applicable.</p>
 <p>To build the package and upload to Pypi, run the commands from the root directory:</p>
 <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>python3 setup.py sdist bdist_wheel
@@ -206,35 +202,28 @@ <h2>Creating a Release<a class="headerlink" href="#creating-a-release" title="Pe
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-      
-        <a href="support.html" class="btn btn-neutral float-left" title="Support" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="support.html" class="btn btn-neutral float-left" title="Support" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/news.html b/docs/news.html
index 12a7111f..29976eaa 100644
--- a/docs/news.html
+++ b/docs/news.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>News Searching &mdash; PyAlly 1.1.1 documentation</title>
+  <title>News Searching &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/news.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -162,11 +165,13 @@
   <div class="section" id="news-searching">
 <h1>News Searching<a class="headerlink" href="#news-searching" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
-<dt id="ally.Ally">
-<em class="property">class </em><code class="sig-prename descclassname">ally.</code><code class="sig-name descname">Ally</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">params</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="p">:</span> <span class="n">float</span> <span class="o">=</span> <span class="default_value">1.0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="py method">
-<dt id="ally.Ally.lookupNews">
-<code class="sig-name descname">lookupNews</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">articleId</span></em>, <em class="sig-param"><span class="n">dataframe</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.lookupNews" title="Permalink to this definition">¶</a></dt>
+<dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.</span></code><code class="sig-name descname"><span class="pre">Ally</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span></dt>
+<dd><p>The ally.Ally.Ally class.</p>
+<p>This is the main class for this library.</p>
+<dl class="py method">
+<dt>
+<code class="sig-name descname"><span class="pre">lookupNews</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">articleId</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Looks up the news text for a given article.</p>
 <p>Calls the ‘market/news/{}.json’ endpoint to the news story with a given id.</p>
 <dl class="field-list simple">
@@ -191,8 +196,8 @@ <h1>News Searching<a class="headerlink" href="#news-searching" title="Permalink
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.searchNews">
-<code class="sig-name descname">searchNews</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbols</span></em>, <em class="sig-param"><span class="n">limit</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">dataframe</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.searchNews" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">searchNews</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbols</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">limit</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">startdate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">enddate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Searches for news on a set of symbols.</p>
 <p>Calls the ‘market/news/search.json’ endpoint to search for
 news articles related to some set of symbols.</p>
@@ -201,6 +206,8 @@ <h1>News Searching<a class="headerlink" href="#news-searching" title="Permalink
 <dd class="field-odd"><ul class="simple">
 <li><p><strong>symbols</strong> – Specify the stock symbols for which to search</p></li>
 <li><p><strong>limit</strong> – (int) maximum number of hits (10 default)</p></li>
+<li><p><strong>startdate</strong> – Earliest date to include in search</p></li>
+<li><p><strong>enddate</strong> – Last date to include in search</p></li>
 <li><p><strong>dataframe</strong> – whether to return results as dataframe</p></li>
 <li><p><strong>block</strong> – Specify whether to block thread if request exceeds rate limit</p></li>
 </ul>
@@ -233,37 +240,29 @@ <h1>News Searching<a class="headerlink" href="#news-searching" title="Permalink
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="ratelimit.html" class="btn btn-neutral float-right" title="Rate Limiting" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="option.html" class="btn btn-neutral float-left" title="Option" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="ratelimit.html" class="btn btn-neutral float-right" title="Rate Limiting" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="option.html" class="btn btn-neutral float-left" title="Option" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/objects.inv b/docs/objects.inv
index 56b64996..81d9ea58 100644
Binary files a/docs/objects.inv and b/docs/objects.inv differ
diff --git a/docs/option.html b/docs/option.html
index db675a05..84a7b79b 100644
--- a/docs/option.html
+++ b/docs/option.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Option &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Option &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/option.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -162,11 +165,13 @@
   <div class="section" id="option">
 <h1>Option<a class="headerlink" href="#option" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
-<dt id="ally.Ally">
-<em class="property">class </em><code class="sig-prename descclassname">ally.</code><code class="sig-name descname">Ally</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">params</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="p">:</span> <span class="n">float</span> <span class="o">=</span> <span class="default_value">1.0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="py method">
-<dt id="ally.Ally.expirations">
-<code class="sig-name descname">expirations</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbol</span></em>, <em class="sig-param"><span class="n">useDatetime</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.expirations" title="Permalink to this definition">¶</a></dt>
+<dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.</span></code><code class="sig-name descname"><span class="pre">Ally</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span></dt>
+<dd><p>The ally.Ally.Ally class.</p>
+<p>This is the main class for this library.</p>
+<dl class="py method">
+<dt>
+<code class="sig-name descname"><span class="pre">expirations</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbol</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">useDatetime</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets list of available expiration dates for a symbol.</p>
 <p>Calls the ‘market/options/expirations.json’ endpoint to get list of all
 exp_dates available for some given equity.</p>
@@ -196,20 +201,18 @@ <h1>Option<a class="headerlink" href="#option" title="Permalink to this headline
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.search">
-<code class="sig-name descname">search</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbol</span></em>, <em class="sig-param"><span class="n">query</span><span class="o">=</span><span class="default_value">[]</span></em>, <em class="sig-param"><span class="n">fields</span><span class="o">=</span><span class="default_value">[]</span></em>, <em class="sig-param"><span class="n">dataframe</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.search" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">search</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbol</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">query</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">List</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fields</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Searches for all option quotes on a symbol that satisfy some set of criteria</p>
+<p>Calls the ‘market/options/search.json’ endpoint, querying against certain parameters provided. Specify a single value or a list of values to expand the size of the search.</p>
+<p>Option queries are composed of three elements:</p>
 <blockquote>
-<div><p>Calls the ‘market/options/search.json’ endpoint, querying against certain parameters
-provided. Specify a single value or a list of values to expand the size of the search.</p>
-<dl class="simple">
-<dt>Option queries are composed of three elements:</dt><dd><ol class="arabic simple">
-<li><p>a condition,</p></li>
+<div><ol class="arabic simple">
+<li><p>a condition</p></li>
 <li><p>an operator</p></li>
 <li><p>a value</p></li>
 </ol>
-</dd>
-</dl>
+</div></blockquote>
 <p>in the format field-operator:value (i.e., xyear-eq:2012)</p>
 <dl>
 <dt>Queryable Fields:</dt><dd><p>strikeprice: possible values: 5 or 7.50, integers or decimals</p>
@@ -227,36 +230,54 @@ <h1>Option<a class="headerlink" href="#option" title="Permalink to this headline
 </dd>
 </dl>
 <p>Visit <a class="reference external" href="https://pypi.org/project/pyally/">the ally website</a> to see the full API behavior.</p>
-<dl>
-<dt>Args:</dt><dd><p>symbol: Specify the stock symbol against which to query</p>
-<p>fields: (Optional) List of attributes requested for each option contract found. If not specified, will return all applicable fields</p>
-<p>dataframe: (Optional) Return quotes in pandas dataframe</p>
-<p>block: Specify whether to block thread if request exceeds rate limit</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><ul class="simple">
+<li><p><strong>symbol</strong> (<em>str</em>) – Specify the stock symbol against which to query</p></li>
+<li><p><strong>fields</strong> – (Optional) List of attributes requested for each option contract found. If not specified, will return all applicable fields</p></li>
+<li><p><strong>dataframe</strong> – (Optional) Return quotes in pandas dataframe</p></li>
+<li><p><strong>block</strong> (<em>bool</em>) – Specify whether to block thread if request exceeds rate limit</p></li>
+</ul>
 </dd>
-<dt>Returns:</dt><dd><p>Default: Pandas dataframe</p>
-<p>Otherwise: flat list of dictionaries</p>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p>Pandas dataframe
+Otherwise: flat list of dictionaries</p>
 </dd>
-<dt>Raises:</dt><dd><p>RateLimitException: If block=False, rate limit problems will be raised</p>
+<dt class="field-odd">Return type</dt>
+<dd class="field-odd"><p>Default</p>
 </dd>
-<dt>Example:</dt><dd><div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span><span class="o">.</span><span class="n">search</span><span class="p">(</span>
-             <span class="s1">&#39;spy&#39;</span><span class="p">,</span>
-             <span class="n">query</span><span class="o">=</span><span class="p">[</span>
-                     <span class="s1">&#39;xdate-eq:20200814&#39;</span><span class="p">,</span>    <span class="c1"># Only consider contracts expiring on 2020-08-14</span>
-                     <span class="s1">&#39;put_call-eq:put&#39;</span><span class="p">,</span>              <span class="c1"># Only conside puts</span>
-                     <span class="s1">&#39;strikeprice-lte:350&#39;</span><span class="p">,</span>  <span class="c1"># Only consider strikes &lt;= $350</span>
-                     <span class="s1">&#39;strikeprice-gte:315&#39;</span>   <span class="c1"># Only consider strikes &gt;= $315</span>
-             <span class="p">]</span>
-     <span class="p">)</span>
-</pre></div>
-</div>
+<dt class="field-even">Raises</dt>
+<dd class="field-even"><p><strong>RateLimitException</strong> – If block=False, rate limit problems will be raised</p>
 </dd>
 </dl>
-</div></blockquote>
+<p class="rubric">Example</p>
+<div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="n">a</span><span class="o">.</span><span class="n">search</span><span class="p">(</span>
+    <span class="s1">&#39;spy&#39;</span><span class="p">,</span>
+    <span class="n">query</span><span class="o">=</span><span class="p">[</span>
+        <span class="n">optionSearchQuery</span><span class="p">(</span><span class="n">condition</span><span class="o">=</span><span class="s1">&#39;xdate&#39;</span><span class="p">,</span> <span class="n">operator</span><span class="o">=</span><span class="s1">&#39;eq&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">&#39;20200814&#39;</span><span class="p">),</span>    <span class="c1"># Only consider contracts expiring on 2020-08-14</span>
+        <span class="n">optionSearchQuery</span><span class="p">(</span><span class="n">condition</span><span class="o">=</span><span class="s1">&#39;put_call&#39;</span><span class="p">,</span> <span class="n">operator</span><span class="o">=</span><span class="s1">&#39;eq&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">&#39;put&#39;</span><span class="p">),</span>      <span class="c1"># Only consider puts</span>
+        <span class="n">optionSearchQuery</span><span class="p">(</span><span class="n">condition</span><span class="o">=</span><span class="s1">&#39;strikeprice&#39;</span><span class="p">,</span> <span class="n">operator</span><span class="o">=</span><span class="s1">&#39;lte&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">&#39;350&#39;</span><span class="p">),</span>  <span class="c1"># Only consider strikes &lt;= 350</span>
+        <span class="n">optionSearchQuery</span><span class="p">(</span><span class="n">condition</span><span class="o">=</span><span class="s1">&#39;strikeprice&#39;</span><span class="p">,</span> <span class="n">operator</span><span class="o">=</span><span class="s1">&#39;gte&#39;</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="s1">&#39;315&#39;</span><span class="p">)</span>   <span class="c1"># Only consider strikes &lt;= 315</span>
+    <span class="p">]</span>
+<span class="p">)</span>
+
+<span class="c1"># Alternatively, the queries can be specified as Strings, but it is recommended to use the `optionSearchQuery` class for validation of the query</span>
+<span class="n">a</span><span class="o">.</span><span class="n">search</span><span class="p">(</span>
+    <span class="s1">&#39;spy&#39;</span><span class="p">,</span>
+    <span class="n">query</span><span class="o">=</span><span class="p">[</span>
+        <span class="s1">&#39;xdate-eq:20200814&#39;</span><span class="p">,</span>    <span class="c1"># Only consider contracts expiring on 2020-08-14</span>
+        <span class="s1">&#39;put_call-eq:put&#39;</span><span class="p">,</span>      <span class="c1"># Only consider puts</span>
+        <span class="s1">&#39;strikeprice-lte:350&#39;</span><span class="p">,</span>  <span class="c1"># Only consider strikes &lt;= 350</span>
+        <span class="s1">&#39;strikeprice-gte:315&#39;</span>   <span class="c1"># Only consider strikes &gt;= 315</span>
+    <span class="p">]</span>
+<span class="p">)</span>
+</pre></div>
+</div>
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.strikes">
-<code class="sig-name descname">strikes</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbol</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.strikes" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">strikes</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbol</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets list of available strike prices for a symbol.</p>
 <p>Calls the ‘market/options/strikes.json’ endpoint to get list of all
 strikes available for some given equity.</p>
@@ -290,37 +311,29 @@ <h1>Option<a class="headerlink" href="#option" title="Permalink to this headline
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="news.html" class="btn btn-neutral float-right" title="News Searching" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="quote.html" class="btn btn-neutral float-left" title="Quotes" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="news.html" class="btn btn-neutral float-right" title="News Searching" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="quote.html" class="btn btn-neutral float-left" title="Quotes" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/py-modindex.html b/docs/py-modindex.html
index 98e5f7c8..1eea054e 100644
--- a/docs/py-modindex.html
+++ b/docs/py-modindex.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Python Module Index &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Python Module Index &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -51,7 +54,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -135,6 +138,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -168,26 +173,16 @@ <h1>Python Module Index</h1>
      <tr class="cap" id="cap-a"><td></td><td>
        <strong>a</strong></td><td></td></tr>
      <tr>
-       <td><img src="static/minus.png" class="toggler"
+       <td><img src="_static/minus.png" class="toggler"
               id="toggle-1" style="display: none" alt="-" /></td>
        <td>
        <code class="xref">ally</code></td><td>
        <em></em></td></tr>
-     <tr class="cg-1">
-       <td></td>
-       <td>&#160;&#160;&#160;
-       <a href="ally.html#module-ally.Ally"><code class="xref">ally.Ally</code></a></td><td>
-       <em></em></td></tr>
      <tr class="cg-1">
        <td></td>
        <td>&#160;&#160;&#160;
        <a href="info.html#module-ally.Info"><code class="xref">ally.Info</code></a></td><td>
        <em></em></td></tr>
-     <tr class="cg-1">
-       <td></td>
-       <td>&#160;&#160;&#160;
-       <a href="ratelimit.html#module-ally.RateLimit"><code class="xref">ally.RateLimit</code></a></td><td>
-       <em></em></td></tr>
    </table>
 
 
@@ -195,28 +190,25 @@ <h1>Python Module Index</h1>
            
           </div>
           <footer>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/quote.html b/docs/quote.html
index 95825db4..9d8d68f5 100644
--- a/docs/quote.html
+++ b/docs/quote.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Quotes &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Quotes &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/quote.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -162,11 +165,13 @@
   <div class="section" id="quotes">
 <h1>Quotes<a class="headerlink" href="#quotes" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
-<dt id="ally.Ally">
-<em class="property">class </em><code class="sig-prename descclassname">ally.</code><code class="sig-name descname">Ally</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">params</span><span class="o">=</span><span class="default_value">None</span></em>, <em class="sig-param"><span class="n">timeout</span><span class="p">:</span> <span class="n">float</span> <span class="o">=</span> <span class="default_value">1.0</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally" title="Permalink to this definition">¶</a></dt>
-<dd><dl class="py method">
-<dt id="ally.Ally.quote">
-<code class="sig-name descname">quote</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbols</span><span class="p">:</span> <span class="n">list</span> <span class="o">=</span> <span class="default_value">[]</span></em>, <em class="sig-param"><span class="n">fields</span><span class="p">:</span> <span class="n">list</span> <span class="o">=</span> <span class="default_value">[]</span></em>, <em class="sig-param"><span class="n">dataframe</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.quote" title="Permalink to this definition">¶</a></dt>
+<dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.</span></code><code class="sig-name descname"><span class="pre">Ally</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">params</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">timeout</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">float</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">1.0</span></span></em><span class="sig-paren">)</span></dt>
+<dd><p>The ally.Ally.Ally class.</p>
+<p>This is the main class for this library.</p>
+<dl class="py method">
+<dt>
+<code class="sig-name descname"><span class="pre">quote</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbols</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">list</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">fields</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">list</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">[]</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets the most current market data on the price of a symbol.</p>
 <blockquote>
 <div><dl>
@@ -220,8 +225,8 @@ <h1>Quotes<a class="headerlink" href="#quotes" title="Permalink to this headline
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.stream">
-<code class="sig-name descname">stream</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbols</span><span class="p">:</span> <span class="n">list</span> <span class="o">=</span> <span class="default_value">[]</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.stream" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">stream</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbols</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">list</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">[]</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Live-streams market quotes for up to 256 stock and options.</p>
 <blockquote>
 <div><p>The stream generator that yields dictionaries. Specify one or more
@@ -246,8 +251,8 @@ <h1>Quotes<a class="headerlink" href="#quotes" title="Permalink to this headline
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.timesales">
-<code class="sig-name descname">timesales</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbols</span><span class="p">:</span> <span class="n">str</span></em>, <em class="sig-param"><span class="n">startdate</span><span class="p">:</span> <span class="n">str</span></em>, <em class="sig-param"><span class="n">enddate</span><span class="p">:</span> <span class="n">str</span></em>, <em class="sig-param"><span class="n">interval</span><span class="p">:</span> <span class="n">str</span> <span class="o">=</span> <span class="default_value">'5min'</span></em>, <em class="sig-param"><span class="n">dataframe</span><span class="o">=</span><span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.timesales" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">timesales</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbols</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">startdate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">enddate</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">interval</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'5min'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets the most current market data on the price of a symbol.</p>
 <blockquote>
 <div><p>Gets a dataset of price points and other information for a symbol.
@@ -296,8 +301,8 @@ <h1>Quotes<a class="headerlink" href="#quotes" title="Permalink to this headline
 </dd></dl>
 
 <dl class="py method">
-<dt id="ally.Ally.toplists">
-<code class="sig-name descname">toplists</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">whichList</span><span class="p">:</span> <span class="n">str</span></em>, <em class="sig-param"><span class="n">exchange</span><span class="p">:</span> <span class="n">str</span> <span class="o">=</span> <span class="default_value">'Q'</span></em>, <em class="sig-param"><span class="n">dataframe</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em>, <em class="sig-param"><span class="n">block</span><span class="p">:</span> <span class="n">bool</span> <span class="o">=</span> <span class="default_value">True</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Ally.toplists" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">toplists</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">whichList</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exchange</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">'Q'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">dataframe</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">block</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">bool</span></span> <span class="o"><span class="pre">=</span></span> <span class="default_value"><span class="pre">True</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Gets the most recent toplists for a given exchange.</p>
 <blockquote>
 <div><p>Args:</p>
@@ -352,37 +357,29 @@ <h1>Quotes<a class="headerlink" href="#quotes" title="Permalink to this headline
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="option.html" class="btn btn-neutral float-right" title="Option" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="trading.html" class="btn btn-neutral float-left" title="Trading" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="option.html" class="btn btn-neutral float-right" title="Option" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="trading.html" class="btn btn-neutral float-left" title="Trading" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/ratelimit.html b/docs/ratelimit.html
index 84a4d8f9..104acf13 100644
--- a/docs/ratelimit.html
+++ b/docs/ratelimit.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Rate Limiting &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Rate Limiting &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/ratelimit.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -162,51 +165,30 @@
   <div class="section" id="rate-limiting">
 <h1>Rate Limiting<a class="headerlink" href="#rate-limiting" title="Permalink to this headline">¶</a></h1>
 <p>Ally imposes rate limits for each account, “designed to protect accounts from abuse and servers from load.”</p>
-<p>PyAlly has thread-safe systems in place to respect these limits,
-and provides information and flexibility when dealing with these limits.</p>
-<p>Every function avaliable in the library has a <code class="docutils literal notranslate"><span class="pre">block</span></code> keyword that modifies the behavior of the
-function when the rate limit has been exceeded. When true, the function
-will block the calling thread until the API will accept the call, should the function
-encounter a rate limit exception.
-When false, the function will raise a <code class="docutils literal notranslate"><span class="pre">ally.exceptions.RateLimitException</span></code>. The user
-can then build custom logic around rate limit failures.</p>
-<p>Also, users can accesss the current state of the rate limits. Rate limit information
-is held on a module-level, and provides only a single set of limits shared across
-all <code class="docutils literal notranslate"><span class="pre">ally.Ally()</span></code> instances.</p>
+<p>PyAlly has thread-safe systems in place to respect these limits, and provides information and flexibility when dealing with these limits.</p>
+<p>Every function avaliable in the library has a <code class="docutils literal notranslate"><span class="pre">block</span></code> keyword that modifies the behavior of the function when the rate limit has been exceeded. When true, the function will block the calling thread until the API will accept the call, should the function encounter a rate limit exception. When false, the function will raise a <code class="docutils literal notranslate"><span class="pre">ally.exceptions.RateLimitException</span></code>. The user can then build custom logic around rate limit failures.</p>
+<p>Also, users can accesss the current state of the rate limits. Rate limit information is held on a module-level, and provides only a single set of limits shared across all <code class="docutils literal notranslate"><span class="pre">ally.Ally()</span></code> instances.</p>
 <p>Rate limit information can be queried with the <code class="docutils literal notranslate"><span class="pre">ally.RateLimit.snapshot()</span></code> function:</p>
-<span class="target" id="module-ally.RateLimit"></span><p>Controls the API rate limiting</p>
-<ul class="simple">
-<li><dl class="simple">
-<dt>Rate limits</dt><dd><ul>
-<li><p>40 per minute, order submission (including submit, modify, cancel)</p></li>
-<li><p>60 per minute, market quotes</p></li>
-<li><p>180 per minute, user info like balance, summary, etc</p></li>
-</ul>
-</dd>
-</dl>
-</li>
-</ul>
 <dl class="py function">
 <dt id="ally.RateLimit.snapshot">
-<code class="sig-prename descclassname">ally.RateLimit.</code><code class="sig-name descname">snapshot</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">req_type</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.RateLimit.snapshot" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname"><span class="pre">ally.RateLimit.</span></code><code class="sig-name descname"><span class="pre">snapshot</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">req_type</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.RateLimit.snapshot" title="Permalink to this definition">¶</a></dt>
 <dd><p>Returns all relevent rate limit information for a given request type.</p>
-<blockquote>
-<div><dl class="simple">
-<dt>Args:</dt><dd><dl class="simple">
-<dt>req_type:</dt><dd><p>one of RequestType.{Order,Quote,Info}</p>
+<dl class="field-list simple">
+<dt class="field-odd">Parameters</dt>
+<dd class="field-odd"><p><strong>req_type</strong> – one of RequestType.{Order,Quote,Info}</p>
 </dd>
-</dl>
-</dd>
-<dt>Returns:</dt><dd><p>dictionary, with keys [‘used’,’remaining’,’expiration’]</p>
+<dt class="field-even">Returns</dt>
+<dd class="field-even"><p>dictionary, with keys [‘used’,’remaining’,’expiration’]</p>
 </dd>
 </dl>
 <p>Example:</p>
-</div></blockquote>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">ally</span><span class="o">.</span><span class="n">RateLimit</span><span class="o">.</span><span class="n">snapshot</span><span class="p">(</span><span class="n">ally</span><span class="o">.</span><span class="n">RequestType</span><span class="o">.</span><span class="n">Quote</span><span class="p">)</span>
 
-<span class="go">{&#39;expiration&#39;: datetime.datetime(2020, 6, 22, 17, 5, 42, 55080, tzinfo=datetime.timezone.utc),</span>
-<span class="go">&#39;remaining&#39;: 56,</span>
-<span class="go">&#39;used&#39;: 4}</span>
+<span class="go">{</span>
+<span class="go">    &#39;expiration&#39;: datetime.datetime(2020, 6, 22, 17, 5, 42, 55080, tzinfo=datetime.timezone.utc),</span>
+<span class="go">    &#39;remaining&#39;: 56,</span>
+<span class="go">    &#39;used&#39;: 4</span>
+<span class="go">}</span>
 </pre></div>
 </div>
 </dd></dl>
@@ -218,37 +200,29 @@ <h1>Rate Limiting<a class="headerlink" href="#rate-limiting" title="Permalink to
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="watchlist.html" class="btn btn-neutral float-right" title="Watchlists" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="news.html" class="btn btn-neutral float-left" title="News Searching" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="watchlist.html" class="btn btn-neutral float-right" title="Watchlists" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="news.html" class="btn btn-neutral float-left" title="News Searching" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/search.html b/docs/search.html
index 5141d279..101f6b0d 100644
--- a/docs/search.html
+++ b/docs/search.html
@@ -3,38 +3,42 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Search &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Search &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
     
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
-    <script type="text/javascript" src="static/searchtools.js"></script>
+    <script type="text/javascript" src="_static/searchtools.js"></script>
+    <script type="text/javascript" src="_static/language_data.js"></script>
     <link rel="index" title="Index" href="genindex.html" />
     <link rel="search" title="Search" href="#" /> 
 </head>
@@ -50,7 +54,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +138,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +151,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-        
       </li>
     
   </ul>
@@ -174,28 +178,25 @@
            
           </div>
           <footer>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/searchindex.js b/docs/searchindex.js
index 99076af8..51df68a2 100644
--- a/docs/searchindex.js
+++ b/docs/searchindex.js
@@ -1,1 +1,1 @@
-Search.setIndex({docnames:["account","ally","index","info","installing","maintaining","news","option","quote","ratelimit","support","trading","watchlist"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":1,sphinx:56},filenames:["account.rst","ally.rst","index.rst","info.rst","installing.rst","maintaining.rst","news.rst","option.rst","quote.rst","ratelimit.rst","support.rst","trading.rst","watchlist.rst"],objects:{"ally.Ally":{__init__:[1,2,1,""],accounts:[0,2,1,""],balances:[0,2,1,""],expirations:[7,2,1,""],history:[0,2,1,""],holdings:[0,2,1,""],lookupNews:[6,2,1,""],quote:[8,2,1,""],search:[7,2,1,""],searchNews:[6,2,1,""],stream:[8,2,1,""],strikes:[7,2,1,""],timesales:[8,2,1,""],toplists:[8,2,1,""]},"ally.Info":{Clock:[3,0,1,""],Status:[3,0,1,""],clock:[3,3,1,""],status:[3,3,1,""]},"ally.Order":{Limit:[11,0,1,""],Market:[11,0,1,""],Order:[11,0,1,"id0"],Stop:[11,0,1,""],StopLimit:[11,0,1,""],TrailingStop:[11,0,1,""]},"ally.Order.Limit":{__init__:[11,2,1,""]},"ally.Order.Market":{__init__:[11,2,1,""]},"ally.Order.Order":{__init__:[11,2,1,""],convert_buysell:[11,2,1,""],fixml:[11,2,1,""],set_account:[11,2,1,""],set_buysell:[11,2,1,""],set_orderid:[11,2,1,""],set_pricing:[11,2,1,""],set_quantity:[11,2,1,""],set_symbol:[11,2,1,""],set_time:[11,2,1,""],status:[11,2,1,""]},"ally.Order.Stop":{__init__:[11,2,1,""]},"ally.Order.StopLimit":{__init__:[11,2,1,""]},"ally.Order.TrailingStop":{__init__:[11,2,1,""]},"ally.RateLimit":{snapshot:[9,3,1,""]},"ally.Watchlist":{Watchlist:[12,0,1,""]},"ally.utils":{option_format:[11,3,1,""]},ally:{Ally:[1,1,0,"-"],Info:[3,1,0,"-"],RateLimit:[9,1,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","module","Python module"],"2":["py","method","Python method"],"3":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:module","2":"py:method","3":"py:function"},terms:{"000":11,"0100":8,"01t01":11,"069":3,"0x7f6ae8246278":11,"100":11,"105":8,"12345678":[4,11],"1592172240":3,"15min":8,"180":9,"1970":11,"1min":8,"2012":7,"2019":8,"2020":[3,7,8,9,11],"20200814":7,"2022":7,"256":[1,8],"2700":8,"279216":8,"2800":8,"2938":6,"301":11,"315":7,"3200":8,"350":7,"3700":8,"55080":9,"5min":8,"5ollnqgi9s29fr694ab4im0oq":6,"6900":8,"793186":8,"break":2,"case":[8,11],"class":[0,1,3,5,6,7,8,11,12],"default":[0,1,6,7,8],"enum":11,"export":4,"float":[0,1,6,7,8],"function":[2,3,5,9,11,12],"import":[4,5,11],"int":[6,11],"new":[2,4,5,10,11,12],"public":5,"return":[0,3,6,7,8,9,11],"short":11,"static":3,"true":[0,3,6,7,8,9,11],Added:2,And:[4,11],For:1,That:2,The:[2,4,5,8,9,10,11,12],Then:[4,11],Will:8,With:2,__init__:[1,11],a2231367:6,aapl:[8,11,12],about:[0,4,11],abov:[1,11],abus:9,accept:[2,4,8,9,11],access:[4,8],accesss:9,account:[1,2,3,4,9,11,12],accur:11,acquisit:0,across:9,activ:10,actual:[5,11],add:5,added:11,affect:11,after:[1,2],against:7,alienbrett:2,all:[0,1,2,5,7,8,9,11,12],alli:[0,2,3,4,5,6,7,8,9,11,12],ally_account_nbr:[1,4],ally_consumer_kei:[1,4],ally_consumer_secret:[1,4],ally_oauth_secret:[1,4],ally_oauth_token:[1,4],also:[0,4,9,11],american:8,among:11,amount:0,ani:[1,3,11],answer:10,anyon:[2,4],api:[1,2,3,4,7,8,9,11],applic:[4,5,7],arg:[3,7,8,9],argument:1,around:[2,9],articl:[2,6],articleid:6,ask:8,associ:[4,5,12],attribut:[7,11],auth:3,autogener:5,avail:[0,5,7],avali:9,awai:11,back:10,balanc:[0,1,9],bank:2,bashrc:4,basic:[0,2],bdist_wheel:5,becom:11,been:[2,9,11],beer:2,befor:[1,5,11],behavior:[7,9],being:1,best:2,between:11,bfra:8,bid:8,biofrontera:8,biomedicin:8,block:[0,3,6,7,8,9],board:8,bool:[0,3,6,7,8],both:8,branch:5,brett:2,broken:2,brokerag:2,bui:[2,11],build:[5,9],bulletin:8,buycov:11,buysel:11,call:[0,1,4,6,7,9,11],came:11,can:[1,2,4,8,9,10,11],cancel:[1,2,9],cash:[0,1],cbmg:8,cellular:8,certain:7,chang:[2,3,5],change_at:3,check:10,chg:8,chg_sign:8,circumst:11,click:4,clock:3,clone:2,close:3,code:[2,4,5],cole:2,column:6,comm:11,command:5,comment:5,commit:5,commun:10,compat:2,compil:11,compos:7,conceal:4,condit:7,conf:5,connect:8,consid:7,construct:11,contain:1,contract:[7,11],contractor:2,contribut:[2,5],control:[2,9],convert_buysel:11,correspond:11,cost:0,could:2,creat:[1,2,4,11,12],creator:4,credenti:4,criteria:7,current:[0,1,3,8,9,11],custom:9,cxl:11,dai:[1,8,11],data:8,datafram:[0,6,7,8],dataset:8,datatyp:12,date:[2,3,6,7,8,11],datetim:[7,8,9],deal:[2,9],decim:7,delet:12,depend:8,deploi:2,deposit:0,describ:1,design:[2,9],desir:11,detail:[1,2],dict:[3,4,6,8],dictionari:[0,1,3,7,8,9],differ:[5,11],direct:11,directli:[2,3,11],directori:5,dist:5,distribut:4,dividend:[0,1],doc:5,document:[2,11],doe:11,doesn:11,dollar:11,done:[2,4,5,11],down:3,dtype:6,dure:8,dying:2,each:[0,7,8,9,11],earlier:11,easi:[4,11],easier:2,easiest:11,easili:2,edit:5,either:11,element:[7,8],email:[2,10],encount:9,end:8,enddat:8,endpoint:[0,6,7],enjoi:2,enter:11,environ:[1,2],equal:7,equiti:7,equival:3,error:3,essenti:2,establish:8,etc:[0,3,9],even:1,everi:[9,11],exampl:[3,6,7,8,9,12],exce:[0,3,6,7,8],exceed:9,except:9,exchang:8,execut:11,exist:11,exp_dat:[7,11],expand:7,expir:[7,9,11],eye:2,facet:1,fail:1,failur:9,fals:[0,3,6,7,8,9,11],featur:11,fee:2,feel:[2,10],few:[2,4,11],field:[7,8,11],file:[1,2,5],filenam:1,fill:4,financ:2,find:10,first:[2,11],fit:5,fixml:11,flag:8,flat:[0,7,8],flexibl:9,folder:5,follow:4,forc:11,fork:5,form:[1,8,11],format:[0,7,8,11],found:[5,7],fox:2,fraction:11,free:[2,10],from:[1,2,3,5,8,9,11,12],full:[1,5,7,11],fulli:5,futur:8,gather:1,gener:[5,8,11],get:[0,1,2,3,7,8,10,11],github:[2,5,10],given:[6,7,8,9],gld:[8,11],gld_histori:8,gmt:3,good:11,googl:12,grab:[1,8],grave:2,greater:7,group:8,gtc:11,gte:7,had:2,handl:[11,12],has:[2,9],hasn:11,have:[4,8,11],headlin:6,held:[1,9],help:[10,11],here:2,histor:[1,8],histori:[0,1],hit:6,hold:[0,1,4],hopefulli:10,hour:8,how:[5,11],html:5,human:[2,11],hypothet:11,ibm201231c00301000:11,ibm:[8,11],ibm_cal:11,impli:11,impos:9,improv:2,inc:8,includ:[0,3,8,9],incorpor:2,index:[5,6],individu:5,info:[2,9,11],inform:[0,1,2,3,8,9,11],initi:[11,12],inlin:11,insensit:11,insert:4,instal:2,instanc:[8,9,11],instant:2,instanti:[4,11],instrument:11,integ:[7,11],integr:2,intellig:2,interest:2,interfac:[2,8],intern:11,interv:8,intradai:[1,8],intuit:[2,11],invest:[1,2,4],investor:2,issu:10,its:11,json:[0,1,2,6,7],julian:2,jun:3,just:4,keep:4,kei:[1,2,8,9],keyword:9,kwarg:3,last:8,lastest:2,later:11,latest:11,leak:4,leavesqti:11,leg:2,less:[4,7],level:9,librari:[9,11],like:[4,9,11],limit:[0,2,3,6,7,8,11],limpx:11,list1:12,list:[0,1,6,7,8,12],live:8,load:9,loc:8,local:[1,11],log:4,logic:9,look:[4,6],lookupnew:6,low:2,lte:7,made:2,mai:8,maintain:2,make:[2,4,5,11],manag:1,mani:2,manipul:2,margin:[0,1],margolin:2,market:[0,3,6,7,8,9,11],master:5,matt:2,matter:11,matur:2,maximum:6,medium:1,messag:2,method:[2,4,11],metric:0,might:5,mimic:12,mind:4,minut:9,mobil:2,modif:11,modifi:[1,2,9],modul:[4,9],more:[2,4,8],most:[8,11],movement:0,much:4,multi:2,must:[5,8,11],name:[6,8,11],nasdaq:8,need:[2,4,10,11],next:3,non:1,none:[0,1,3,6,7,8,11],normal:11,note:2,notic:[8,11],now:[2,4,5,11],number:[0,1,5,6,11],nyse:8,obj:[7,11],object:[2,4,6,7,8,11,12],oblig:2,occ:11,occur:8,offset:11,old:2,onc:[5,11],onclos:11,one:[0,8,9,11],ones:2,onli:[7,8,9,11],onlin:5,open:[2,10],oper:[2,7],option:[0,2,8],option_format:11,order:[1,2,9],orderid:11,ordqti:11,otc:8,other:[4,8,11],otherwis:[0,7,11],otyp:11,out:[4,11],output:0,outstand:2,over:1,oversight:2,overview:2,packag:5,page:[1,4,5,10],panda:[0,7,8],param:[0,1,4,6,7,8],paramet:[0,2,6,7],parent:12,part:2,partial:[5,8],particular:3,pass:[2,11],past:1,path:4,pchg:8,pcl:8,per:9,percent:11,perfect:2,person:4,pip:[2,4],place:[1,4,5,9],platform:2,pleas:[2,10],point:8,pop:12,posit:1,possibl:[7,8],post:3,postion:11,pre:3,preserv:[2,8],pretti:10,preview:11,price:[0,1,2,7,8],priceobj:11,print:[8,11],problem:[0,3,6,7,8],profit:1,project:[2,4,5,10],properti:11,protect:9,provid:[1,2,7,9,11],publicli:5,purchas:11,push:5,put:[7,11],put_cal:7,pyalli:[4,9],pypi:[2,5],python3:5,python:[2,4,12],qty:11,qualiti:2,quantiti:11,queri:[7,8,9],queryabl:7,quot:[1,2,7,9],rais:[0,3,6,7,8,9],rang:8,rank:8,rate:[0,2,3,6,7,8],ratelimit:9,ratelimitexcept:[0,3,6,7,8,9],reach:11,readabl:11,readi:4,readm:5,real:[1,8],realli:11,recent:[8,11],recommend:4,redesign:2,reduc:2,reflect:5,rejrsn:11,relat:6,releas:[2,11],relev:9,remain:9,remov:12,repositori:5,req_typ:9,request:[0,2,3,6,7,8,9],requesttyp:9,respect:[5,9],rest:11,result:6,revis:11,rob:2,roll:1,root:5,row:[0,8],rst:5,run:[4,5],safe:9,said:2,salient:2,same:11,satisfi:7,sdist:5,search:[2,7],searchnew:6,second:1,secur:4,see:[5,7,10,11,12],self:11,sell:11,sellshort:11,send:[2,10],sensit:8,server:[8,9],servic:3,set:[2,4,5,6,7,9,11],set_account:11,set_buysel:11,set_orderid:11,set_pric:11,set_quant:11,set_symbol:11,set_tim:11,setup:5,share:[9,11],should:[2,8,9],shouldn:11,side:11,signatur:11,significantli:11,similar:4,simpl:[2,3,11],simplifi:2,sinc:[4,5],singl:[7,8,9],size:[7,8,11],smaller:2,snapshot:9,softwar:2,some:[0,2,6,7],someon:10,someth:11,sometim:2,soon:10,sourc:5,specif:[4,8],specifi:[0,1,3,4,6,7,8,11],sphinx:5,spy:[6,7,8],stai:2,standard:11,start:[4,8],startdat:8,stat:11,state:[1,9,11],statu:[3,11],step:2,stock:[0,2,6,7,8],stop:11,stoplimit:11,stoppx:11,store:4,stori:6,str:[8,11],stream:[1,2,8],strike:[7,11],strikepric:7,string:[1,7,8,11],strongli:4,submiss:9,submit:[1,2,9],success:3,summari:[9,11],sun:3,suppl:2,suppli:2,support:[1,2,11],sure:[1,5],svi:11,symbol:[1,6,7,8,11,12],system:9,take:[2,8],term:11,test:5,text:6,than:[2,4,7],thei:4,them:[5,11],thi:[0,2,4,5,8,11],thought:2,thread:[0,3,6,7,8,9],three:[7,11],through:[2,4],tianyu:2,tied:3,til:11,time:[1,3,8,11],timeinforc:11,timeout:[0,1,6,7,8],timesal:[1,8],timestamp:3,timezon:9,token:4,tool:4,topact:8,topgain:8,toplist:[2,8],toplos:8,toppctgain:8,toppctlos:8,topvolum:8,total:11,tpopctgain:8,track:1,trade:[0,1,4,8],trail:11,trailingstop:11,transact:[0,2],transfer:1,traversa:2,trddt:11,treat:11,trigger:11,troubl:2,tsla:8,turn:11,twine:5,txntm:11,txt:11,type:[0,1,2,9],type_:11,tzinfo:9,under:11,underli:11,unfortun:8,uniqu:[7,11],unit:[5,11],unixtim:3,unrespons:1,until:9,updat:[1,2,10],upload:5,use:[2,4,5,11],use_pct:11,used:[4,8,9,11],usedatetim:7,user:[9,11],using:10,utc:9,util:11,valadez:2,valu:[0,2,7],variabl:[1,2],variou:0,venmo:2,veri:[4,11],version:5,view:2,visit:[1,7],wai:[2,4,11,12],wait:1,watchlist:2,web:[2,5],websit:[4,7],welcom:2,well:[5,8,11],when:[5,9],where:11,whether:[0,3,6,7,8],which:[2,4,6,7],whichlist:8,who:2,window:1,withdraw:0,without:11,work:8,wrap:12,wrapper:2,xdate:7,xmonth:7,xxxx:4,xxxxxxxxxxxxxxxxxxxxx:4,xxxxxxxxxxxxxxxxxxxxxxxx:4,xxxxxxxxxxxxxxxxxxxxxxxxx:4,xyear:7,yet:11,yield:8,you:[2,4,5,10,11],your:[1,2,4,5,12],yyyi:7,yyyymmdd:7},titles:["Account","Ally Object","PyAlly Trading Library","Info","Installing","Maintaining","News Searching","Option","Quotes","Rate Limiting","Support","Trading","Watchlists"],titleterms:{"new":6,With:11,account:0,alli:1,cancel:11,chang:11,content:2,contributor:2,creat:5,deal:11,deploi:5,directli:4,document:5,environ:4,featur:2,file:4,first:4,get:4,info:3,instal:4,json:4,kei:4,librari:[2,4],limit:9,maintain:5,modifi:11,object:1,open:11,option:[7,11],order:11,outstand:11,overview:[4,11],paramet:11,pass:4,plan:2,price:11,pyalli:2,quot:8,rate:9,releas:5,search:6,step:4,stock:11,submit:11,support:10,trade:[2,11],type:11,updat:5,variabl:4,version:2,view:11,watchlist:12}})
\ No newline at end of file
+Search.setIndex({docnames:["account","ally","index","info","installing","maintaining","news","option","quote","ratelimit","support","trading","watchlist"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["account.rst","ally.rst","index.rst","info.rst","installing.rst","maintaining.rst","news.rst","option.rst","quote.rst","ratelimit.rst","support.rst","trading.rst","watchlist.rst"],objects:{"ally.Ally":{__init__:[1,1,1,""]},"ally.Info":{Clock:[3,0,1,""],Status:[3,0,1,""],clock:[3,3,1,""],status:[3,3,1,""]},"ally.Order":{Limit:[11,0,1,""],Market:[11,0,1,""],Order:[11,0,1,""],Stop:[11,0,1,""],StopLimit:[11,0,1,""],TrailingStop:[11,0,1,""]},"ally.Order.Limit":{__init__:[11,1,1,""]},"ally.Order.Market":{__init__:[11,1,1,""]},"ally.Order.Order":{convert_buysell:[11,1,1,""],fixml:[11,1,1,""],set_account:[11,1,1,""],set_buysell:[11,1,1,""],set_orderid:[11,1,1,""],set_pricing:[11,1,1,""],set_quantity:[11,1,1,""],set_symbol:[11,1,1,""],set_time:[11,1,1,""],status:[11,1,1,""]},"ally.Order.Stop":{__init__:[11,1,1,""]},"ally.Order.StopLimit":{__init__:[11,1,1,""]},"ally.Order.TrailingStop":{__init__:[11,1,1,""]},"ally.RateLimit":{snapshot:[9,3,1,""]},"ally.Watchlist":{Watchlist:[12,0,1,""]},"ally.utils":{option_format:[11,3,1,""]},ally:{Ally:[1,0,1,""],Info:[3,2,0,"-"]}},objnames:{"0":["py","class","Python class"],"1":["py","method","Python method"],"2":["py","module","Python module"],"3":["py","function","Python function"]},objtypes:{"0":"py:class","1":"py:method","2":"py:module","3":"py:function"},terms:{"000":11,"0100":8,"01t01":11,"069":3,"0x7f6ae8246278":11,"100":11,"105":8,"12345678":[4,11],"1592172240":3,"15min":8,"1970":11,"1min":8,"2012":7,"2019":8,"2020":[3,7,8,9,11],"20200814":7,"2022":7,"256":[1,8],"2700":8,"279216":8,"2800":8,"2938":6,"301":11,"315":7,"3200":8,"350":7,"3700":8,"55080":9,"5min":8,"5ollnqgi9s29fr694ab4im0oq":6,"6900":8,"793186":8,"break":2,"case":[8,11],"class":[0,1,3,5,6,7,8,11,12],"default":[0,1,6,7,8],"enum":11,"export":4,"float":[0,1,6,7,8],"function":[2,3,5,9,11,12],"import":[4,5,11],"int":[6,11],"new":[2,4,5,10,11,12],"public":5,"return":[0,3,6,7,8,9,11],"short":11,"static":3,"true":[0,3,6,7,8,9,11],Added:2,And:[4,11],For:1,That:2,The:[0,1,2,4,5,6,7,8,9,10,11,12],Then:[4,11],Will:8,With:2,__init__:[1,11],a2231367:6,aapl:[8,11,12],about:[0,3,4,11],abov:[1,11],abus:9,accept:[2,4,8,9,11],access:[4,8],accesss:9,account:[1,2,3,4,9,11,12],accur:11,acquisit:0,across:9,activ:10,actual:[5,11],add:5,added:11,affect:11,after:[1,2],against:7,alex:2,alienbrett:2,all:[0,1,2,5,7,8,9,11,12],alli:[0,2,3,4,5,6,7,8,9,11,12],ally_account_nbr:[1,4],ally_consumer_kei:[1,4],ally_consumer_secret:[1,4],ally_oauth_secret:[1,4],ally_oauth_token:[1,4],also:[0,4,9,11],altern:7,american:8,among:11,amount:0,ani:[1,3,11],answer:10,anyon:[2,4],api:[1,2,3,4,7,8,9,11],applic:[4,5,7],arg:8,around:[2,9],articl:[2,6],articleid:6,ask:8,associ:[4,5,12],attribut:[7,11],auth:3,autogener:5,avail:[0,5,7],avali:9,awai:11,back:10,balanc:[0,1],bank:2,bashrc:4,basic:[0,2],bdist_wheel:5,becom:11,been:[2,9,11],beer:2,befor:[1,5,11],behavior:[7,9],being:1,best:2,between:11,bfra:8,bid:8,biofrontera:8,biomedicin:8,block:[0,3,6,7,8,9],board:8,bool:[0,3,6,7,8],both:8,branch:5,brett:2,broken:2,brokerag:2,bui:[2,11],build:[5,9],bulletin:8,buycov:11,buysel:11,call:[0,1,4,6,7,9,11],came:11,can:[1,2,4,7,8,9,10,11],cancel:[1,2],cash:[0,1],cbmg:8,cellular:8,certain:7,chang:[2,3,5],change_at:3,check:10,chg:8,chg_sign:8,circumst:11,click:4,clock:3,clone:2,close:3,code:[2,4,5],cole:2,column:6,comm:11,command:5,comment:5,commit:5,commun:10,compat:2,compil:11,compos:7,conceal:4,condit:7,conf:5,connect:8,consid:7,construct:11,contain:1,contract:[7,11],contractor:2,contribut:[2,5],control:2,convert_buysel:11,correspond:11,cost:0,could:2,creat:[1,2,4,11,12],creator:4,credenti:4,criteria:7,current:[0,1,3,8,9,11],custom:9,cxl:11,dai:[1,8,11],data:8,datafram:[0,6,7,8],dataset:8,datatyp:12,date:[2,3,6,7,8,11],datetim:[7,8,9],deal:[2,9],decim:7,delet:12,depend:8,deploi:2,deposit:0,describ:1,design:[2,9],desir:11,detail:[1,2],dict:[3,4,6,8],dictionari:[0,1,3,7,8,9],differ:[5,11],direct:11,directli:[2,3,11],directori:5,dist:5,distribut:4,dividend:[0,1],doc:5,document:[2,11],doe:11,doesn:11,dollar:11,done:[2,4,5,11],down:3,dtype:6,dure:8,dying:2,each:[0,7,8,9,11],earlier:11,earliest:6,easi:[4,11],easier:2,easiest:11,easili:2,edit:5,either:11,element:[7,8],email:[2,10],encount:9,end:8,enddat:[6,8],endpoint:[0,6,7],enjoi:2,enter:11,environ:[1,2],equal:7,equiti:7,equival:3,error:3,essenti:2,establish:8,etc:[0,3],even:1,everi:[9,11],exampl:[3,6,7,8,9,12],exce:[0,3,6,7,8],exceed:9,except:9,exchang:8,execut:11,exist:11,exp_dat:[7,11],expand:7,expir:[7,9,11],eye:2,facet:1,fail:1,failur:9,fals:[0,3,6,7,8,9,11],featur:11,fee:2,feel:[2,10],few:[2,4,11],field:[7,8,11],file:[1,2,5],filenam:1,fill:4,financ:2,find:10,first:[2,11],fit:5,fixml:11,flag:8,flat:[0,7,8],flexibl:9,folder:5,follow:4,forc:11,fork:5,form:[1,8,11],format:[0,7,8,11],found:[5,7],fox:2,fraction:11,free:[2,10],from:[1,2,3,5,8,9,11,12],full:[1,5,7,11],fulli:5,futur:8,gather:1,gener:[5,8,11],get:[0,1,2,3,7,8,10,11],github:[2,5,10],given:[6,7,8,9],gld:[8,11],gld_histori:8,gmt:3,good:11,googl:12,grab:[1,8],grave:2,greater:7,group:8,gtc:11,gte:7,had:2,handl:[11,12],has:[2,9],hasn:11,have:[4,8,11],headlin:6,held:[1,9],help:[10,11],here:2,histor:[1,8],histori:[0,1],hit:6,hold:[0,1,4],hopefulli:10,hour:8,how:[5,11],html:5,human:[2,11],hypothet:11,ibm201231c00301000:11,ibm:[8,11],ibm_cal:11,impli:11,impos:9,improv:2,inc:8,includ:[0,3,6,8],incorpor:2,index:[2,5,6],individu:5,info:[2,9,11],inform:[0,1,2,3,8,9,11],initi:[11,12],inlin:11,insensit:11,insert:4,instal:2,instanc:[8,9,11],instant:2,instanti:[4,11],instrument:11,integ:[7,11],integr:2,intellig:2,interest:2,interfac:[2,8],intern:11,interv:8,intradai:[1,8],intuit:[2,11],invest:[1,2,4],investor:2,issu:10,its:11,json:[0,1,2,6,7],julian:2,jun:3,just:4,keep:4,kei:[1,2,8,9],kennedi:2,keyword:9,kwarg:3,last:[6,8],lastest:2,later:11,latest:11,leak:4,leavesqti:11,leg:2,less:[4,7],level:9,librari:[0,1,6,7,8,9,11],like:[4,11],limit:[0,2,3,6,7,8,11],limpx:11,list1:12,list:[0,1,6,7,8,12],live:8,load:9,loc:8,local:[1,11],log:4,logic:9,look:[4,6],lookupnew:6,low:2,lte:7,made:2,mai:8,main:[0,1,6,7,8],maintain:2,make:[2,4,5,11],manag:1,mani:2,manipul:2,margin:[0,1],margolin:2,market:[0,3,6,7,8,11],master:5,matt:2,matter:11,matur:2,maximum:6,medium:1,messag:2,method:[2,4,11],metric:0,might:5,mimic:12,mind:4,mobil:2,modif:11,modifi:[1,2,9],modul:[2,4,9],more:[2,4,8],most:[8,11],movement:0,much:4,multi:2,must:[5,8,11],name:[6,8,11],nasdaq:8,need:[2,4,10,11],next:3,non:1,none:[0,1,3,6,7,8,11],normal:11,note:2,notic:[8,11],now:[2,4,5,11],number:[0,1,5,6,11],nyse:8,obj:[7,11],object:[2,4,6,7,8,11,12],oblig:2,occ:11,occur:8,offset:11,old:2,onc:[5,11],onclos:11,one:[0,8,9,11],ones:2,onli:[7,8,9,11],onlin:5,open:[2,10],oper:[2,7],option:[0,2,8],option_format:11,optionsearchqueri:7,order:[1,2,9],orderid:11,ordqti:11,otc:8,other:[4,8,11],otherwis:[0,7,11],otyp:11,out:[4,11],output:0,outstand:2,over:1,oversight:2,overview:2,packag:5,page:[1,2,4,5,10],panda:[0,7,8],param:[0,1,4,6,7,8],paramet:[0,1,2,3,6,7,9],parent:12,part:2,partial:[5,8],particular:3,pass:[2,11],past:1,path:4,pchg:8,pcl:8,percent:11,perfect:2,person:4,pip:[2,4],place:[1,4,5,9],platform:2,pleas:[2,10],point:8,pop:12,posit:1,possibl:[7,8],post:3,postion:11,pre:3,preserv:[2,8],pretti:10,preview:11,price:[0,1,2,7,8],priceobj:11,print:[8,11],problem:[0,3,6,7,8],profit:1,project:[2,4,5,10],properti:11,protect:9,provid:[1,2,7,9,11],publicli:5,purchas:11,push:5,put:[7,11],put_cal:7,pyalli:[4,9],pypi:[2,5],python3:5,python:[2,4,12],qty:11,qualiti:2,quantiti:11,queri:[7,8,9],queryabl:7,quot:[1,2,7,9],rais:[0,3,6,7,8,9],rang:8,rank:8,rate:[0,2,3,6,7,8],ratelimit:9,ratelimitexcept:[0,3,6,7,8,9],reach:11,readabl:11,readi:4,readm:5,real:[1,8],realli:11,recent:[8,11],recommend:[4,7],redesign:2,reduc:2,reflect:5,rejrsn:11,relat:6,releas:[2,11],relev:9,remain:9,remov:12,repositori:5,req_typ:9,request:[0,2,3,6,7,8,9],requesttyp:9,respect:[5,9],rest:11,result:6,revis:11,rob:2,roll:1,root:5,row:[0,8],rst:5,run:[4,5],safe:9,said:2,salient:2,same:11,satisfi:7,sdist:5,search:[2,7],searchnew:6,second:1,secur:4,see:[5,7,10,11,12],self:11,sell:11,sellshort:11,send:[2,10],sensit:8,server:[8,9],servic:3,set:[2,4,5,6,7,9,11],set_account:11,set_buysel:11,set_orderid:11,set_pric:11,set_quant:11,set_symbol:11,set_tim:11,setup:5,share:[9,11],should:[2,8,9],shouldn:11,side:11,signatur:11,significantli:11,similar:4,simpl:[2,3,11],simplifi:2,sinc:[4,5],singl:[7,8,9],size:[7,8,11],smaller:2,snapshot:9,softwar:2,some:[0,2,6,7],someon:10,someth:11,sometim:2,soon:10,sourc:5,specif:[4,8],specifi:[0,1,3,4,6,7,8,11],sphinx:5,spy:[6,7,8],stai:2,standard:11,start:[4,8],startdat:[6,8],stat:11,state:[1,9,11],statu:[3,11],step:2,stock:[0,2,6,7,8],stop:11,stoplimit:11,stoppx:11,store:4,stori:6,str:[6,7,8,11],stream:[1,2,8],strike:[7,11],strikepric:7,string:[1,7,8,11],strongli:4,submit:[1,2],success:3,summari:11,sun:3,suppl:2,suppli:2,support:[1,2,11],sure:[1,5],svi:11,symbol:[1,6,7,8,11,12],system:9,take:[2,8],term:11,test:5,text:6,than:[2,4,7],thei:4,them:[5,11],thi:[0,1,2,4,5,6,7,8,11],thought:2,thread:[0,3,6,7,8,9],three:[7,11],through:[2,4],tianyu:2,tied:3,til:11,time:[1,3,8,11],timeinforc:11,timeout:[0,1,6,7,8],timesal:[1,8],timestamp:3,timezon:9,token:4,tool:4,topact:8,topgain:8,toplist:[2,8],toplos:8,toppctgain:8,toppctlos:8,topvolum:8,total:11,tpopctgain:8,track:1,trade:[0,1,4,8],trail:11,trailingstop:11,transact:[0,2],transfer:1,traversa:2,trddt:11,treat:11,trigger:11,troubl:2,tsla:8,turn:11,twine:5,txntm:11,txt:11,type:[0,1,2,7,9],type_:11,tzinfo:9,under:11,underli:11,unfortun:8,uniqu:[7,11],unit:[5,11],unixtim:3,unrespons:1,until:9,updat:[1,2,10],upload:5,use:[2,4,5,7,11],use_pct:11,used:[4,8,9,11],usedatetim:7,user:[9,11],using:10,utc:9,util:11,valadez:2,valid:7,valu:[0,2,7],variabl:[1,2],variou:0,venmo:2,veri:[4,11],version:5,view:2,visit:[1,7],wai:[2,4,11,12],wait:1,watchlist:2,web:[2,5],websit:[4,7],welcom:2,well:[5,8,11],when:[5,9],where:11,whether:[0,3,6,7,8],which:[2,4,6,7],whichlist:8,who:2,window:1,withdraw:0,without:11,work:8,wrap:12,wrapper:2,xdate:7,xmonth:7,xxxx:4,xxxxxxxxxxxxxxxxxxxxx:4,xxxxxxxxxxxxxxxxxxxxxxxx:4,xxxxxxxxxxxxxxxxxxxxxxxxx:4,xyear:7,yet:11,yield:8,you:[2,4,5,10,11],your:[1,2,4,5,12],yyyi:7,yyyymmdd:7},titles:["Account","Ally Object","PyAlly Trading Library","Info","Installing","Maintaining","News Searching","Option","Quotes","Rate Limiting","Support","Trading","Watchlists"],titleterms:{"new":6,With:11,account:0,alli:1,cancel:11,chang:11,content:2,contributor:2,creat:5,deal:11,deploi:5,directli:4,document:5,environ:4,featur:2,file:4,first:4,get:4,indic:2,info:3,instal:4,json:4,kei:4,librari:[2,4],limit:9,maintain:5,modifi:11,object:1,open:11,option:[7,11],order:11,outstand:11,overview:[4,11],paramet:11,pass:4,plan:2,price:11,pyalli:2,quot:8,rate:9,releas:5,search:6,step:4,stock:11,submit:11,support:10,tabl:2,trade:[2,11],type:11,updat:5,variabl:4,version:2,view:11,watchlist:12}})
\ No newline at end of file
diff --git a/docs/static/fonts/FontAwesome.otf b/docs/static/fonts/FontAwesome.otf
deleted file mode 100644
index 401ec0f3..00000000
Binary files a/docs/static/fonts/FontAwesome.otf and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Bold.woff b/docs/static/fonts/Roboto-Slab-Bold.woff
deleted file mode 100644
index 6cb60000..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Bold.woff and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Bold.woff2 b/docs/static/fonts/Roboto-Slab-Bold.woff2
deleted file mode 100644
index 7059e231..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Bold.woff2 and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Light.woff b/docs/static/fonts/Roboto-Slab-Light.woff
deleted file mode 100644
index 337d2871..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Light.woff and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Light.woff2 b/docs/static/fonts/Roboto-Slab-Light.woff2
deleted file mode 100644
index 20398aff..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Light.woff2 and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Regular.woff b/docs/static/fonts/Roboto-Slab-Regular.woff
deleted file mode 100644
index f815f63f..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Regular.woff and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Regular.woff2 b/docs/static/fonts/Roboto-Slab-Regular.woff2
deleted file mode 100644
index f2c76e5b..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Regular.woff2 and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Thin.woff b/docs/static/fonts/Roboto-Slab-Thin.woff
deleted file mode 100644
index 6b30ea63..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Thin.woff and /dev/null differ
diff --git a/docs/static/fonts/Roboto-Slab-Thin.woff2 b/docs/static/fonts/Roboto-Slab-Thin.woff2
deleted file mode 100644
index 328f5bb0..00000000
Binary files a/docs/static/fonts/Roboto-Slab-Thin.woff2 and /dev/null differ
diff --git a/docs/static/fonts/lato-bold-italic.woff b/docs/static/fonts/lato-bold-italic.woff
deleted file mode 100644
index 88ad05b9..00000000
Binary files a/docs/static/fonts/lato-bold-italic.woff and /dev/null differ
diff --git a/docs/static/fonts/lato-bold-italic.woff2 b/docs/static/fonts/lato-bold-italic.woff2
deleted file mode 100644
index c4e3d804..00000000
Binary files a/docs/static/fonts/lato-bold-italic.woff2 and /dev/null differ
diff --git a/docs/static/fonts/lato-bold.woff b/docs/static/fonts/lato-bold.woff
deleted file mode 100644
index c6dff51f..00000000
Binary files a/docs/static/fonts/lato-bold.woff and /dev/null differ
diff --git a/docs/static/fonts/lato-bold.woff2 b/docs/static/fonts/lato-bold.woff2
deleted file mode 100644
index bb195043..00000000
Binary files a/docs/static/fonts/lato-bold.woff2 and /dev/null differ
diff --git a/docs/static/fonts/lato-normal-italic.woff b/docs/static/fonts/lato-normal-italic.woff
deleted file mode 100644
index 76114bc0..00000000
Binary files a/docs/static/fonts/lato-normal-italic.woff and /dev/null differ
diff --git a/docs/static/fonts/lato-normal-italic.woff2 b/docs/static/fonts/lato-normal-italic.woff2
deleted file mode 100644
index 3404f37e..00000000
Binary files a/docs/static/fonts/lato-normal-italic.woff2 and /dev/null differ
diff --git a/docs/static/fonts/lato-normal.woff b/docs/static/fonts/lato-normal.woff
deleted file mode 100644
index ae1307ff..00000000
Binary files a/docs/static/fonts/lato-normal.woff and /dev/null differ
diff --git a/docs/static/fonts/lato-normal.woff2 b/docs/static/fonts/lato-normal.woff2
deleted file mode 100644
index 3bf98433..00000000
Binary files a/docs/static/fonts/lato-normal.woff2 and /dev/null differ
diff --git a/docs/static/underscore-1.3.1.js b/docs/static/underscore-1.3.1.js
deleted file mode 100644
index 208d4cd8..00000000
--- a/docs/static/underscore-1.3.1.js
+++ /dev/null
@@ -1,999 +0,0 @@
-//     Underscore.js 1.3.1
-//     (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-//     Underscore is freely distributable under the MIT license.
-//     Portions of Underscore are inspired or borrowed from Prototype,
-//     Oliver Steele's Functional, and John Resig's Micro-Templating.
-//     For all details and documentation:
-//     http://documentcloud.github.com/underscore
-
-(function() {
-
-  // Baseline setup
-  // --------------
-
-  // Establish the root object, `window` in the browser, or `global` on the server.
-  var root = this;
-
-  // Save the previous value of the `_` variable.
-  var previousUnderscore = root._;
-
-  // Establish the object that gets returned to break out of a loop iteration.
-  var breaker = {};
-
-  // Save bytes in the minified (but not gzipped) version:
-  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
-
-  // Create quick reference variables for speed access to core prototypes.
-  var slice            = ArrayProto.slice,
-      unshift          = ArrayProto.unshift,
-      toString         = ObjProto.toString,
-      hasOwnProperty   = ObjProto.hasOwnProperty;
-
-  // All **ECMAScript 5** native function implementations that we hope to use
-  // are declared here.
-  var
-    nativeForEach      = ArrayProto.forEach,
-    nativeMap          = ArrayProto.map,
-    nativeReduce       = ArrayProto.reduce,
-    nativeReduceRight  = ArrayProto.reduceRight,
-    nativeFilter       = ArrayProto.filter,
-    nativeEvery        = ArrayProto.every,
-    nativeSome         = ArrayProto.some,
-    nativeIndexOf      = ArrayProto.indexOf,
-    nativeLastIndexOf  = ArrayProto.lastIndexOf,
-    nativeIsArray      = Array.isArray,
-    nativeKeys         = Object.keys,
-    nativeBind         = FuncProto.bind;
-
-  // Create a safe reference to the Underscore object for use below.
-  var _ = function(obj) { return new wrapper(obj); };
-
-  // Export the Underscore object for **Node.js**, with
-  // backwards-compatibility for the old `require()` API. If we're in
-  // the browser, add `_` as a global object via a string identifier,
-  // for Closure Compiler "advanced" mode.
-  if (typeof exports !== 'undefined') {
-    if (typeof module !== 'undefined' && module.exports) {
-      exports = module.exports = _;
-    }
-    exports._ = _;
-  } else {
-    root['_'] = _;
-  }
-
-  // Current version.
-  _.VERSION = '1.3.1';
-
-  // Collection Functions
-  // --------------------
-
-  // The cornerstone, an `each` implementation, aka `forEach`.
-  // Handles objects with the built-in `forEach`, arrays, and raw objects.
-  // Delegates to **ECMAScript 5**'s native `forEach` if available.
-  var each = _.each = _.forEach = function(obj, iterator, context) {
-    if (obj == null) return;
-    if (nativeForEach && obj.forEach === nativeForEach) {
-      obj.forEach(iterator, context);
-    } else if (obj.length === +obj.length) {
-      for (var i = 0, l = obj.length; i < l; i++) {
-        if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
-      }
-    } else {
-      for (var key in obj) {
-        if (_.has(obj, key)) {
-          if (iterator.call(context, obj[key], key, obj) === breaker) return;
-        }
-      }
-    }
-  };
-
-  // Return the results of applying the iterator to each element.
-  // Delegates to **ECMAScript 5**'s native `map` if available.
-  _.map = _.collect = function(obj, iterator, context) {
-    var results = [];
-    if (obj == null) return results;
-    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
-    each(obj, function(value, index, list) {
-      results[results.length] = iterator.call(context, value, index, list);
-    });
-    if (obj.length === +obj.length) results.length = obj.length;
-    return results;
-  };
-
-  // **Reduce** builds up a single result from a list of values, aka `inject`,
-  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
-  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
-    var initial = arguments.length > 2;
-    if (obj == null) obj = [];
-    if (nativeReduce && obj.reduce === nativeReduce) {
-      if (context) iterator = _.bind(iterator, context);
-      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
-    }
-    each(obj, function(value, index, list) {
-      if (!initial) {
-        memo = value;
-        initial = true;
-      } else {
-        memo = iterator.call(context, memo, value, index, list);
-      }
-    });
-    if (!initial) throw new TypeError('Reduce of empty array with no initial value');
-    return memo;
-  };
-
-  // The right-associative version of reduce, also known as `foldr`.
-  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
-  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
-    var initial = arguments.length > 2;
-    if (obj == null) obj = [];
-    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
-      if (context) iterator = _.bind(iterator, context);
-      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
-    }
-    var reversed = _.toArray(obj).reverse();
-    if (context && !initial) iterator = _.bind(iterator, context);
-    return initial ? _.reduce(reversed, iterator, memo, context) : _.reduce(reversed, iterator);
-  };
-
-  // Return the first value which passes a truth test. Aliased as `detect`.
-  _.find = _.detect = function(obj, iterator, context) {
-    var result;
-    any(obj, function(value, index, list) {
-      if (iterator.call(context, value, index, list)) {
-        result = value;
-        return true;
-      }
-    });
-    return result;
-  };
-
-  // Return all the elements that pass a truth test.
-  // Delegates to **ECMAScript 5**'s native `filter` if available.
-  // Aliased as `select`.
-  _.filter = _.select = function(obj, iterator, context) {
-    var results = [];
-    if (obj == null) return results;
-    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
-    each(obj, function(value, index, list) {
-      if (iterator.call(context, value, index, list)) results[results.length] = value;
-    });
-    return results;
-  };
-
-  // Return all the elements for which a truth test fails.
-  _.reject = function(obj, iterator, context) {
-    var results = [];
-    if (obj == null) return results;
-    each(obj, function(value, index, list) {
-      if (!iterator.call(context, value, index, list)) results[results.length] = value;
-    });
-    return results;
-  };
-
-  // Determine whether all of the elements match a truth test.
-  // Delegates to **ECMAScript 5**'s native `every` if available.
-  // Aliased as `all`.
-  _.every = _.all = function(obj, iterator, context) {
-    var result = true;
-    if (obj == null) return result;
-    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
-    each(obj, function(value, index, list) {
-      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
-    });
-    return result;
-  };
-
-  // Determine if at least one element in the object matches a truth test.
-  // Delegates to **ECMAScript 5**'s native `some` if available.
-  // Aliased as `any`.
-  var any = _.some = _.any = function(obj, iterator, context) {
-    iterator || (iterator = _.identity);
-    var result = false;
-    if (obj == null) return result;
-    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
-    each(obj, function(value, index, list) {
-      if (result || (result = iterator.call(context, value, index, list))) return breaker;
-    });
-    return !!result;
-  };
-
-  // Determine if a given value is included in the array or object using `===`.
-  // Aliased as `contains`.
-  _.include = _.contains = function(obj, target) {
-    var found = false;
-    if (obj == null) return found;
-    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
-    found = any(obj, function(value) {
-      return value === target;
-    });
-    return found;
-  };
-
-  // Invoke a method (with arguments) on every item in a collection.
-  _.invoke = function(obj, method) {
-    var args = slice.call(arguments, 2);
-    return _.map(obj, function(value) {
-      return (_.isFunction(method) ? method || value : value[method]).apply(value, args);
-    });
-  };
-
-  // Convenience version of a common use case of `map`: fetching a property.
-  _.pluck = function(obj, key) {
-    return _.map(obj, function(value){ return value[key]; });
-  };
-
-  // Return the maximum element or (element-based computation).
-  _.max = function(obj, iterator, context) {
-    if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj);
-    if (!iterator && _.isEmpty(obj)) return -Infinity;
-    var result = {computed : -Infinity};
-    each(obj, function(value, index, list) {
-      var computed = iterator ? iterator.call(context, value, index, list) : value;
-      computed >= result.computed && (result = {value : value, computed : computed});
-    });
-    return result.value;
-  };
-
-  // Return the minimum element (or element-based computation).
-  _.min = function(obj, iterator, context) {
-    if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj);
-    if (!iterator && _.isEmpty(obj)) return Infinity;
-    var result = {computed : Infinity};
-    each(obj, function(value, index, list) {
-      var computed = iterator ? iterator.call(context, value, index, list) : value;
-      computed < result.computed && (result = {value : value, computed : computed});
-    });
-    return result.value;
-  };
-
-  // Shuffle an array.
-  _.shuffle = function(obj) {
-    var shuffled = [], rand;
-    each(obj, function(value, index, list) {
-      if (index == 0) {
-        shuffled[0] = value;
-      } else {
-        rand = Math.floor(Math.random() * (index + 1));
-        shuffled[index] = shuffled[rand];
-        shuffled[rand] = value;
-      }
-    });
-    return shuffled;
-  };
-
-  // Sort the object's values by a criterion produced by an iterator.
-  _.sortBy = function(obj, iterator, context) {
-    return _.pluck(_.map(obj, function(value, index, list) {
-      return {
-        value : value,
-        criteria : iterator.call(context, value, index, list)
-      };
-    }).sort(function(left, right) {
-      var a = left.criteria, b = right.criteria;
-      return a < b ? -1 : a > b ? 1 : 0;
-    }), 'value');
-  };
-
-  // Groups the object's values by a criterion. Pass either a string attribute
-  // to group by, or a function that returns the criterion.
-  _.groupBy = function(obj, val) {
-    var result = {};
-    var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; };
-    each(obj, function(value, index) {
-      var key = iterator(value, index);
-      (result[key] || (result[key] = [])).push(value);
-    });
-    return result;
-  };
-
-  // Use a comparator function to figure out at what index an object should
-  // be inserted so as to maintain order. Uses binary search.
-  _.sortedIndex = function(array, obj, iterator) {
-    iterator || (iterator = _.identity);
-    var low = 0, high = array.length;
-    while (low < high) {
-      var mid = (low + high) >> 1;
-      iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid;
-    }
-    return low;
-  };
-
-  // Safely convert anything iterable into a real, live array.
-  _.toArray = function(iterable) {
-    if (!iterable)                return [];
-    if (iterable.toArray)         return iterable.toArray();
-    if (_.isArray(iterable))      return slice.call(iterable);
-    if (_.isArguments(iterable))  return slice.call(iterable);
-    return _.values(iterable);
-  };
-
-  // Return the number of elements in an object.
-  _.size = function(obj) {
-    return _.toArray(obj).length;
-  };
-
-  // Array Functions
-  // ---------------
-
-  // Get the first element of an array. Passing **n** will return the first N
-  // values in the array. Aliased as `head`. The **guard** check allows it to work
-  // with `_.map`.
-  _.first = _.head = function(array, n, guard) {
-    return (n != null) && !guard ? slice.call(array, 0, n) : array[0];
-  };
-
-  // Returns everything but the last entry of the array. Especcialy useful on
-  // the arguments object. Passing **n** will return all the values in
-  // the array, excluding the last N. The **guard** check allows it to work with
-  // `_.map`.
-  _.initial = function(array, n, guard) {
-    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
-  };
-
-  // Get the last element of an array. Passing **n** will return the last N
-  // values in the array. The **guard** check allows it to work with `_.map`.
-  _.last = function(array, n, guard) {
-    if ((n != null) && !guard) {
-      return slice.call(array, Math.max(array.length - n, 0));
-    } else {
-      return array[array.length - 1];
-    }
-  };
-
-  // Returns everything but the first entry of the array. Aliased as `tail`.
-  // Especially useful on the arguments object. Passing an **index** will return
-  // the rest of the values in the array from that index onward. The **guard**
-  // check allows it to work with `_.map`.
-  _.rest = _.tail = function(array, index, guard) {
-    return slice.call(array, (index == null) || guard ? 1 : index);
-  };
-
-  // Trim out all falsy values from an array.
-  _.compact = function(array) {
-    return _.filter(array, function(value){ return !!value; });
-  };
-
-  // Return a completely flattened version of an array.
-  _.flatten = function(array, shallow) {
-    return _.reduce(array, function(memo, value) {
-      if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value));
-      memo[memo.length] = value;
-      return memo;
-    }, []);
-  };
-
-  // Return a version of the array that does not contain the specified value(s).
-  _.without = function(array) {
-    return _.difference(array, slice.call(arguments, 1));
-  };
-
-  // Produce a duplicate-free version of the array. If the array has already
-  // been sorted, you have the option of using a faster algorithm.
-  // Aliased as `unique`.
-  _.uniq = _.unique = function(array, isSorted, iterator) {
-    var initial = iterator ? _.map(array, iterator) : array;
-    var result = [];
-    _.reduce(initial, function(memo, el, i) {
-      if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) {
-        memo[memo.length] = el;
-        result[result.length] = array[i];
-      }
-      return memo;
-    }, []);
-    return result;
-  };
-
-  // Produce an array that contains the union: each distinct element from all of
-  // the passed-in arrays.
-  _.union = function() {
-    return _.uniq(_.flatten(arguments, true));
-  };
-
-  // Produce an array that contains every item shared between all the
-  // passed-in arrays. (Aliased as "intersect" for back-compat.)
-  _.intersection = _.intersect = function(array) {
-    var rest = slice.call(arguments, 1);
-    return _.filter(_.uniq(array), function(item) {
-      return _.every(rest, function(other) {
-        return _.indexOf(other, item) >= 0;
-      });
-    });
-  };
-
-  // Take the difference between one array and a number of other arrays.
-  // Only the elements present in just the first array will remain.
-  _.difference = function(array) {
-    var rest = _.flatten(slice.call(arguments, 1));
-    return _.filter(array, function(value){ return !_.include(rest, value); });
-  };
-
-  // Zip together multiple lists into a single array -- elements that share
-  // an index go together.
-  _.zip = function() {
-    var args = slice.call(arguments);
-    var length = _.max(_.pluck(args, 'length'));
-    var results = new Array(length);
-    for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i);
-    return results;
-  };
-
-  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
-  // we need this function. Return the position of the first occurrence of an
-  // item in an array, or -1 if the item is not included in the array.
-  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
-  // If the array is large and already in sort order, pass `true`
-  // for **isSorted** to use binary search.
-  _.indexOf = function(array, item, isSorted) {
-    if (array == null) return -1;
-    var i, l;
-    if (isSorted) {
-      i = _.sortedIndex(array, item);
-      return array[i] === item ? i : -1;
-    }
-    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item);
-    for (i = 0, l = array.length; i < l; i++) if (i in array && array[i] === item) return i;
-    return -1;
-  };
-
-  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
-  _.lastIndexOf = function(array, item) {
-    if (array == null) return -1;
-    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item);
-    var i = array.length;
-    while (i--) if (i in array && array[i] === item) return i;
-    return -1;
-  };
-
-  // Generate an integer Array containing an arithmetic progression. A port of
-  // the native Python `range()` function. See
-  // [the Python documentation](http://docs.python.org/library/functions.html#range).
-  _.range = function(start, stop, step) {
-    if (arguments.length <= 1) {
-      stop = start || 0;
-      start = 0;
-    }
-    step = arguments[2] || 1;
-
-    var len = Math.max(Math.ceil((stop - start) / step), 0);
-    var idx = 0;
-    var range = new Array(len);
-
-    while(idx < len) {
-      range[idx++] = start;
-      start += step;
-    }
-
-    return range;
-  };
-
-  // Function (ahem) Functions
-  // ------------------
-
-  // Reusable constructor function for prototype setting.
-  var ctor = function(){};
-
-  // Create a function bound to a given object (assigning `this`, and arguments,
-  // optionally). Binding with arguments is also known as `curry`.
-  // Delegates to **ECMAScript 5**'s native `Function.bind` if available.
-  // We check for `func.bind` first, to fail fast when `func` is undefined.
-  _.bind = function bind(func, context) {
-    var bound, args;
-    if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
-    if (!_.isFunction(func)) throw new TypeError;
-    args = slice.call(arguments, 2);
-    return bound = function() {
-      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
-      ctor.prototype = func.prototype;
-      var self = new ctor;
-      var result = func.apply(self, args.concat(slice.call(arguments)));
-      if (Object(result) === result) return result;
-      return self;
-    };
-  };
-
-  // Bind all of an object's methods to that object. Useful for ensuring that
-  // all callbacks defined on an object belong to it.
-  _.bindAll = function(obj) {
-    var funcs = slice.call(arguments, 1);
-    if (funcs.length == 0) funcs = _.functions(obj);
-    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
-    return obj;
-  };
-
-  // Memoize an expensive function by storing its results.
-  _.memoize = function(func, hasher) {
-    var memo = {};
-    hasher || (hasher = _.identity);
-    return function() {
-      var key = hasher.apply(this, arguments);
-      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
-    };
-  };
-
-  // Delays a function for the given number of milliseconds, and then calls
-  // it with the arguments supplied.
-  _.delay = function(func, wait) {
-    var args = slice.call(arguments, 2);
-    return setTimeout(function(){ return func.apply(func, args); }, wait);
-  };
-
-  // Defers a function, scheduling it to run after the current call stack has
-  // cleared.
-  _.defer = function(func) {
-    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
-  };
-
-  // Returns a function, that, when invoked, will only be triggered at most once
-  // during a given window of time.
-  _.throttle = function(func, wait) {
-    var context, args, timeout, throttling, more;
-    var whenDone = _.debounce(function(){ more = throttling = false; }, wait);
-    return function() {
-      context = this; args = arguments;
-      var later = function() {
-        timeout = null;
-        if (more) func.apply(context, args);
-        whenDone();
-      };
-      if (!timeout) timeout = setTimeout(later, wait);
-      if (throttling) {
-        more = true;
-      } else {
-        func.apply(context, args);
-      }
-      whenDone();
-      throttling = true;
-    };
-  };
-
-  // Returns a function, that, as long as it continues to be invoked, will not
-  // be triggered. The function will be called after it stops being called for
-  // N milliseconds.
-  _.debounce = function(func, wait) {
-    var timeout;
-    return function() {
-      var context = this, args = arguments;
-      var later = function() {
-        timeout = null;
-        func.apply(context, args);
-      };
-      clearTimeout(timeout);
-      timeout = setTimeout(later, wait);
-    };
-  };
-
-  // Returns a function that will be executed at most one time, no matter how
-  // often you call it. Useful for lazy initialization.
-  _.once = function(func) {
-    var ran = false, memo;
-    return function() {
-      if (ran) return memo;
-      ran = true;
-      return memo = func.apply(this, arguments);
-    };
-  };
-
-  // Returns the first function passed as an argument to the second,
-  // allowing you to adjust arguments, run code before and after, and
-  // conditionally execute the original function.
-  _.wrap = function(func, wrapper) {
-    return function() {
-      var args = [func].concat(slice.call(arguments, 0));
-      return wrapper.apply(this, args);
-    };
-  };
-
-  // Returns a function that is the composition of a list of functions, each
-  // consuming the return value of the function that follows.
-  _.compose = function() {
-    var funcs = arguments;
-    return function() {
-      var args = arguments;
-      for (var i = funcs.length - 1; i >= 0; i--) {
-        args = [funcs[i].apply(this, args)];
-      }
-      return args[0];
-    };
-  };
-
-  // Returns a function that will only be executed after being called N times.
-  _.after = function(times, func) {
-    if (times <= 0) return func();
-    return function() {
-      if (--times < 1) { return func.apply(this, arguments); }
-    };
-  };
-
-  // Object Functions
-  // ----------------
-
-  // Retrieve the names of an object's properties.
-  // Delegates to **ECMAScript 5**'s native `Object.keys`
-  _.keys = nativeKeys || function(obj) {
-    if (obj !== Object(obj)) throw new TypeError('Invalid object');
-    var keys = [];
-    for (var key in obj) if (_.has(obj, key)) keys[keys.length] = key;
-    return keys;
-  };
-
-  // Retrieve the values of an object's properties.
-  _.values = function(obj) {
-    return _.map(obj, _.identity);
-  };
-
-  // Return a sorted list of the function names available on the object.
-  // Aliased as `methods`
-  _.functions = _.methods = function(obj) {
-    var names = [];
-    for (var key in obj) {
-      if (_.isFunction(obj[key])) names.push(key);
-    }
-    return names.sort();
-  };
-
-  // Extend a given object with all the properties in passed-in object(s).
-  _.extend = function(obj) {
-    each(slice.call(arguments, 1), function(source) {
-      for (var prop in source) {
-        obj[prop] = source[prop];
-      }
-    });
-    return obj;
-  };
-
-  // Fill in a given object with default properties.
-  _.defaults = function(obj) {
-    each(slice.call(arguments, 1), function(source) {
-      for (var prop in source) {
-        if (obj[prop] == null) obj[prop] = source[prop];
-      }
-    });
-    return obj;
-  };
-
-  // Create a (shallow-cloned) duplicate of an object.
-  _.clone = function(obj) {
-    if (!_.isObject(obj)) return obj;
-    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
-  };
-
-  // Invokes interceptor with the obj, and then returns obj.
-  // The primary purpose of this method is to "tap into" a method chain, in
-  // order to perform operations on intermediate results within the chain.
-  _.tap = function(obj, interceptor) {
-    interceptor(obj);
-    return obj;
-  };
-
-  // Internal recursive comparison function.
-  function eq(a, b, stack) {
-    // Identical objects are equal. `0 === -0`, but they aren't identical.
-    // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal.
-    if (a === b) return a !== 0 || 1 / a == 1 / b;
-    // A strict comparison is necessary because `null == undefined`.
-    if (a == null || b == null) return a === b;
-    // Unwrap any wrapped objects.
-    if (a._chain) a = a._wrapped;
-    if (b._chain) b = b._wrapped;
-    // Invoke a custom `isEqual` method if one is provided.
-    if (a.isEqual && _.isFunction(a.isEqual)) return a.isEqual(b);
-    if (b.isEqual && _.isFunction(b.isEqual)) return b.isEqual(a);
-    // Compare `[[Class]]` names.
-    var className = toString.call(a);
-    if (className != toString.call(b)) return false;
-    switch (className) {
-      // Strings, numbers, dates, and booleans are compared by value.
-      case '[object String]':
-        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
-        // equivalent to `new String("5")`.
-        return a == String(b);
-      case '[object Number]':
-        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
-        // other numeric values.
-        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
-      case '[object Date]':
-      case '[object Boolean]':
-        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
-        // millisecond representations. Note that invalid dates with millisecond representations
-        // of `NaN` are not equivalent.
-        return +a == +b;
-      // RegExps are compared by their source patterns and flags.
-      case '[object RegExp]':
-        return a.source == b.source &&
-               a.global == b.global &&
-               a.multiline == b.multiline &&
-               a.ignoreCase == b.ignoreCase;
-    }
-    if (typeof a != 'object' || typeof b != 'object') return false;
-    // Assume equality for cyclic structures. The algorithm for detecting cyclic
-    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
-    var length = stack.length;
-    while (length--) {
-      // Linear search. Performance is inversely proportional to the number of
-      // unique nested structures.
-      if (stack[length] == a) return true;
-    }
-    // Add the first object to the stack of traversed objects.
-    stack.push(a);
-    var size = 0, result = true;
-    // Recursively compare objects and arrays.
-    if (className == '[object Array]') {
-      // Compare array lengths to determine if a deep comparison is necessary.
-      size = a.length;
-      result = size == b.length;
-      if (result) {
-        // Deep compare the contents, ignoring non-numeric properties.
-        while (size--) {
-          // Ensure commutative equality for sparse arrays.
-          if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break;
-        }
-      }
-    } else {
-      // Objects with different constructors are not equivalent.
-      if ('constructor' in a != 'constructor' in b || a.constructor != b.constructor) return false;
-      // Deep compare objects.
-      for (var key in a) {
-        if (_.has(a, key)) {
-          // Count the expected number of properties.
-          size++;
-          // Deep compare each member.
-          if (!(result = _.has(b, key) && eq(a[key], b[key], stack))) break;
-        }
-      }
-      // Ensure that both objects contain the same number of properties.
-      if (result) {
-        for (key in b) {
-          if (_.has(b, key) && !(size--)) break;
-        }
-        result = !size;
-      }
-    }
-    // Remove the first object from the stack of traversed objects.
-    stack.pop();
-    return result;
-  }
-
-  // Perform a deep comparison to check if two objects are equal.
-  _.isEqual = function(a, b) {
-    return eq(a, b, []);
-  };
-
-  // Is a given array, string, or object empty?
-  // An "empty" object has no enumerable own-properties.
-  _.isEmpty = function(obj) {
-    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
-    for (var key in obj) if (_.has(obj, key)) return false;
-    return true;
-  };
-
-  // Is a given value a DOM element?
-  _.isElement = function(obj) {
-    return !!(obj && obj.nodeType == 1);
-  };
-
-  // Is a given value an array?
-  // Delegates to ECMA5's native Array.isArray
-  _.isArray = nativeIsArray || function(obj) {
-    return toString.call(obj) == '[object Array]';
-  };
-
-  // Is a given variable an object?
-  _.isObject = function(obj) {
-    return obj === Object(obj);
-  };
-
-  // Is a given variable an arguments object?
-  _.isArguments = function(obj) {
-    return toString.call(obj) == '[object Arguments]';
-  };
-  if (!_.isArguments(arguments)) {
-    _.isArguments = function(obj) {
-      return !!(obj && _.has(obj, 'callee'));
-    };
-  }
-
-  // Is a given value a function?
-  _.isFunction = function(obj) {
-    return toString.call(obj) == '[object Function]';
-  };
-
-  // Is a given value a string?
-  _.isString = function(obj) {
-    return toString.call(obj) == '[object String]';
-  };
-
-  // Is a given value a number?
-  _.isNumber = function(obj) {
-    return toString.call(obj) == '[object Number]';
-  };
-
-  // Is the given value `NaN`?
-  _.isNaN = function(obj) {
-    // `NaN` is the only value for which `===` is not reflexive.
-    return obj !== obj;
-  };
-
-  // Is a given value a boolean?
-  _.isBoolean = function(obj) {
-    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
-  };
-
-  // Is a given value a date?
-  _.isDate = function(obj) {
-    return toString.call(obj) == '[object Date]';
-  };
-
-  // Is the given value a regular expression?
-  _.isRegExp = function(obj) {
-    return toString.call(obj) == '[object RegExp]';
-  };
-
-  // Is a given value equal to null?
-  _.isNull = function(obj) {
-    return obj === null;
-  };
-
-  // Is a given variable undefined?
-  _.isUndefined = function(obj) {
-    return obj === void 0;
-  };
-
-  // Has own property?
-  _.has = function(obj, key) {
-    return hasOwnProperty.call(obj, key);
-  };
-
-  // Utility Functions
-  // -----------------
-
-  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
-  // previous owner. Returns a reference to the Underscore object.
-  _.noConflict = function() {
-    root._ = previousUnderscore;
-    return this;
-  };
-
-  // Keep the identity function around for default iterators.
-  _.identity = function(value) {
-    return value;
-  };
-
-  // Run a function **n** times.
-  _.times = function (n, iterator, context) {
-    for (var i = 0; i < n; i++) iterator.call(context, i);
-  };
-
-  // Escape a string for HTML interpolation.
-  _.escape = function(string) {
-    return (''+string).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#x27;').replace(/\//g,'&#x2F;');
-  };
-
-  // Add your own custom functions to the Underscore object, ensuring that
-  // they're correctly added to the OOP wrapper as well.
-  _.mixin = function(obj) {
-    each(_.functions(obj), function(name){
-      addToWrapper(name, _[name] = obj[name]);
-    });
-  };
-
-  // Generate a unique integer id (unique within the entire client session).
-  // Useful for temporary DOM ids.
-  var idCounter = 0;
-  _.uniqueId = function(prefix) {
-    var id = idCounter++;
-    return prefix ? prefix + id : id;
-  };
-
-  // By default, Underscore uses ERB-style template delimiters, change the
-  // following template settings to use alternative delimiters.
-  _.templateSettings = {
-    evaluate    : /<%([\s\S]+?)%>/g,
-    interpolate : /<%=([\s\S]+?)%>/g,
-    escape      : /<%-([\s\S]+?)%>/g
-  };
-
-  // When customizing `templateSettings`, if you don't want to define an
-  // interpolation, evaluation or escaping regex, we need one that is
-  // guaranteed not to match.
-  var noMatch = /.^/;
-
-  // Within an interpolation, evaluation, or escaping, remove HTML escaping
-  // that had been previously added.
-  var unescape = function(code) {
-    return code.replace(/\\\\/g, '\\').replace(/\\'/g, "'");
-  };
-
-  // JavaScript micro-templating, similar to John Resig's implementation.
-  // Underscore templating handles arbitrary delimiters, preserves whitespace,
-  // and correctly escapes quotes within interpolated code.
-  _.template = function(str, data) {
-    var c  = _.templateSettings;
-    var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' +
-      'with(obj||{}){__p.push(\'' +
-      str.replace(/\\/g, '\\\\')
-         .replace(/'/g, "\\'")
-         .replace(c.escape || noMatch, function(match, code) {
-           return "',_.escape(" + unescape(code) + "),'";
-         })
-         .replace(c.interpolate || noMatch, function(match, code) {
-           return "'," + unescape(code) + ",'";
-         })
-         .replace(c.evaluate || noMatch, function(match, code) {
-           return "');" + unescape(code).replace(/[\r\n\t]/g, ' ') + ";__p.push('";
-         })
-         .replace(/\r/g, '\\r')
-         .replace(/\n/g, '\\n')
-         .replace(/\t/g, '\\t')
-         + "');}return __p.join('');";
-    var func = new Function('obj', '_', tmpl);
-    if (data) return func(data, _);
-    return function(data) {
-      return func.call(this, data, _);
-    };
-  };
-
-  // Add a "chain" function, which will delegate to the wrapper.
-  _.chain = function(obj) {
-    return _(obj).chain();
-  };
-
-  // The OOP Wrapper
-  // ---------------
-
-  // If Underscore is called as a function, it returns a wrapped object that
-  // can be used OO-style. This wrapper holds altered versions of all the
-  // underscore functions. Wrapped objects may be chained.
-  var wrapper = function(obj) { this._wrapped = obj; };
-
-  // Expose `wrapper.prototype` as `_.prototype`
-  _.prototype = wrapper.prototype;
-
-  // Helper function to continue chaining intermediate results.
-  var result = function(obj, chain) {
-    return chain ? _(obj).chain() : obj;
-  };
-
-  // A method to easily add functions to the OOP wrapper.
-  var addToWrapper = function(name, func) {
-    wrapper.prototype[name] = function() {
-      var args = slice.call(arguments);
-      unshift.call(args, this._wrapped);
-      return result(func.apply(_, args), this._chain);
-    };
-  };
-
-  // Add all of the Underscore functions to the wrapper object.
-  _.mixin(_);
-
-  // Add all mutator Array functions to the wrapper.
-  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
-    var method = ArrayProto[name];
-    wrapper.prototype[name] = function() {
-      var wrapped = this._wrapped;
-      method.apply(wrapped, arguments);
-      var length = wrapped.length;
-      if ((name == 'shift' || name == 'splice') && length === 0) delete wrapped[0];
-      return result(wrapped, this._chain);
-    };
-  });
-
-  // Add all accessor Array functions to the wrapper.
-  each(['concat', 'join', 'slice'], function(name) {
-    var method = ArrayProto[name];
-    wrapper.prototype[name] = function() {
-      return result(method.apply(this._wrapped, arguments), this._chain);
-    };
-  });
-
-  // Start chaining a wrapped Underscore object.
-  wrapper.prototype.chain = function() {
-    this._chain = true;
-    return this;
-  };
-
-  // Extracts the result from a wrapped and chained object.
-  wrapper.prototype.value = function() {
-    return this._wrapped;
-  };
-
-}).call(this);
diff --git a/docs/static/underscore.js b/docs/static/underscore.js
deleted file mode 100644
index 5b55f32b..00000000
--- a/docs/static/underscore.js
+++ /dev/null
@@ -1,31 +0,0 @@
-// Underscore.js 1.3.1
-// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
-// Underscore is freely distributable under the MIT license.
-// Portions of Underscore are inspired or borrowed from Prototype,
-// Oliver Steele's Functional, and John Resig's Micro-Templating.
-// For all details and documentation:
-// http://documentcloud.github.com/underscore
-(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
-c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
-h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
-b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
-null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
-function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
-e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
-function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
-return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
-c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
-b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
-return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
-d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
-var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
-c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
-a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
-b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
-1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
-b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
-b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
-function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
-u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
-function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
-true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
diff --git a/docs/support.html b/docs/support.html
index 79c25508..e12a6ae2 100644
--- a/docs/support.html
+++ b/docs/support.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Support &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Support &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/support.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -161,10 +164,8 @@
             
   <div class="section" id="support">
 <h1>Support<a class="headerlink" href="#support" title="Permalink to this headline">¶</a></h1>
-<p>If you find issues or need help with using the project, please check to see if there’s an open
-issue on <a class="reference external" href="https://github.com/alienbrett/PyAlly/issues">Github</a>, and if not, open a new issue on the page.</p>
-<p>The community is pretty active and hopefully there will be someone to answer,
-but feel free to <a class="reference external" href="mailto:alienbrett648&#37;&#52;&#48;gmail&#46;com">send me an email</a> and I’ll get back with an update as soon as I can.</p>
+<p>If you find issues or need help with using the project, please check to see if there’s an open issue on <a class="reference external" href="https://github.com/mm0/PyAlly/issues">Github</a>, and if not, open a new issue on the page.</p>
+<p>The community is pretty active and hopefully there will be someone to answer, but feel free to <a class="reference external" href="mailto:alienbrett648&#37;&#52;&#48;gmail&#46;com">send me an email</a> and I’ll get back with an update as soon as I can.</p>
 </div>
 
 
@@ -172,37 +173,29 @@ <h1>Support<a class="headerlink" href="#support" title="Permalink to this headli
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="maintaining.html" class="btn btn-neutral float-right" title="Maintaining" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="info.html" class="btn btn-neutral float-left" title="Info" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="maintaining.html" class="btn btn-neutral float-right" title="Maintaining" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="info.html" class="btn btn-neutral float-left" title="Info" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/trading.html b/docs/trading.html
index 4c73f72c..f18a8116 100644
--- a/docs/trading.html
+++ b/docs/trading.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Trading &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Trading &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -143,6 +146,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -154,8 +159,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/trading.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -181,8 +184,7 @@ <h2>Overview<a class="headerlink" href="#overview" title="Permalink to this head
 <li><p>Time</p></li>
 <li><p>Symbol</p></li>
 </ul>
-<p>The parameters can be provided all at once on object instantiation, or any of the orders can be
-set or modifed before submitting.</p>
+<p>The parameters can be provided all at once on object instantiation, or any of the orders can be set or modifed before submitting.</p>
 </div>
 <div class="section" id="submit-a-stock-order">
 <h2>Submit a Stock Order<a class="headerlink" href="#submit-a-stock-order" title="Permalink to this headline">¶</a></h2>
@@ -219,11 +221,11 @@ <h2>Submit a Stock Order<a class="headerlink" href="#submit-a-stock-order" title
 </div>
 <p>Order information can be passed to the class on instantiation. Notice that any or all fields can be None, and added later.</p>
 <dl class="py class">
-<dt id="ally.Order.Order">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">Order</code><span class="sig-paren">(</span><em class="sig-param">buysell: Optional[str] = None</em>, <em class="sig-param">symbol: Optional[str] = None</em>, <em class="sig-param">price=None</em>, <em class="sig-param">qty: Optional[int] = None</em>, <em class="sig-param">time: Optional[int] = None</em>, <em class="sig-param">account=None</em>, <em class="sig-param">type_=&lt;OType.Order: 1&gt;</em>, <em class="sig-param">orderid=None</em>, <em class="sig-param">fixml=None</em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order" title="Permalink to this definition">¶</a></dt>
+<dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">Order</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">buysell:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">symbol:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">price=None</span></em>, <em class="sig-param"><span class="pre">qty:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">time:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">account=None</span></em>, <em class="sig-param"><span class="pre">type_=&lt;OType.Order:</span> <span class="pre">1&gt;</span></em>, <em class="sig-param"><span class="pre">orderid=None</span></em>, <em class="sig-param"><span class="pre">fixml=None</span></em><span class="sig-paren">)</span></dt>
 <dd><dl class="py method">
-<dt id="ally.Order.Order.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param">buysell: Optional[str] = None</em>, <em class="sig-param">symbol: Optional[str] = None</em>, <em class="sig-param">price=None</em>, <em class="sig-param">qty: Optional[int] = None</em>, <em class="sig-param">time: Optional[int] = None</em>, <em class="sig-param">account=None</em>, <em class="sig-param">type_=&lt;OType.Order: 1&gt;</em>, <em class="sig-param">orderid=None</em>, <em class="sig-param">fixml=None</em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.__init__" title="Permalink to this definition">¶</a></dt>
+<dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">buysell:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">symbol:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">price=None</span></em>, <em class="sig-param"><span class="pre">qty:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">time:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">account=None</span></em>, <em class="sig-param"><span class="pre">type_=&lt;OType.Order:</span> <span class="pre">1&gt;</span></em>, <em class="sig-param"><span class="pre">orderid=None</span></em>, <em class="sig-param"><span class="pre">fixml=None</span></em><span class="sig-paren">)</span></dt>
 <dd><p>Creates an order.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
@@ -280,24 +282,24 @@ <h2>Viewing Open Orders<a class="headerlink" href="#viewing-open-orders" title="
 </ul>
 <p>The full class documentation:</p>
 <dl class="py class">
-<dt id="id0">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">Order</code><span class="sig-paren">(</span><em class="sig-param">buysell: Optional[str] = None</em>, <em class="sig-param">symbol: Optional[str] = None</em>, <em class="sig-param">price=None</em>, <em class="sig-param">qty: Optional[int] = None</em>, <em class="sig-param">time: Optional[int] = None</em>, <em class="sig-param">account=None</em>, <em class="sig-param">type_=&lt;OType.Order: 1&gt;</em>, <em class="sig-param">orderid=None</em>, <em class="sig-param">fixml=None</em><span class="sig-paren">)</span><a class="headerlink" href="#id0" title="Permalink to this definition">¶</a></dt>
+<dt id="ally.Order.Order">
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">Order</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">buysell:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">symbol:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">price=None</span></em>, <em class="sig-param"><span class="pre">qty:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">time:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">account=None</span></em>, <em class="sig-param"><span class="pre">type_=&lt;OType.Order:</span> <span class="pre">1&gt;</span></em>, <em class="sig-param"><span class="pre">orderid=None</span></em>, <em class="sig-param"><span class="pre">fixml=None</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order" title="Permalink to this definition">¶</a></dt>
 <dd><dl class="py method">
 <dt id="ally.Order.Order.convert_buysell">
-<em class="property">property </em><code class="sig-name descname">convert_buysell</code><a class="headerlink" href="#ally.Order.Order.convert_buysell" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">property</span> </em><code class="sig-name descname"><span class="pre">convert_buysell</span></code><a class="headerlink" href="#ally.Order.Order.convert_buysell" title="Permalink to this definition">¶</a></dt>
 <dd><p>Turns buysell type into string.</p>
 </dd></dl>
 
 <dl class="py method">
 <dt id="ally.Order.Order.fixml">
-<em class="property">property </em><code class="sig-name descname">fixml</code><a class="headerlink" href="#ally.Order.Order.fixml" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">property</span> </em><code class="sig-name descname"><span class="pre">fixml</span></code><a class="headerlink" href="#ally.Order.Order.fixml" title="Permalink to this definition">¶</a></dt>
 <dd><p>Compiles the object into FIXML string.</p>
 <p>Does not affect internal state of object</p>
 </dd></dl>
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_account">
-<code class="sig-name descname">set_account</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">account</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_account" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_account</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">account</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_account" title="Permalink to this definition">¶</a></dt>
 <dd><p>Specifies the account used to execute an order.</p>
 <p>Users shouldn’t really need to use this under normal circumstances, this
 is handled by the ally object.</p>
@@ -306,7 +308,7 @@ <h2>Viewing Open Orders<a class="headerlink" href="#viewing-open-orders" title="
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_buysell">
-<code class="sig-name descname">set_buysell</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">buysell</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_buysell" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_buysell</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">buysell</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_buysell" title="Permalink to this definition">¶</a></dt>
 <dd><p>Specify the side of this order.</p>
 <p>Can be viewed at obj.buysell</p>
 <dl class="field-list simple">
@@ -319,14 +321,14 @@ <h2>Viewing Open Orders<a class="headerlink" href="#viewing-open-orders" title="
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_orderid">
-<code class="sig-name descname">set_orderid</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">orderid</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_orderid" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_orderid</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">orderid</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_orderid" title="Permalink to this definition">¶</a></dt>
 <dd><p>Specifies the order’s ID.</p>
 <p>Can be viewed at obj.orderid</p>
 </dd></dl>
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_pricing">
-<code class="sig-name descname">set_pricing</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">priceobj</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_pricing" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_pricing</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">priceobj</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_pricing" title="Permalink to this definition">¶</a></dt>
 <dd><p>Sets the pricing information of an order.</p>
 <p>Can be viewed at obj.pricing</p>
 <dl class="field-list simple">
@@ -343,21 +345,21 @@ <h2>Viewing Open Orders<a class="headerlink" href="#viewing-open-orders" title="
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_quantity">
-<code class="sig-name descname">set_quantity</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">qty</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_quantity" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_quantity</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">qty</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_quantity" title="Permalink to this definition">¶</a></dt>
 <dd><p>Sets the order quantity.</p>
 <p>Can be viewed at obj.quantity</p>
 </dd></dl>
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_symbol">
-<code class="sig-name descname">set_symbol</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbol</span><span class="p">:</span> <span class="n">str</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_symbol" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_symbol</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbol</span></span><span class="p"><span class="pre">:</span></span> <span class="n"><span class="pre">str</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_symbol" title="Permalink to this definition">¶</a></dt>
 <dd><p>Sets the order’s instrument.</p>
 <p>Can be viewed at obj.instrument</p>
 </dd></dl>
 
 <dl class="py method">
 <dt id="ally.Order.Order.set_time">
-<code class="sig-name descname">set_time</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">time</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_time" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">set_time</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">time</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Order.set_time" title="Permalink to this definition">¶</a></dt>
 <dd><p>Sets the order’s time-in-force.</p>
 <p>Can be viewed at obj.time</p>
 <dl class="field-list simple">
@@ -369,7 +371,7 @@ <h2>Viewing Open Orders<a class="headerlink" href="#viewing-open-orders" title="
 
 <dl class="py method">
 <dt id="ally.Order.Order.status">
-<em class="property">property </em><code class="sig-name descname">status</code><a class="headerlink" href="#ally.Order.Order.status" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">property</span> </em><code class="sig-name descname"><span class="pre">status</span></code><a class="headerlink" href="#ally.Order.Order.status" title="Permalink to this definition">¶</a></dt>
 <dd><p>Execution status of this order.</p>
 <p>None implies that this order hasn’t been submitted for execution yet.</p>
 </dd></dl>
@@ -379,12 +381,10 @@ <h2>Viewing Open Orders<a class="headerlink" href="#viewing-open-orders" title="
 </div>
 <div class="section" id="dealing-with-options">
 <h2>Dealing With Options<a class="headerlink" href="#dealing-with-options" title="Permalink to this headline">¶</a></h2>
-<p>The only difference between how stocks and options must be handled, is that the option contract
-must be changed into its standard OCC symbol first. Then the option can be treated like any other stock, in every other feature.
-The <code class="docutils literal notranslate"><span class="pre">ally.utils.option_format</span></code> function formats the options’s unique OCC symbol from its parameters:</p>
+<p>The only difference between how stocks and options must be handled, is that the option contract must be changed into its standard OCC symbol first. Then the option can be treated like any other stock, in every other feature. The <code class="docutils literal notranslate"><span class="pre">ally.utils.option_format</span></code> function formats the options’s unique OCC symbol from its parameters:</p>
 <dl class="py function">
 <dt id="ally.utils.option_format">
-<code class="sig-prename descclassname">ally.utils.</code><code class="sig-name descname">option_format</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">symbol</span><span class="o">=</span><span class="default_value">''</span></em>, <em class="sig-param"><span class="n">exp_date</span><span class="o">=</span><span class="default_value">'1970-01-01'</span></em>, <em class="sig-param"><span class="n">strike</span><span class="o">=</span><span class="default_value">0</span></em>, <em class="sig-param"><span class="n">direction</span><span class="o">=</span><span class="default_value">''</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.utils.option_format" title="Permalink to this definition">¶</a></dt>
+<code class="sig-prename descclassname"><span class="pre">ally.utils.</span></code><code class="sig-name descname"><span class="pre">option_format</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">symbol</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">exp_date</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'1970-01-01'</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">strike</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">0</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">direction</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">''</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.utils.option_format" title="Permalink to this definition">¶</a></dt>
 <dd><p>Returns the OCC standardized option name.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
@@ -414,8 +414,7 @@ <h2>Dealing With Options<a class="headerlink" href="#dealing-with-options" title
 </dd></dl>
 
 <p>This symbol can now be traded, same as any other stock or option.</p>
-<p>Short sell 1 contract (with contract size 100 shares) of the IBM call specified above,
-limit at $18, good-til-cancelled.</p>
+<p>Short sell 1 contract (with contract size 100 shares) of the IBM call specified above, limit at $18, good-til-cancelled.</p>
 <div class="highlight-python notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="n">o</span> <span class="o">=</span> <span class="n">ally</span><span class="o">.</span><span class="n">Order</span><span class="o">.</span><span class="n">Order</span><span class="p">(</span>
 <span class="go">        buysell = &#39;sellshort&#39;,</span>
 <span class="go">        symbol = ibm_call,</span>
@@ -448,10 +447,10 @@ <h2>Changing Order Parameters<a class="headerlink" href="#changing-order-paramet
 <p>Any of these functions can be used to modify the order’s parameters:</p>
 <dl class="py class">
 <dt>
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">Order</code><span class="sig-paren">(</span><em class="sig-param">buysell: Optional[str] = None</em>, <em class="sig-param">symbol: Optional[str] = None</em>, <em class="sig-param">price=None</em>, <em class="sig-param">qty: Optional[int] = None</em>, <em class="sig-param">time: Optional[int] = None</em>, <em class="sig-param">account=None</em>, <em class="sig-param">type_=&lt;OType.Order: 1&gt;</em>, <em class="sig-param">orderid=None</em>, <em class="sig-param">fixml=None</em><span class="sig-paren">)</span></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">Order</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="pre">buysell:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">symbol:</span> <span class="pre">Optional[str]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">price=None</span></em>, <em class="sig-param"><span class="pre">qty:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">time:</span> <span class="pre">Optional[int]</span> <span class="pre">=</span> <span class="pre">None</span></em>, <em class="sig-param"><span class="pre">account=None</span></em>, <em class="sig-param"><span class="pre">type_=&lt;OType.Order:</span> <span class="pre">1&gt;</span></em>, <em class="sig-param"><span class="pre">orderid=None</span></em>, <em class="sig-param"><span class="pre">fixml=None</span></em><span class="sig-paren">)</span></dt>
 <dd><dl class="py method">
 <dt>
-<code class="sig-name descname">set_buysell</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">buysell</span></em><span class="sig-paren">)</span></dt>
+<code class="sig-name descname"><span class="pre">set_buysell</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">buysell</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Specify the side of this order.</p>
 <p>Can be viewed at obj.buysell</p>
 <dl class="field-list simple">
@@ -464,14 +463,14 @@ <h2>Changing Order Parameters<a class="headerlink" href="#changing-order-paramet
 
 <dl class="py method">
 <dt>
-<code class="sig-name descname">set_orderid</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">orderid</span></em><span class="sig-paren">)</span></dt>
+<code class="sig-name descname"><span class="pre">set_orderid</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">orderid</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Specifies the order’s ID.</p>
 <p>Can be viewed at obj.orderid</p>
 </dd></dl>
 
 <dl class="py method">
 <dt>
-<code class="sig-name descname">set_pricing</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">priceobj</span></em><span class="sig-paren">)</span></dt>
+<code class="sig-name descname"><span class="pre">set_pricing</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">priceobj</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Sets the pricing information of an order.</p>
 <p>Can be viewed at obj.pricing</p>
 <dl class="field-list simple">
@@ -488,7 +487,7 @@ <h2>Changing Order Parameters<a class="headerlink" href="#changing-order-paramet
 
 <dl class="py method">
 <dt>
-<code class="sig-name descname">set_time</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">time</span></em><span class="sig-paren">)</span></dt>
+<code class="sig-name descname"><span class="pre">set_time</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">time</span></span></em><span class="sig-paren">)</span></dt>
 <dd><p>Sets the order’s time-in-force.</p>
 <p>Can be viewed at obj.time</p>
 <dl class="field-list simple">
@@ -550,10 +549,10 @@ <h2>Pricing Types<a class="headerlink" href="#pricing-types" title="Permalink to
 <p>The Ally API supports 5 price types in total.</p>
 <dl class="py class">
 <dt id="ally.Order.Market">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">Market</code><a class="headerlink" href="#ally.Order.Market" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">Market</span></code><a class="headerlink" href="#ally.Order.Market" title="Permalink to this definition">¶</a></dt>
 <dd><dl class="py method">
 <dt id="ally.Order.Market.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Market.__init__" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Market.__init__" title="Permalink to this definition">¶</a></dt>
 <dd><p>Initialize self.  See help(type(self)) for accurate signature.</p>
 </dd></dl>
 
@@ -561,10 +560,10 @@ <h2>Pricing Types<a class="headerlink" href="#pricing-types" title="Permalink to
 
 <dl class="py class">
 <dt id="ally.Order.Limit">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">Limit</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">limpx</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Limit" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">Limit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">limpx</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Limit" title="Permalink to this definition">¶</a></dt>
 <dd><dl class="py method">
 <dt id="ally.Order.Limit.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">limpx</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Limit.__init__" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">limpx</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Limit.__init__" title="Permalink to this definition">¶</a></dt>
 <dd><p>Creates a limit price object.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
@@ -577,10 +576,10 @@ <h2>Pricing Types<a class="headerlink" href="#pricing-types" title="Permalink to
 
 <dl class="py class">
 <dt id="ally.Order.Stop">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">Stop</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">stoppx</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Stop" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">Stop</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">stoppx</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Stop" title="Permalink to this definition">¶</a></dt>
 <dd><dl class="py method">
 <dt id="ally.Order.Stop.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">stoppx</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Stop.__init__" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">stoppx</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.Stop.__init__" title="Permalink to this definition">¶</a></dt>
 <dd><p>Creates a stop price object.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
@@ -593,10 +592,10 @@ <h2>Pricing Types<a class="headerlink" href="#pricing-types" title="Permalink to
 
 <dl class="py class">
 <dt id="ally.Order.StopLimit">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">StopLimit</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">limpx</span></em>, <em class="sig-param"><span class="n">stoppx</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.StopLimit" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">StopLimit</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">limpx</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stoppx</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.StopLimit" title="Permalink to this definition">¶</a></dt>
 <dd><dl class="py method">
 <dt id="ally.Order.StopLimit.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">limpx</span></em>, <em class="sig-param"><span class="n">stoppx</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.StopLimit.__init__" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">limpx</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">stoppx</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.StopLimit.__init__" title="Permalink to this definition">¶</a></dt>
 <dd><p>Stop-limit price object.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
@@ -612,10 +611,10 @@ <h2>Pricing Types<a class="headerlink" href="#pricing-types" title="Permalink to
 
 <dl class="py class">
 <dt id="ally.Order.TrailingStop">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Order.</code><code class="sig-name descname">TrailingStop</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">use_pct</span></em>, <em class="sig-param"><span class="n">offset</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.TrailingStop" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Order.</span></code><code class="sig-name descname"><span class="pre">TrailingStop</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">use_pct</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">offset</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.TrailingStop" title="Permalink to this definition">¶</a></dt>
 <dd><dl class="py method">
 <dt id="ally.Order.TrailingStop.__init__">
-<code class="sig-name descname">__init__</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">use_pct</span></em>, <em class="sig-param"><span class="n">offset</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.TrailingStop.__init__" title="Permalink to this definition">¶</a></dt>
+<code class="sig-name descname"><span class="pre">__init__</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">use_pct</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">offset</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Order.TrailingStop.__init__" title="Permalink to this definition">¶</a></dt>
 <dd><p>Trailing stop price object.</p>
 <dl class="field-list simple">
 <dt class="field-odd">Parameters</dt>
@@ -637,37 +636,29 @@ <h2>Pricing Types<a class="headerlink" href="#pricing-types" title="Permalink to
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="quote.html" class="btn btn-neutral float-right" title="Quotes" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="account.html" class="btn btn-neutral float-left" title="Account" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="quote.html" class="btn btn-neutral float-right" title="Quotes" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="account.html" class="btn btn-neutral float-left" title="Account" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/docs/watchlist.html b/docs/watchlist.html
index ef8ef5d9..29809bd4 100644
--- a/docs/watchlist.html
+++ b/docs/watchlist.html
@@ -3,34 +3,37 @@
 <!DOCTYPE html>
 <html class="writer-html5" lang="en" >
 <head>
-  <meta charset="utf-8">
+  <meta charset="utf-8" />
   
-  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
   
-  <title>Watchlists &mdash; PyAlly 1.1.1 documentation</title>
+  <title>Watchlists &mdash; PyAlly 1.1.2 documentation</title>
   
 
   
-  <link rel="stylesheet" href="static/css/theme.css" type="text/css" />
-  <link rel="stylesheet" href="static/pygments.css" type="text/css" />
+  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
+  <link rel="stylesheet" href="_static/pygments.css" type="text/css" />
 
   
   
+
+  
   
+
   
 
   
   <!--[if lt IE 9]>
-    <script src="static/js/html5shiv.min.js"></script>
+    <script src="_static/js/html5shiv.min.js"></script>
   <![endif]-->
   
     
-      <script type="text/javascript" id="documentation_options" data-url_root="./" src="static/documentation_options.js"></script>
-        <script src="static/jquery.js"></script>
-        <script src="static/underscore.js"></script>
-        <script src="static/doctools.js"></script>
+      <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
+        <script src="_static/jquery.js"></script>
+        <script src="_static/underscore.js"></script>
+        <script src="_static/doctools.js"></script>
     
-    <script type="text/javascript" src="static/js/theme.js"></script>
+    <script type="text/javascript" src="_static/js/theme.js"></script>
 
     
     <link rel="index" title="Index" href="genindex.html" />
@@ -50,7 +53,7 @@
           
 
           
-            <a href="index.html" class="icon icon-home" alt="Documentation Home"> PyAlly
+            <a href="index.html" class="icon icon-home"> PyAlly
           
 
           
@@ -134,6 +137,8 @@
 
 
 
+
+
 <div role="navigation" aria-label="breadcrumbs navigation">
 
   <ul class="wy-breadcrumbs">
@@ -145,8 +150,6 @@
     
       <li class="wy-breadcrumbs-aside">
         
-            
-            <a href="_sources/watchlist.rst.txt" rel="nofollow"> View page source</a>
           
         
       </li>
@@ -163,7 +166,7 @@
 <h1>Watchlists<a class="headerlink" href="#watchlists" title="Permalink to this headline">¶</a></h1>
 <dl class="py class">
 <dt id="ally.Watchlist.Watchlist">
-<em class="property">class </em><code class="sig-prename descclassname">ally.Watchlist.</code><code class="sig-name descname">Watchlist</code><span class="sig-paren">(</span><em class="sig-param"><span class="n">parent</span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Watchlist.Watchlist" title="Permalink to this definition">¶</a></dt>
+<em class="property"><span class="pre">class</span> </em><code class="sig-prename descclassname"><span class="pre">ally.Watchlist.</span></code><code class="sig-name descname"><span class="pre">Watchlist</span></code><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">parent</span></span></em><span class="sig-paren">)</span><a class="headerlink" href="#ally.Watchlist.Watchlist" title="Permalink to this definition">¶</a></dt>
 <dd><p>Handle an accounts watchlists and symbols in a pythonic way.</p>
 <blockquote>
 <div><p>The Watchlist account object wraps ally’s watchlist
@@ -203,37 +206,29 @@ <h1>Watchlists<a class="headerlink" href="#watchlists" title="Permalink to this
            
           </div>
           <footer>
-  
     <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
-      
-        <a href="info.html" class="btn btn-neutral float-right" title="Info" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right"></span></a>
-      
-      
-        <a href="ratelimit.html" class="btn btn-neutral float-left" title="Rate Limiting" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left"></span> Previous</a>
-      
+        <a href="info.html" class="btn btn-neutral float-right" title="Info" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
+        <a href="ratelimit.html" class="btn btn-neutral float-left" title="Rate Limiting" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
     </div>
-  
 
   <hr/>
 
   <div role="contentinfo">
     <p>
-        
-        &copy; Copyright 2020, Brett Graves
+        &#169; Copyright 2020, Brett Graves.
 
     </p>
   </div>
     
     
     
-    Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a
+    Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
     
-    <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a>
+    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
     
     provided by <a href="https://readthedocs.org">Read the Docs</a>. 
 
 </footer>
-
         </div>
       </div>
 
diff --git a/requirements.dev.txt b/requirements.dev.txt
new file mode 100644
index 00000000..7e1a029e
--- /dev/null
+++ b/requirements.dev.txt
@@ -0,0 +1,7 @@
+black
+isort
+mypy
+pylint
+twine
+sphinx
+sphinx-rtd-theme>=0.5.1,<1.0.0
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 00000000..c50b3193
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,4 @@
+pandas>=0.23.1,<2.0.0
+pytz>=2020.5,<2021.0
+requests>=2.25.1,<3.0.0
+requests-oauthlib>=1.3.0,<2.0.0
diff --git a/setup.py b/setup.py
index 64631cec..b01e4956 100644
--- a/setup.py
+++ b/setup.py
@@ -1,27 +1,23 @@
 import setuptools
 
 with open("README.md", "r") as fh:
-        long_description = fh.read()
+    long_description = fh.read()
 
 setuptools.setup(
-        name="pyally",
-        version="1.1.2",
-        author="Brett Graves",
-        author_email="alienbrett648@gmail.com",
-        description="Ally Invest API Wrapper",
-        long_description=long_description,
-        long_description_content_type="text/markdown",
-        url="https://github.com/alienbrett/PyAlly",
-        packages=setuptools.find_packages(),
-		install_requires=[
-			'requests-oauthlib',
-			'requests',
-			'pytz'
-		],
-        classifiers=[
-            "Programming Language :: Python :: 3",
-            "License :: OSI Approved :: MIT License",
-            "Natural Language :: English",
-            "Operating System :: OS Independent",
-        ],
+    name="pyally",
+    version="1.1.2",
+    author="Brett Graves",
+    author_email="alienbrett648@gmail.com",
+    description="Ally Invest API Wrapper",
+    long_description=long_description,
+    long_description_content_type="text/markdown",
+    url="https://github.com/alienbrett/PyAlly",
+    packages=setuptools.find_packages(),
+    install_requires=["pandas", "pytz", "requests", "requests-oauthlib"],
+    classifiers=[
+        "Programming Language :: Python :: 3",
+        "License :: OSI Approved :: MIT License",
+        "Natural Language :: English",
+        "Operating System :: OS Independent",
+    ],
 )
diff --git a/sphinx/Makefile b/sphinx/Makefile
index 398a1db7..d4bb2cbb 100644
--- a/sphinx/Makefile
+++ b/sphinx/Makefile
@@ -18,11 +18,3 @@ help:
 # "make mode" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).
 %: Makefile
 	@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
-
-github:
-	@make html
-	@cp -a _build/html/. ../docs
-	@find ../docs -type f -exec sed -i 's/_static/static/g' {} +
-	@rm ../docs/static/ -rf
-	@mv ../docs/_static/ ../docs/static/
-	@touch ../docs/.nojekyll
diff --git a/sphinx/_static/images/details.png b/sphinx/_static/images/details.png
new file mode 100644
index 00000000..25289cfb
Binary files /dev/null and b/sphinx/_static/images/details.png differ
diff --git a/sphinx/_static/images/new_application.png b/sphinx/_static/images/new_application.png
new file mode 100644
index 00000000..1cd778e8
Binary files /dev/null and b/sphinx/_static/images/new_application.png differ
diff --git a/sphinx/_static/images/tools.png b/sphinx/_static/images/tools.png
new file mode 100644
index 00000000..3b46bebc
Binary files /dev/null and b/sphinx/_static/images/tools.png differ
diff --git a/sphinx/account.rst b/sphinx/account.rst
index 3475fb66..c499134e 100644
--- a/sphinx/account.rst
+++ b/sphinx/account.rst
@@ -1,10 +1,6 @@
 Account
 =======
 
-
-
-
 .. autoclass:: ally.Ally
    :members: accounts, balances, holdings, history
-
-
+   :noindex:
diff --git a/sphinx/ally.rst b/sphinx/ally.rst
index 792ecab9..82c00358 100644
--- a/sphinx/ally.rst
+++ b/sphinx/ally.rst
@@ -1,8 +1,5 @@
 Ally Object
 ===========
 
-
 .. autoclass:: ally.Ally
    :members: __init__
-
-
diff --git a/sphinx/conf.py b/sphinx/conf.py
index 5c66fade..c95b98a1 100644
--- a/sphinx/conf.py
+++ b/sphinx/conf.py
@@ -1,5 +1,3 @@
-import sphinx_rtd_theme
-
 # Configuration file for the Sphinx documentation builder.
 #
 # This file only contains a selection of the most common options. For a full
@@ -14,17 +12,18 @@
 #
 import os
 import sys
-sys.path.insert(0, os.path.abspath('..'))
+
+sys.path.insert(0, os.path.abspath(".."))
 
 
 # -- Project information -----------------------------------------------------
 
-project = 'PyAlly'
-copyright = '2020, Brett Graves'
-author = 'Brett Graves'
+project = "PyAlly"
+copyright = "2020, Brett Graves"
+author = "Brett Graves"
 
 # The full version, including alpha/beta/rc tags
-release = '1.1.1'
+release = "1.1.2"
 
 
 # -- General configuration ---------------------------------------------------
@@ -33,19 +32,19 @@
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
-	'sphinx.ext.autodoc',
-	'sphinx.ext.coverage',
-	'sphinx.ext.napoleon',
-	'sphinx_rtd_theme'
+    "sphinx.ext.autodoc",
+    "sphinx.ext.coverage",
+    "sphinx.ext.napoleon",
+    "sphinx_rtd_theme",
 ]
 
 # Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
+templates_path = ["_templates"]
 
 # List of patterns, relative to source directory, that match files and
 # directories to ignore when looking for source files.
 # This pattern also affects html_static_path and html_extra_path.
-exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store']
+exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"]
 
 
 # -- Options for HTML output -------------------------------------------------
@@ -53,9 +52,9 @@
 # The theme to use for HTML and HTML Help pages.  See the documentation for
 # a list of builtin themes.
 #
-html_theme = 'sphinx_rtd_theme'
+html_theme = "sphinx_rtd_theme"
 
 # Add any paths that contain custom static files (such as style sheets) here,
 # relative to this directory. They are copied after the builtin static files,
 # so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
+html_static_path = ["_static"]
diff --git a/sphinx/doctrees/account.doctree b/sphinx/doctrees/account.doctree
deleted file mode 100644
index c2d3beb3..00000000
Binary files a/sphinx/doctrees/account.doctree and /dev/null differ
diff --git a/sphinx/doctrees/environment.pickle b/sphinx/doctrees/environment.pickle
deleted file mode 100644
index 51647caf..00000000
Binary files a/sphinx/doctrees/environment.pickle and /dev/null differ
diff --git a/sphinx/doctrees/getting.started.doctree b/sphinx/doctrees/getting.started.doctree
deleted file mode 100644
index dd2d314a..00000000
Binary files a/sphinx/doctrees/getting.started.doctree and /dev/null differ
diff --git a/sphinx/doctrees/index.doctree b/sphinx/doctrees/index.doctree
deleted file mode 100644
index 1573feb8..00000000
Binary files a/sphinx/doctrees/index.doctree and /dev/null differ
diff --git a/sphinx/doctrees/support.doctree b/sphinx/doctrees/support.doctree
deleted file mode 100644
index 8499697f..00000000
Binary files a/sphinx/doctrees/support.doctree and /dev/null differ
diff --git a/sphinx/doctrees/trading.doctree b/sphinx/doctrees/trading.doctree
deleted file mode 100644
index c2143b74..00000000
Binary files a/sphinx/doctrees/trading.doctree and /dev/null differ
diff --git a/sphinx/index.rst b/sphinx/index.rst
index d8e299d9..3b6a84da 100644
--- a/sphinx/index.rst
+++ b/sphinx/index.rst
@@ -1,8 +1,7 @@
 PyAlly Trading Library
 ==================================
 
-Take control of your `Ally bank`_ finances through Python.
-Buy stocks and options in an instant, and stay up-to-date with your investments.
+Take control of your `Ally bank`_ finances through Python. Buy stocks and options in an instant, and stay up-to-date with your investments.
 
 Ally Bank's investment platform is perfect for smaller investors who value a mature web/mobile interface, and low brokerage fees. I made this wrapper so that I could more easily integrate the platform with Python, and reduce the need for human oversight on my account.
 
@@ -10,7 +9,6 @@ After setting up API keys, PyAlly can provide the basic/essential Ally brokerage
 
 The project can be cloned from github_ or installed through pip on pypi_.
 
-
 Contents
 --------
 
@@ -30,13 +28,10 @@ Contents
    support
    maintaining
 
-
 Version 1.1.2
 ----------------
 
-The lastest redesign preserves many features of the old interface, and incorporates a few new ones.
-Version 1.0 has been designed around a simple interface which should make modifying orders easier, and many operations more pythonic.
-Please note that this version breaks compatibility with all V0.X.X.
+The lastest redesign preserves many features of the old interface, and incorporates a few new ones. Version 1.0 has been designed around a simple interface which should make modifying orders easier, and many operations more pythonic. Please note that this version breaks compatibility with all V0.X.X.
 
 * Added pythonic methods for manipulating account watchlists
 * Added quote streaming support
@@ -48,16 +43,13 @@ Please note that this version breaks compatibility with all V0.X.X.
 * Toplists
 * News
 
-Note that parts of the news searching is broken. Ally's contractor who supplies information for news
-articles has had trouble suppling some information.
+Note that parts of the news searching is broken. Ally's contractor who supplies information for news articles has had trouble suppling some information.
 
 Planned Features
 -----------------
 
 * Multi-leg orders
 
-
-
 Contributors
 ------------
 * `Brett Graves`_
@@ -67,16 +59,12 @@ Contributors
 * `Tianyu`_
 * `Salient`_
 * `Matt Margolin`_
+* `Alex Kennedy`_
 
-
-Message me on Github or `send me an email`_ if you enjoyed the project or thought it could be improved.
-I do my best to code with quality but sometimes it is easier said than done.
-Anyone with an interest with an eye for detail is welcome to contribute.
+Message me on Github or `send me an email`_ if you enjoyed the project or thought it could be improved. I do my best to code with quality but sometimes it is easier said than done. Anyone with an interest with an eye for detail is welcome to contribute.
 
 If you're dying to buy me a beer, I accept venmo at @alienbrett. That said, feel no obligation; this is free software and it's here for you to use.
 
-
-
 .. _`Ally bank`: https://www.ally.com/api/invest/documentation/getting-started/
 
 .. _`Brett Graves`: https://github.com/alienbrett
@@ -93,8 +81,17 @@ If you're dying to buy me a beer, I accept venmo at @alienbrett. That said, feel
 
 .. _`Matt Margolin`: https://github.com/mm0
 
+.. _`Alex Kennedy`: https://github.com/LaikaN57
+
 .. _`send me an email`: mailto:alienbrett648@gmail.com
 
 .. _github: https://github.com/alienbrett/PyAlly
 
 .. _pypi: https://pypi.org/project/pyally/
+
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
diff --git a/sphinx/installing.rst b/sphinx/installing.rst
index 15a2a24e..09f4c67f 100644
--- a/sphinx/installing.rst
+++ b/sphinx/installing.rst
@@ -1,41 +1,35 @@
 Installing
 ===============
 
-
 Overview
 --------
 
-A new API project needs to be created through the account page on Ally's website,
-and the project keys imported so that they can be used with the module.
-
-
+A new API project needs to be created through the account page on Ally's website, and the project keys imported so that they can be used with the module.
 
 Get the Library
 ---------------
 
 To install the library, just use pip
 
-.. code-block:: console
-
-   $ pip install pyally
+.. code-block:: bash
 
+   pip install pyally
 
 Log into `Ally Invest`_, go to the specific account page, click Tools->API
 
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/tools.PNG?raw=true
+.. image:: https://github.com/mm0/PyAlly/blob/master/docs/_static/images/tools.png?raw=true
 
 Fill out the API token application as a Personal Application
 
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/new_application.PNG?raw=true
+.. image:: https://github.com/mm0/PyAlly/blob/master/docs/_static/images/new_application.png?raw=true
 
 It's **strongly recommended** to store the keys in environment variables.
 
-
-.. image:: https://github.com/alienbrett/PyAlly/blob/master/resources/details.PNG?raw=true
+.. image:: https://github.com/mm0/PyAlly/blob/master/docs/_static/images/details.png?raw=true
 
 To do this, insert the following into ``~/.bashrc``:
 
-.. code-block:: console
+.. code-block:: bash
 
    export ALLY_CONSUMER_KEY=XXXXXXXXXXXXXXXXXXXXXXXX
    export ALLY_CONSUMER_SECRET=XXXXXXXXXXXXXXXXXXXXX
@@ -43,46 +37,32 @@ To do this, insert the following into ``~/.bashrc``:
    export ALLY_OAUTH_SECRET=XXXXXXXXXXXXXXXXXXXXXXXX
    export ALLY_ACCOUNT_NBR=12345678
 
-
-
 First Steps
 -----------
 
-
 To import the library, just run
 
 .. code-block:: python
 
    import ally
 
-
 We need to pass the API keys to the pyally object on instantiation. This can be done in a few ways:
 
-
-
 Keys: Environment Variables
 ---------------------------
 
-It's **strongly recommended** that the API keys be stored as environment variables.
-This is more secure than other methods, as it conceals the credentials of ally account if
-the code is leaked or distributed. If the account variables are specified as recommended this way,
-instantiation is easy:
+It's **strongly recommended** that the API keys be stored as environment variables. This is more secure than other methods, as it conceals the credentials of ally account if the code is leaked or distributed. If the account variables are specified as recommended this way, instantiation is easy:
 
 .. code-block:: python
 
    a = ally.Ally()
 
-
 **And you're done!**
 
-
-
 Keys: JSON file
 ---------------
 
-The object creator also accepts a json file holding the dict keys, and 
-this is about as secure as the environment variable method.
-Place the API keys into a JSON file (this looks very similar to a python dict):
+The object creator also accepts a json file holding the dict keys, and this is about as secure as the environment variable method. Place the API keys into a JSON file (this looks very similar to a python dict):
 
 .. code-block:: python
 
@@ -94,24 +74,16 @@ Place the API keys into a JSON file (this looks very similar to a python dict):
        'ALLY_ACCOUNT_NBR':XXXX
    }
 
-
-
 Then the object can be instantiated like:
 
 .. code-block:: python
 
    a = ally.Ally('/path/to/params.json')
 
-
-
 Keys: Passing Directly
 ----------------------
 
-Variables can be passed in on instantiation. This way, no account variables need to be set.
-Keep in mind that this is much less secure for distributable applications, since anyone with these keys
-will have access to the account with which they're associated.
-
-
+Variables can be passed in on instantiation. This way, no account variables need to be set. Keep in mind that this is much less secure for distributable applications, since anyone with these keys will have access to the account with which they're associated.
 
 .. code-block:: python
 
@@ -124,9 +96,6 @@ will have access to the account with which they're associated.
    }
    a = ally.Ally(params)
 
-
-
 Now you're ready to make API calls with your new object and start trading.
 
-
 .. _`Ally Invest`: https://secure.ally.com
diff --git a/sphinx/maintaining.rst b/sphinx/maintaining.rst
index d8c1c27d..625a29dd 100644
--- a/sphinx/maintaining.rst
+++ b/sphinx/maintaining.rst
@@ -1,22 +1,14 @@
 Maintaining
 ============
 
-
 Updating and Deploying Documentation
 --------------------------------------
 
-To create a fully-functional fork of the repository in your Github,
-`set up a Github Pages project`_ for the new repository. When setting it up, associate the page
-with the `master` branch. The documentation will now be available publicly.
-
-Edit the files in the ``sphinx/`` directory how you see fit. Documentation for individual classes and files
-might be found in the source, since documentation is partially autogenerated from comments in the actual code.
+To create a fully-functional fork of the repository in your Github, `set up a Github Pages project`_ for the new repository. When setting it up, associate the page with the `master` branch. The documentation will now be available publicly.
 
-The documentation must then be generated. Change directories to the ``sphinx/`` folder, then run ``make github``.
-This will build the html web files for the online documentation and place them in the ``docs/`` folder. Add the
-files in the ``docs/`` and ``sphinx/`` in a new commit and push to master. The changes will be reflected on
-your project Github page.
+Edit the files in the ``sphinx/`` directory how you see fit. Documentation for individual classes and files might be found in the source, since documentation is partially autogenerated from comments in the actual code.
 
+The documentation must then be generated. Change directories to the ``sphinx/`` folder, then run ``make github``. This will build the html web files for the online documentation and place them in the ``docs/`` folder. Add the files in the ``docs/`` and ``sphinx/`` in a new commit and push to master. The changes will be reflected on your project Github page.
 
 Creating a Release
 -------------------
@@ -27,7 +19,6 @@ It's important to run the unit tests for the package before pushing a full relea
 
    python3 ally/tests.py
 
-
 To create a release, make sure to change the version number in 4 different files:
 
 * ``README.md``
@@ -35,14 +26,12 @@ To create a release, make sure to change the version number in 4 different files
 * ``sphinx/conf.py``
 * ``setup.py``
 
-Once this is done, all the documentation pages will reflect the new version, and the package release
-will respect this as well.
+Once this is done, all the documentation pages will reflect the new version, and the package release will respect this as well.
 
 Make sure to add new contributers to the ``sphinx/index.rst`` and ``README.md`` pages, if applicable.
 
 To build the package and upload to Pypi, run the commands from the root directory:
 
-
 .. code-block:: bash
 
    python3 setup.py sdist bdist_wheel
@@ -50,8 +39,4 @@ To build the package and upload to Pypi, run the commands from the root director
 
 The code will now be reflected in Pypi, available for public use.
 
-
-
-
 .. _`set up a Github Pages project`: https://docs.github.com/en/github/working-with-github-pages/creating-a-github-pages-site
-
diff --git a/sphinx/news.rst b/sphinx/news.rst
index 1c16f7fb..477e5ced 100644
--- a/sphinx/news.rst
+++ b/sphinx/news.rst
@@ -1,9 +1,6 @@
 News Searching
 ================
 
-
-
 .. autoclass:: ally.Ally
    :members: searchNews, lookupNews
-
-
+   :noindex:
diff --git a/sphinx/option.rst b/sphinx/option.rst
index 285b14c6..069fdcdd 100644
--- a/sphinx/option.rst
+++ b/sphinx/option.rst
@@ -1,10 +1,6 @@
 Option
 =======
 
-
-
-
 .. autoclass:: ally.Ally
    :members: strikes, expirations, search
-
-
+   :noindex:
diff --git a/sphinx/quote.rst b/sphinx/quote.rst
index 19d1b3bf..1402c4ca 100644
--- a/sphinx/quote.rst
+++ b/sphinx/quote.rst
@@ -3,3 +3,4 @@ Quotes
 
 .. autoclass:: ally.Ally
    :members: quote, timesales, stream, toplists
+   :noindex:
diff --git a/sphinx/ratelimit.rst b/sphinx/ratelimit.rst
index 318bb2ee..c5d732aa 100644
--- a/sphinx/ratelimit.rst
+++ b/sphinx/ratelimit.rst
@@ -3,22 +3,12 @@ Rate Limiting
 
 Ally imposes rate limits for each account, "designed to protect accounts from abuse and servers from load."
 
-PyAlly has thread-safe systems in place to respect these limits,
-and provides information and flexibility when dealing with these limits.
+PyAlly has thread-safe systems in place to respect these limits, and provides information and flexibility when dealing with these limits.
 
-Every function avaliable in the library has a ``block`` keyword that modifies the behavior of the
-function when the rate limit has been exceeded. When true, the function
-will block the calling thread until the API will accept the call, should the function
-encounter a rate limit exception.
-When false, the function will raise a ``ally.exceptions.RateLimitException``. The user
-can then build custom logic around rate limit failures.
+Every function avaliable in the library has a ``block`` keyword that modifies the behavior of the function when the rate limit has been exceeded. When true, the function will block the calling thread until the API will accept the call, should the function encounter a rate limit exception. When false, the function will raise a ``ally.exceptions.RateLimitException``. The user can then build custom logic around rate limit failures.
 
-Also, users can accesss the current state of the rate limits. Rate limit information
-is held on a module-level, and provides only a single set of limits shared across
-all ``ally.Ally()`` instances.
+Also, users can accesss the current state of the rate limits. Rate limit information is held on a module-level, and provides only a single set of limits shared across all ``ally.Ally()`` instances.
 
 Rate limit information can be queried with the ``ally.RateLimit.snapshot()`` function:
 
-.. automodule:: ally.RateLimit
-   :members: snapshot
-
+.. autofunction:: ally.RateLimit.snapshot
diff --git a/sphinx/support.rst b/sphinx/support.rst
index 8c49d8be..9f9e69ea 100644
--- a/sphinx/support.rst
+++ b/sphinx/support.rst
@@ -1,13 +1,9 @@
-=======
 Support
 =======
 
+If you find issues or need help with using the project, please check to see if there's an open issue on Github_, and if not, open a new issue on the page.
 
-If you find issues or need help with using the project, please check to see if there's an open
-issue on Github_, and if not, open a new issue on the page.
-
-The community is pretty active and hopefully there will be someone to answer,
-but feel free to `send me an email`_ and I'll get back with an update as soon as I can.
+The community is pretty active and hopefully there will be someone to answer, but feel free to `send me an email`_ and I'll get back with an update as soon as I can.
 
-.. _Github: https://github.com/alienbrett/PyAlly/issues
+.. _Github: https://github.com/mm0/PyAlly/issues
 .. _`send me an email`: mailto:alienbrett648@gmail.com
diff --git a/sphinx/trading.rst b/sphinx/trading.rst
index 6cb87112..09bbe300 100644
--- a/sphinx/trading.rst
+++ b/sphinx/trading.rst
@@ -13,10 +13,7 @@ Each order object must have a few attributes:
 * Time
 * Symbol
 
-
-The parameters can be provided all at once on object instantiation, or any of the orders can be
-set or modifed before submitting.
-
+The parameters can be provided all at once on object instantiation, or any of the orders can be set or modifed before submitting.
 
 Submit a Stock Order
 --------------------------
@@ -54,12 +51,11 @@ Buy 8 shares of AAPL at market price, good for the day.
 	>>> o.orderid
 	'SVI-12345678'
 
-
 Order information can be passed to the class on instantiation. Notice that any or all fields can be None, and added later.
 
 .. autoclass:: ally.Order.Order
    :members: __init__
-
+   :noindex:
 
 Viewing Open Orders
 ---------------------
@@ -104,26 +100,19 @@ The full class documentation:
 .. autoclass:: ally.Order.Order
    :members:
 
-
 Dealing With Options
 --------------------
 
-The only difference between how stocks and options must be handled, is that the option contract
-must be changed into its standard OCC symbol first. Then the option can be treated like any other stock, in every other feature.
-The ``ally.utils.option_format`` function formats the options's unique OCC symbol from its parameters:
+The only difference between how stocks and options must be handled, is that the option contract must be changed into its standard OCC symbol first. Then the option can be treated like any other stock, in every other feature. The ``ally.utils.option_format`` function formats the options's unique OCC symbol from its parameters:
 
 .. autofunction:: ally.utils.option_format
 
-
 This symbol can now be traded, same as any other stock or option.
 
-
-Short sell 1 contract (with contract size 100 shares) of the IBM call specified above,
-limit at $18, good-til-cancelled.
+Short sell 1 contract (with contract size 100 shares) of the IBM call specified above, limit at $18, good-til-cancelled.
 
 .. code-block:: python
 
-
 	>>> o = ally.Order.Order(
 		buysell = 'sellshort',
 		symbol = ibm_call,
@@ -132,12 +121,9 @@ limit at $18, good-til-cancelled.
 		qty = 1
 	)
 
-
-
 Changing Order Parameters
 -------------------------
 
-
 Modifying orders, outstanding or local orders, is easy as well.
 
 .. code-block:: python
@@ -157,23 +143,18 @@ Modifying orders, outstanding or local orders, is easy as well.
 	>>> o.buysell
 	<Side.SellShort: 4>
 
-
 Any of these functions can be used to modify the order's parameters:
 
 .. autoclass:: ally.Order.Order
-   :members: set_buysell, set_instrument, set_time, set_pricing, set_orderid
+   :members: set_buysell, set_time, set_pricing, set_orderid
    :noindex:
 
-
 And the order type (Order, Cancel or Modify) can be set as so:
 
 .. code-block:: python
 
 	o.otype = ally.Order.OType.{Order, Modify, Cancel}
 
-
-
-
 Modifying and Cancelling Outstanding Orders
 -----------------------------------------------
 
@@ -191,7 +172,6 @@ The function will do the rest for you.
 		type_ = ally.Order.OType.Cancel # Either OType.Cancel, or OType.Modify
 	)
 
-
 * Directly modify existing order
 
 .. code-block:: python
@@ -209,8 +189,6 @@ The function will do the rest for you.
 	)
 	>>> a.submit ( cxl, preview=False )
 
-
-
 Orders can be revised once submitted but before execution like so:
 
 .. code-block:: python
@@ -221,8 +199,6 @@ Orders can be revised once submitted but before execution like so:
 	# Submit to ally for revision
 	>>> a.submit ( o, preview=False, type_ = ally.Order.OType.Modify )
 
-
-
 Pricing Types
 ---------------
 
@@ -240,6 +216,5 @@ The Ally API supports 5 price types in total.
 .. autoclass:: ally.Order.StopLimit
    :members: __init__
 
-
 .. autoclass:: ally.Order.TrailingStop
    :members: __init__


Test patch:
diff --git a/ally/Order/tests/InstrumentConstruction.py b/ally/Order/tests/InstrumentConstruction.py
index 66a2da2f..01731b24 100644
--- a/ally/Order/tests/InstrumentConstruction.py
+++ b/ally/Order/tests/InstrumentConstruction.py
@@ -20,66 +20,46 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
-import unittest
-from ..classes		import *
-from .classes		import *
-from ..order		import Order
-
-
-
-
-
-
+from ..classes import *
+from .classes import *
 
 
 class TestInstrumentConstruction(unittest.TestCase):
+    def test_option_construction(self):
+        op = Option(direction="call", exp_date="2011-02-11", strike=16, underlying="f")
+        self.assertEqual(
+            op.fixml,
+            {
+                "Instrmt": {
+                    "CFI": "OC",
+                    "SecTyp": "OPT",
+                    "MatDt": "2011-02-11T00:00:00.000-05:00",
+                    "StrkPx": 16,
+                    "Sym": "F",
+                }
+            },
+            "From ally website",
+        )
 
-	def test_option_construction(self):
-		op = Option (
-			direction='call',
-			exp_date = '2011-02-11',
-			strike = 16,
-			underlying = 'f'
-		)
-		self.assertEqual(
-			op.fixml,
-			{
-				'Instrmt': {
-					'CFI':"OC",
-					'SecTyp':"OPT",
-					'MatDt':"2011-02-11T00:00:00.000-05:00",
-					'StrkPx': 16,
-					'Sym':"F"
-					}
-			},
-			'From ally website'
-		)
+        op = Option(
+            direction="PuT", exp_date="2014-01-18", strike=190, underlying="IbM"
+        )
+        self.assertEqual(
+            op.fixml,
+            {
+                "Instrmt": {
+                    "CFI": "OP",
+                    "SecTyp": "OPT",
+                    "MatDt": "2014-01-18T00:00:00.000-05:00",
+                    "StrkPx": 190,
+                    "Sym": "IBM",
+                }
+            },
+            "From ally website",
+        )
 
-		op = Option (
-			direction='PuT',
-			exp_date = '2014-01-18',
-			strike = 190,
-			underlying = 'IbM'
-		)
-		self.assertEqual(
-			op.fixml,
-			{
-				'Instrmt': {
-					'CFI':"OP",
-					'SecTyp':"OPT",
-					'MatDt':"2014-01-18T00:00:00.000-05:00",
-					'StrkPx': 190,
-					'Sym':"IBM"
-					}
-			},
-			'From ally website'
-		)
-	
-	def test_stock_construction(self):
-		s = Stock (symbol='f')
-		self.assertEqual(
-			s.fixml,
-			{ 'Instrmt': { 'SecTyp':'CS', 'Sym':'F' } },
-			"From ally website"
-		)
+    def test_stock_construction(self):
+        s = Stock(symbol="f")
+        self.assertEqual(
+            s.fixml, {"Instrmt": {"SecTyp": "CS", "Sym": "F"}}, "From ally website"
+        )
diff --git a/ally/Order/tests/OrderConstruction.py b/ally/Order/tests/OrderConstruction.py
index 6f5856db..9ab08feb 100644
--- a/ally/Order/tests/OrderConstruction.py
+++ b/ally/Order/tests/OrderConstruction.py
@@ -20,104 +20,84 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
-import unittest
-from ..classes		import *
-from .classes		import *
-from ..order		import Order
+from ..classes import *
+from ..order import Order
+from .classes import *
 
 
 class TestOrderConstruction(XMLTestCase):
-
-
-	def test_market_stock_buy_day(self):
-		o = Order (
-			buysell = 'buy',
-			time	= 'day',
-			symbol	= 'f',
-			qty		= 1,
-			price	= Market(),
-			account	= '12345678'
-		)
-
-		self.assertEqualXML(
-			o.fixml,
-			'<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order TmInForce="0" Typ="1" Side="1" Acct="12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></Order></FIXML>',
-			"Straight from the ally website"
-		)
-	
-
-	def test_market_stock_sell_day(self):
-		o = Order (
-			buysell = 'sell',
-			time	= 'day',
-			symbol	= 'ibm',
-			qty		= 1,
-			price	= Market()
-		)
-		o.set_account(12345678)
-
-		self.assertEqualXML(
-			o.fixml,
-			'<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order Acct="12345678" TmInForce="0" Typ="1" Side="2"><Instrmt SecTyp="CS" Sym="IBM"/><OrdQty Qty="1"/></Order></FIXML>',
-			"Straight from the ally website"
-		)
-
-
-
-
-	def test_market_stock_short_day(self):
-		o = Order (
-			buysell = 'sellshort',
-			time	= 'day',
-			symbol	= 'f',
-			qty		= 1,
-			price	= Limit(22),
-			account	= '12345678'
-		)
-
-		self.assertEqualXML(
-			o.fixml,
-			'<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order TmInForce="0" Typ="2" Side="5" Px="22.0" Acct="12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></Order></FIXML>',
-			"Straight from the ally website"
-		)
-
-
-
-	def test_market_stock_cover_day(self):
-		o = Order (
-			buysell = 'buycover',
-			time	= 'day',
-			symbol	= 'f',
-			qty		= 1,
-			price	= Limit(13),
-			account	= '12345678'
-		)
-
-		self.assertEqualXML(
-			o.fixml,
-			'<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order TmInForce="0" Typ="2" Side="1" AcctTyp="5" Px="13.0" Acct="12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></Order></FIXML>',
-			"Straight from the ally website"
-		)
-
-
-
-
-	def test_modify_market_stock_buy_day(self):
-		o = Order (
-			type_	= OType.Modify,
-			buysell = 'buy',
-			time	= 'day',
-			symbol	= 'f',
-			qty		= 1,
-			price	= Limit(15),
-			account	= '12345678',
-			orderid	= 'SVI-12345678'
-		)
-
-		self.assertEqualXML(
-			o.fixml,
-			'<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><OrdCxlRplcReq TmInForce="0" Typ="2" Side="1" Px="15.0" Acct="12345678" OrigID="SVI-12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></OrdCxlRplcReq></FIXML>',
-			"Straight from the ally website"
-		)
-
+    def test_market_stock_buy_day(self):
+        o = Order(
+            buysell="buy",
+            time="day",
+            symbol="f",
+            qty=1,
+            price=Market(),
+            account="12345678",
+        )
+
+        self.assertEqualXML(
+            o.fixml,
+            '<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order TmInForce="0" Typ="1" Side="1" Acct="12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></Order></FIXML>',
+            "Straight from the ally website",
+        )
+
+    def test_market_stock_sell_day(self):
+        o = Order(buysell="sell", time="day", symbol="ibm", qty=1, price=Market())
+        o.set_account(12345678)
+
+        self.assertEqualXML(
+            o.fixml,
+            '<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order Acct="12345678" TmInForce="0" Typ="1" Side="2"><Instrmt SecTyp="CS" Sym="IBM"/><OrdQty Qty="1"/></Order></FIXML>',
+            "Straight from the ally website",
+        )
+
+    def test_market_stock_short_day(self):
+        o = Order(
+            buysell="sellshort",
+            time="day",
+            symbol="f",
+            qty=1,
+            price=Limit(22),
+            account="12345678",
+        )
+
+        self.assertEqualXML(
+            o.fixml,
+            '<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order TmInForce="0" Typ="2" Side="5" Px="22.0" Acct="12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></Order></FIXML>',
+            "Straight from the ally website",
+        )
+
+    def test_market_stock_cover_day(self):
+        o = Order(
+            buysell="buycover",
+            time="day",
+            symbol="f",
+            qty=1,
+            price=Limit(13),
+            account="12345678",
+        )
+
+        self.assertEqualXML(
+            o.fixml,
+            '<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><Order TmInForce="0" Typ="2" Side="1" AcctTyp="5" Px="13.0" Acct="12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></Order></FIXML>',
+            "Straight from the ally website",
+        )
+
+    def test_modify_market_stock_buy_day(self):
+        o = Order(
+            type_=OType.Modify,
+            buysell="buy",
+            time="day",
+            symbol="f",
+            qty=1,
+            price=Limit(15),
+            account="12345678",
+            orderid="SVI-12345678",
+        )
+
+        self.assertEqualXML(
+            o.fixml,
+            '<FIXML xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2"><OrdCxlRplcReq TmInForce="0" Typ="2" Side="1" Px="15.0" Acct="12345678" OrigID="SVI-12345678"><Instrmt SecTyp="CS" Sym="F"/><OrdQty Qty="1"/></OrdCxlRplcReq></FIXML>',
+            "Straight from the ally website",
+        )
diff --git a/ally/Order/tests/OrderManual.py b/ally/Order/tests/OrderManual.py
index 62640ea3..06be224c 100644
--- a/ally/Order/tests/OrderManual.py
+++ b/ally/Order/tests/OrderManual.py
@@ -20,61 +20,52 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
 import unittest
-from ..classes		import *
-from ..order		import Order
-
-
 
+from ..classes import *
+from ..order import Order
 
 
 class TestOrderManual(unittest.TestCase):
+    def test_buysell_buy(self):
 
+        o = Order(buysell="buy")
+        self.assertEqual(o.buysell, Side.Buy, "Should be Side.Buy")
+        o = Order(buysell=Side.Buy)
+        self.assertEqual(o.buysell, Side.Buy, "Should be Side.Buy")
 
+    def test_buysell_sell(self):
 
-	def test_buysell_buy (self):
-
-		o = Order(buysell='buy')
-		self.assertEqual(o.buysell, Side.Buy, "Should be Side.Buy")
-		o = Order(buysell=Side.Buy)
-		self.assertEqual(o.buysell, Side.Buy, "Should be Side.Buy")
-
-	def test_buysell_sell (self):
-
-		o = Order(buysell='sell')
-		self.assertEqual(o.buysell, Side.Sell, "Should be Side.Sell")
-		o = Order(buysell=Side.Sell)
-		self.assertEqual(o.buysell, Side.Sell, "Should be Side.Sell")
-
-	def test_buysell_sellshort (self):
-
-		o = Order(buysell='sellshort')
-		self.assertEqual(o.buysell, Side.SellShort, "Should be Side.SellShort")
-		o = Order(buysell=Side.SellShort)
-		self.assertEqual(o.buysell, Side.SellShort, "Should be Side.SellShort")
-
-	def test_buysell_buycover (self):
+        o = Order(buysell="sell")
+        self.assertEqual(o.buysell, Side.Sell, "Should be Side.Sell")
+        o = Order(buysell=Side.Sell)
+        self.assertEqual(o.buysell, Side.Sell, "Should be Side.Sell")
 
-		o = Order(buysell='buycover')
-		self.assertEqual(o.buysell, Side.BuyCover, "Should be Side.BuyCover")
-		o = Order(buysell=Side.BuyCover)
-		self.assertEqual(o.buysell, Side.BuyCover, "Should be Side.BuyCover")
+    def test_buysell_sellshort(self):
 
+        o = Order(buysell="sellshort")
+        self.assertEqual(o.buysell, Side.SellShort, "Should be Side.SellShort")
+        o = Order(buysell=Side.SellShort)
+        self.assertEqual(o.buysell, Side.SellShort, "Should be Side.SellShort")
 
-	def test_quantity ( self ):
+    def test_buysell_buycover(self):
 
-		o = Order(qty=10)
-		self.assertEqual(o.quantity, 10, "Should be 10")
-		o = Order(qty=10.5)
-		self.assertEqual(o.quantity, 10, "Should be 10")
-		o = Order(qty="10")
-		self.assertEqual(o.quantity, 10, "Should be 10")
+        o = Order(buysell="buycover")
+        self.assertEqual(o.buysell, Side.BuyCover, "Should be Side.BuyCover")
+        o = Order(buysell=Side.BuyCover)
+        self.assertEqual(o.buysell, Side.BuyCover, "Should be Side.BuyCover")
 
+    def test_quantity(self):
 
+        o = Order(qty=10)
+        self.assertEqual(o.quantity, 10, "Should be 10")
+        o = Order(qty=10.5)
+        self.assertEqual(o.quantity, 10, "Should be 10")
+        o = Order(qty="10")
+        self.assertEqual(o.quantity, 10, "Should be 10")
 
-	def test_price_market ( self ):
-		o = Order(time='onclose')
-		self.assertEqual(o.time, TimeInForce.OnClose, "Should be TimeInForce.OnClose")
-		o = Order(time=TimeInForce.OnClose)
-		self.assertEqual(o.time, TimeInForce.OnClose, "Should be TimeInForce.OnClose")
+    def test_price_market(self):
+        o = Order(time="onclose")
+        self.assertEqual(o.time, TimeInForce.OnClose, "Should be TimeInForce.OnClose")
+        o = Order(time=TimeInForce.OnClose)
+        self.assertEqual(o.time, TimeInForce.OnClose, "Should be TimeInForce.OnClose")
diff --git a/ally/Order/tests/OrderParse.py b/ally/Order/tests/OrderParse.py
index bf2e9bba..f828e56a 100644
--- a/ally/Order/tests/OrderParse.py
+++ b/ally/Order/tests/OrderParse.py
@@ -20,31 +20,21 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
-import unittest
-from ..classes		import *
-from .classes		import *
-from ..order		import Order
+from ..classes import *
+from ..order import Order
+from .classes import *
 
 
 class TestOrderParse(XMLTestCase):
+    def test_parse1(self):
 
-	def test_parse1(self):
-
-
-		fixml = '<?xml version="1.0" encoding="utf-8"?>\r\n<FIXML xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">\r\n  <ExecRpt OrdID="SVI-6111492151" ID="SVI-6111492151" Stat="2" Acct="12345678" AcctTyp="2" Side="2" Typ="2" Px="31.5" TmInForce="1" LastQty="1" LastPx="31.5" LeavesQty="0" TrdDt="2020-06-12T12:12:00.000-04:00" TxnTm="2020-06-12T12:12:00.000-04:00" PosEfct="C">\r\n	<Instrmt Sym="TSLA" CFI="OP" SecTyp="OPT" MMY="202006" MatDt="2020-06-19T00:00:00.000-04:00" StrkPx="935" Mult="100" Desc="TSLA Jun 19 2020 935.00 Put" />\r\n	<Undly Sym="TSLA" />\r\n	<OrdQty Qty="1" />\r\n	<Comm Comm="0.50" />\r\n  </ExecRpt>\r\n</FIXML>'
-
-
-		o = Order(fixml=fixml)
-		
-		self.assertEqual ( o.quantity, 1, "quantity of one" )
-		self.assertEqual ( o.time, TimeInForce.GTC, "Good Til Cancelled order" )
-		self.assertEqual ( o.buysell, Side.Sell, "Sell order" )
-		self.assertEqual ( o.account, 12345678, "account number" )
-		self.assertEqual ( o.orderid, 'SVI-6111492151', "Order number" )
-		self.assertEqual ( o.pricing, Limit(31.50), "Limit order @ $31.50")
-	
-
-
+        fixml = '<?xml version="1.0" encoding="utf-8"?>\r\n<FIXML xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.fixprotocol.org/FIXML-5-0-SP2">\r\n  <ExecRpt OrdID="SVI-6111492151" ID="SVI-6111492151" Stat="2" Acct="12345678" AcctTyp="2" Side="2" Typ="2" Px="31.5" TmInForce="1" LastQty="1" LastPx="31.5" LeavesQty="0" TrdDt="2020-06-12T12:12:00.000-04:00" TxnTm="2020-06-12T12:12:00.000-04:00" PosEfct="C">\r\n	<Instrmt Sym="TSLA" CFI="OP" SecTyp="OPT" MMY="202006" MatDt="2020-06-19T00:00:00.000-04:00" StrkPx="935" Mult="100" Desc="TSLA Jun 19 2020 935.00 Put" />\r\n	<Undly Sym="TSLA" />\r\n	<OrdQty Qty="1" />\r\n	<Comm Comm="0.50" />\r\n  </ExecRpt>\r\n</FIXML>'
 
+        o = Order(fixml=fixml)
 
+        self.assertEqual(o.quantity, 1, "quantity of one")
+        self.assertEqual(o.time, TimeInForce.GTC, "Good Til Cancelled order")
+        self.assertEqual(o.buysell, Side.Sell, "Sell order")
+        self.assertEqual(o.account, 12345678, "account number")
+        self.assertEqual(o.orderid, "SVI-6111492151", "Order number")
+        self.assertEqual(o.pricing, Limit(31.50), "Limit order @ $31.50")
diff --git a/ally/Order/tests/OrderSubmition.py b/ally/Order/tests/OrderSubmition.py
index 50c336ef..43984e67 100644
--- a/ally/Order/tests/OrderSubmition.py
+++ b/ally/Order/tests/OrderSubmition.py
@@ -20,48 +20,39 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
 import unittest
-from ..classes		import *
-from .classes		import *
-from ..order		import Order
-from ...Ally		import Ally
 import warnings
 
+from ...Ally import Ally
+from ..classes import *
+from ..order import Order
+from .classes import *
 
-class TestOrderSubmition(XMLTestCase):
 
-	def test_order_submit_cxl ( self ):
-		"""Submit an order, then cancel that order.
+class TestOrderSubmition(XMLTestCase):
+    def test_order_submit_cxl(self):
+        """Submit an order, then cancel that order.
 
-		Ensure that the orders before and after are equivalent
-		"""
-		warnings.filterwarnings(
-			action="ignore",
-			message="unclosed",
-			category=ResourceWarning
-		)
+        Ensure that the orders before and after are equivalent
+        """
+        warnings.filterwarnings(
+            action="ignore", message="unclosed", category=ResourceWarning
+        )
 
-		a = Ally()
+        a = Ally()
 
-		o = Order (
-			buysell = 'buy',
-			time = 'gtc',
-			symbol = 'gld',
-			qty = 10,
-			price = Limit(1.0)
-		)
+        o = Order(buysell="buy", time="gtc", symbol="gld", qty=10, price=Limit(0.1))
 
-		# Log the currently outstanding orders
-		js = [ str(j) for j in a.orders() ]
+        # Log the currently outstanding orders
+        js = [str(j) for j in a.orders()]
 
-		# Create this new order
-		newid = a.submit ( o, preview=False )
+        # Create this new order
+        newid = a.submit(o, preview=False)
 
-		# Cancel this order
-		cancelinfo = a.submit ( o, preview=False, type_ = OType.Cancel )
+        # Cancel this order
+        cancelinfo = a.submit(o, preview=False, type_=OType.Cancel)
 
-		# Compare the new outstanding orders, sans the other one
-		ks = [ str(k) for k in a.orders() if k.orderid != newid ]
+        # Compare the new outstanding orders, sans the other one
+        ks = [str(k) for k in a.orders() if k.orderid != newid]
 
-		self.assertEqual(js, ks, 'orders excluding the new order should be equal')
+        self.assertEqual(js, ks, "orders excluding the new order should be equal")
diff --git a/ally/Order/tests/PricingConstruction.py b/ally/Order/tests/PricingConstruction.py
index f7259813..232177c9 100644
--- a/ally/Order/tests/PricingConstruction.py
+++ b/ally/Order/tests/PricingConstruction.py
@@ -20,107 +20,64 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
-import unittest
-from ..classes		import *
-from .classes		import *
-from ..order		import Order
+from ..classes import *
+from .classes import *
 
 
 class TestPricingConstruction(unittest.TestCase):
-	
-	def test_market_construction(self):
-		p = Market()
-		self.assertEqual(
-			p.attributes,
-			{'Typ':'1'},
-			"Should have type 1"
-		)
-
-
-
-	def test_limit_construction(self):
-		p = Limit(limpx=10.51)
-		self.assertEqual(
-			p.attributes,
-			{'Typ':'2', 'Px':'10.51'},
-			"Should have type 2, with Px included"
-		)
-		p = Limit(limpx=10.51141)
-		self.assertEqual(
-			p.attributes,
-			{'Typ':'2', 'Px':'10.51'},
-			"Should have type 2, with Px included"
-		)
-	
-
-
-	def test_stop_construction(self):
-		p = Stop(stoppx=10.51)
-		self.assertEqual(
-			p.attributes,
-			{ 'Typ':"3", 'StopPx':"10.51"},
-			"Should have typ 3, with StopPx included"
-		)
-		p = Stop(stoppx=10.5112312)
-		self.assertEqual(
-			p.attributes,
-			{ 'Typ':"3", 'StopPx':"10.51"},
-			"Should have typ 3, with StopPx included"
-		)
-
-
-	def test_stoplimit_construction(self):
-		p = StopLimit(limpx = 10.1, stoppx = 10.51)
-		self.assertEqual(
-			p.attributes,
-			{ 'Typ':"4", 'Px': '10.1', 'StopPx':"10.51" },
-			"Should have typ 3, with StopPx included"
-		)
-
-
-
-	def test_trailingstop_construction(self):
-		p = TrailingStop(
-			use_pct = True,
-			offset = 1.12
-		)
-		self.assertEqual(
-			p.attributes,
-			{ 'Typ':"P"},
-			"Should have typ P"
-		)
-		self.assertEqual(
-			p.fixml,
-			{
-				'PegInstr': {
-					'OfstTyp': 1,
-					'PegPxTyp': 1,
-					'OfstVal': 1.12
-				}
-			},
-			"Should include tag with peginstr"
-		)
-
-
-
-		p = TrailingStop(
-			use_pct = False,
-			offset = 5.69
-		)
-		self.assertEqual(
-			p.attributes,
-			{ 'Typ':"P"},
-			"Should have typ P"
-		)
-		self.assertEqual(
-			p.fixml,
-			{
-				'PegInstr': {
-					'OfstTyp': 0,
-					'PegPxTyp': 1,
-					'OfstVal': 5.69
-				}
-			},
-			"Should include tag with peginstr"
-		)
+    def test_market_construction(self):
+        p = Market()
+        self.assertEqual(p.attributes, {"Typ": "1"}, "Should have type 1")
+
+    def test_limit_construction(self):
+        p = Limit(limpx=10.51)
+        self.assertEqual(
+            p.attributes,
+            {"Typ": "2", "Px": "10.51"},
+            "Should have type 2, with Px included",
+        )
+        p = Limit(limpx=10.51141)
+        self.assertEqual(
+            p.attributes,
+            {"Typ": "2", "Px": "10.51"},
+            "Should have type 2, with Px included",
+        )
+
+    def test_stop_construction(self):
+        p = Stop(stoppx=10.51)
+        self.assertEqual(
+            p.attributes,
+            {"Typ": "3", "StopPx": "10.51"},
+            "Should have typ 3, with StopPx included",
+        )
+        p = Stop(stoppx=10.5112312)
+        self.assertEqual(
+            p.attributes,
+            {"Typ": "3", "StopPx": "10.51"},
+            "Should have typ 3, with StopPx included",
+        )
+
+    def test_stoplimit_construction(self):
+        p = StopLimit(limpx=10.1, stoppx=10.51)
+        self.assertEqual(
+            p.attributes,
+            {"Typ": "4", "Px": "10.1", "StopPx": "10.51"},
+            "Should have typ 3, with StopPx included",
+        )
+
+    def test_trailingstop_construction(self):
+        p = TrailingStop(use_pct=True, offset=1.12)
+        self.assertEqual(p.attributes, {"Typ": "P"}, "Should have typ P")
+        self.assertEqual(
+            p.fixml,
+            {"PegInstr": {"OfstTyp": 1, "PegPxTyp": 1, "OfstVal": 1.12}},
+            "Should include tag with peginstr",
+        )
+
+        p = TrailingStop(use_pct=False, offset=5.69)
+        self.assertEqual(p.attributes, {"Typ": "P"}, "Should have typ P")
+        self.assertEqual(
+            p.fixml,
+            {"PegInstr": {"OfstTyp": 0, "PegPxTyp": 1, "OfstVal": 5.69}},
+            "Should include tag with peginstr",
+        )
diff --git a/ally/Order/tests/__init__.py b/ally/Order/tests/__init__.py
index 4fd71815..22d07d52 100644
--- a/ally/Order/tests/__init__.py
+++ b/ally/Order/tests/__init__.py
@@ -24,9 +24,9 @@
 
 """
 
-from .OrderManual				import *
-from .InstrumentConstruction	import *
-from .PricingConstruction		import *
-from .OrderConstruction			import *
-from .OrderParse				import *
-from .OrderSubmition			import *
+from .InstrumentConstruction import *
+from .OrderConstruction import *
+from .OrderManual import *
+from .OrderParse import *
+from .OrderSubmition import *
+from .PricingConstruction import *
diff --git a/ally/Order/tests/classes.py b/ally/Order/tests/classes.py
index b70ec7bf..1e80340b 100644
--- a/ally/Order/tests/classes.py
+++ b/ally/Order/tests/classes.py
@@ -20,20 +20,19 @@
 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 # SOFTWARE.
 
-import xml.etree.ElementTree as ET
+import logging
 import unittest
+import xml.etree.ElementTree as ET
+
+logger = logging.getLogger(__name__)
 
 
 class XMLTestCase(unittest.TestCase):
-	def assertEqualXML( self, s1, s2, msg, verbose=False ):
-		s1 = ET.tostring(ET.fromstring(s1))
-		s2 = ET.tostring(ET.fromstring(s2))
-		if verbose:
-			print()
-			print(s1)
-			print(s2)
-		self.assertEqual(
-			s1,
-			s2,
-			msg
-		)
+    def assertEqualXML(self, s1: str, s2: str, msg: str) -> None:
+        s1 = ET.tostring(ET.fromstring(s1))
+        s2 = ET.tostring(ET.fromstring(s2))
+
+        logger.debug(s1)
+        logger.debug(s2)
+
+        self.assertEqual(s1, s2, msg)
diff --git a/ally/tests.py b/ally/tests.py
index 7a53a744..463bebd7 100644
--- a/ally/tests.py
+++ b/ally/tests.py
@@ -21,10 +21,10 @@
 # SOFTWARE.
 
 import unittest
-from ally.tests import *
+
 from ally.Order.tests import *
+from ally.tests import *
 from ally.utils.tests import *
 
-
-if __name__ == '__main__':
-	unittest.main()
+if __name__ == "__main__":
+    unittest.main()
diff --git a/ally/utils/tests.py b/ally/utils/tests.py
index 5316cf27..cfec1c71 100644
--- a/ally/utils/tests.py
+++ b/ally/utils/tests.py
@@ -21,97 +21,73 @@
 # SOFTWARE.
 
 import unittest
-from .option	import *
 
+from .option import *
 
 
 class TestOptionFormat(unittest.TestCase):
-
-	def test_option_format1(self):
-		sym = option_format (
-			symbol="iBm",
-			exp_date="2014-01-18",
-			strike=200,
-			direction="c"
-		)
-
-		self.assertEqual(
-			sym,
-			"IBM140118C00200000",
-			"From ally website, https://www.ally.com/api/invest/documentation/market-ext-quotes-get-post/"
-		)
-
-	def test_option_format2(self):
-		sym = option_format (
-			symbol="f",
-			exp_date="2020-07-24",
-			strike=1,
-			direction="c"
-		)
-
-		self.assertEqual(
-			sym,
-			"F200724C00001000",
-			"Snagged from yahoo finance (God bless yahoo finance)"
-		)
-
-	def test_option_format3(self):
-		sym = option_format (
-			symbol="f",
-			exp_date="2020-07-24",
-			strike=4.5,
-			direction="c"
-		)
-
-		self.assertEqual(
-			sym,
-			"F200724C00004500",
-			"Snagged from yahoo finance (God bless yahoo finance)"
-		)
-
-	def test_option_format3(self):
-		sym = option_format (
-			symbol="TSLA",
-			exp_date="2022-09-16",
-			strike="2950.0",
-			direction="Put" # Should work, try to break the function
-		)
-
-		self.assertEqual(
-			sym,
-			"TSLA220916P02950000",
-			"Snagged from yahoo finance (God bless yahoo finance)"
-		)
-
-	############### Test option parameter extraction #####
-	def test_option_extraction1(self):
-		sym = 'TSLA220916P02950000'
-		self.assertEqual(
-			option_strike ( sym ),
-			2950,
-			"Strike price of $2950.00"
-		)
-
-	def test_option_extraction2(self):
-		sym = 'TSLA220916P02950000'
-		self.assertEqual(
-			option_symbol ( sym ),
-			'TSLA',
-			"It is a TSLA option"
-		)
-
-	def test_option_extraction3(self):
-		sym = "F200724C00004500"
-		self.assertEqual(
-			option_strike ( sym ),
-			4.5,
-			"Make sure we can extract non-integer strikes"
-		)
-
-	def test_option_extraction4(self):
-		sym = "F200724C00004500"
-		self.assertEqual(
-			option_maturity ( sym ),
-			"2020-07-24",
-			"Extract the expiration date"
-		)
+    def test_option_format1(self):
+        sym = option_format(
+            symbol="iBm", exp_date="2014-01-18", strike=200, direction="c"
+        )
+
+        self.assertEqual(
+            sym,
+            "IBM140118C00200000",
+            "From ally website, https://www.ally.com/api/invest/documentation/market-ext-quotes-get-post/",
+        )
+
+    def test_option_format2(self):
+        sym = option_format(symbol="f", exp_date="2020-07-24", strike=1, direction="c")
+
+        self.assertEqual(
+            sym,
+            "F200724C00001000",
+            "Snagged from yahoo finance (God bless yahoo finance)",
+        )
+
+    def test_option_format3(self):
+        sym = option_format(
+            symbol="f", exp_date="2020-07-24", strike=4.5, direction="c"
+        )
+
+        self.assertEqual(
+            sym,
+            "F200724C00004500",
+            "Snagged from yahoo finance (God bless yahoo finance)",
+        )
+
+    def test_option_format4(self):
+        sym = option_format(
+            symbol="TSLA",
+            exp_date="2022-09-16",
+            strike="2950.0",
+            direction="Put",  # Should work, try to break the function
+        )
+
+        self.assertEqual(
+            sym,
+            "TSLA220916P02950000",
+            "Snagged from yahoo finance (God bless yahoo finance)",
+        )
+
+    ############### Test option parameter extraction #####
+    def test_option_extraction1(self):
+        sym = "TSLA220916P02950000"
+        self.assertEqual(option_strike(sym), 2950, "Strike price of $2950.00")
+
+    def test_option_extraction2(self):
+        sym = "TSLA220916P02950000"
+        self.assertEqual(option_symbol(sym), "TSLA", "It is a TSLA option")
+
+    def test_option_extraction3(self):
+        sym = "F200724C00004500"
+        self.assertEqual(
+            option_strike(sym), 4.5, "Make sure we can extract non-integer strikes"
+        )
+
+    def test_option_extraction4(self):
+        sym = "F200724C00004500"
+        self.assertEqual(
+            option_maturity(sym), "2020-07-24", "Extract the expiration date"
+        )
diff --git a/test.py b/test.py
index 36a51c88..7ed4cb20 100644
--- a/test.py
+++ b/test.py
@@ -1,28 +1,24 @@
-import ally
-import json
-import time
 import concurrent.futures
+import logging
+
+import ally
+
+logger = logging.getLogger(__name__)
 
 a = ally.Ally()
 
-# print(h)
-def job ():
-	print("Submitting job")
-	return a.timesales('spy', startdate='2020-06-19', enddate='2020-06-19', block=False)
+
+def job():
+    logger.info("Submitting job")
+    return a.timesales("spy", startdate="2020-06-19", enddate="2020-06-19", block=False)
+
 
 with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
+    logger.info("Submitting requests")
+    # Submit all our orders
+    futures = {executor.submit(job): i for i in range(200)}
+    logger.info("Submitted!")
 
-	print("Submitting requests")
-	# Submit all our orders
-	futures = {
-		executor.submit(job): i
-		for i in range(200)
-	}
-	print("Submitted!")
-	
-	print("Getting results...")
-	for future in concurrent.futures.as_completed(futures):
-		try:
-			print(future.result(), "#{}".format(futures[future]))
-		except:
-			raise
+    logger.info("Getting results...")
+    for future in concurrent.futures.as_completed(futures):
+        logger.info("%s #%s", future.result(), futures[future])