Repository: matheusfelipeog/fordev (language: python)

Issue:
Bump babel from 2.9.0 to 2.9.1
Bumps [babel](https://github.com/python-babel/babel) from 2.9.0 to 2.9.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/python-babel/babel/releases">babel's releases</a>.</em></p>
<blockquote>
<h2>Version 2.9.1</h2>
<h1>Bugfixes</h1>
<ul>
<li>The internal locale-data loading functions now validate the name of the locale file to be loaded and only allow files within Babel's data directory.  Thank you to Chris Lyne of Tenable, Inc. for discovering the issue!</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a href="https://github.com/python-babel/babel/blob/master/CHANGES">babel's changelog</a>.</em></p>
<blockquote>
<h2>Version 2.9.1</h2>
<p>Bugfixes</p>
<pre><code>
* The internal locale-data loading functions now validate the name of the locale file to be loaded and only
  allow files within Babel's data directory.  Thank you to Chris Lyne of Tenable, Inc. for discovering the issue!
</code></pre>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/python-babel/babel/commit/a99fa2474c808b51ebdabea18db871e389751559"><code>a99fa24</code></a> Use 2.9.0's setup.py for 2.9.1</li>
<li><a href="https://github.com/python-babel/babel/commit/60b33e083801109277cb068105251e76d0b7c14e"><code>60b33e0</code></a> Become 2.9.1</li>
<li><a href="https://github.com/python-babel/babel/commit/412015ef642bfcc0d8ba8f4d05cdbb6aac98d9b3"><code>412015e</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/python-babel/babel/issues/782">#782</a> from python-babel/locale-basename</li>
<li><a href="https://github.com/python-babel/babel/commit/5caf717ceca4bd235552362b4fbff88983c75d8c"><code>5caf717</code></a> Disallow special filenames on Windows</li>
<li><a href="https://github.com/python-babel/babel/commit/3a700b5b8b53606fd98ef8294a56f9510f7290f8"><code>3a700b5</code></a> Run locale identifiers through <code>os.path.basename()</code></li>
<li><a href="https://github.com/python-babel/babel/commit/5afe2b2f11dcdd6090c00231d342c2e9cd1bdaab"><code>5afe2b2</code></a> Merge pull request <a href="https://github-redirect.dependabot.com/python-babel/babel/issues/754">#754</a> from python-babel/github-ci</li>
<li><a href="https://github.com/python-babel/babel/commit/58de8342f865df88697a4a166191e880e3c84d82"><code>58de834</code></a> Replace Travis + Appveyor with GitHub Actions (WIP)</li>
<li><a href="https://github.com/python-babel/babel/commit/d1bbc08e845d03d8e1f0dfa0e04983d755f39cb5"><code>d1bbc08</code></a> import_cldr: use logging; add -q option</li>
<li><a href="https://github.com/python-babel/babel/commit/156b7fb9f377ccf58c71cf01dc69fb10c7b69314"><code>156b7fb</code></a> Quiesce CLDR download progress bar if requested (or not a TTY)</li>
<li><a href="https://github.com/python-babel/babel/commit/613dc1700f91c3d40b081948c0dd6023d8ece057"><code>613dc17</code></a> Make the import warnings about unsupported number systems less verbose</li>
<li>Additional commits viewable in <a href="https://github.com/python-babel/babel/compare/v2.9.0...v2.9.1">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=babel&package-manager=pip&previous-version=2.9.0&new-version=2.9.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
- `@dependabot use these labels` will set the current labels as the default for future PRs for this repo and language
- `@dependabot use these reviewers` will set the current reviewers as the default for future PRs for this repo and language
- `@dependabot use these assignees` will set the current assignees as the default for future PRs for this repo and language
- `@dependabot use this milestone` will set the current milestone as the default for future PRs for this repo and language

You can disable automated security fix PRs for this repo from the [Security Alerts page](https://github.com/matheusfelipeog/fordev/network/alerts).

</details>


Discussion / hints:

Fix patch:
diff --git a/.gitignore b/.gitignore
index f8da9c5..3e97f94 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,16 +1,133 @@
-# ignore environment directories
-venv/
-.vscode/
-
-# Ignore cache of module importing
+# Byte-compiled / optimized / DLL files
 __pycache__/
+*.py[cod]
+*$py.class
 
-# Ignore credentials file
-.pypirc
+# C extensions
+*.so
 
-# Ignore files and directory of distribution
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
 dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
 *.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+.pypirc
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
+.cache
+nosetests.xml
+coverage.xml
+*.cover
+*.py,cover
+.hypothesis/
+.pytest_cache/
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
+db.sqlite3-journal
+
+# Flask stuff:
+instance/
+.webassets-cache
+
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
+
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don't work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# PEP 582; used by e.g. github.com/David-OConnor/pyflow
+__pypackages__/
+
+# Celery stuff
+celerybeat-schedule
+celerybeat.pid
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
 
-# Ignore build directory
-build/
\ No newline at end of file
+# VSCode
+.vscode
\ No newline at end of file
diff --git a/Pipfile b/Pipfile
index 62f7db1..20f2807 100644
--- a/Pipfile
+++ b/Pipfile
@@ -4,13 +4,12 @@ verify_ssl = true
 name = "pypi"
 
 [packages]
-requests = "==2.24.0"
-beautifulsoup4 = "==4.9.3"
-colorama = "==0.4.4"
+requests = ">=2.28.1"
+beautifulsoup4 = ">=4.11.1"
 
 [dev-packages]
-pylint = "2.7.2"
-sphinx = "3.5.2"
+pylint = ">=2.15.5"
+sphinx = ">=5.3.0"
 sphinx-rtd-theme = "*"
 sphinxcontrib-napoleon = "*"
 
diff --git a/Pipfile.lock b/Pipfile.lock
index 85b2fb6..fa67cf8 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
 {
     "_meta": {
         "hash": {
-            "sha256": "acaabd27cb6fe98d03e0bf6fcb14b12f4e78b828a4849d76b20f244f338d8c3a"
+            "sha256": "990a7049b5a467869f672057ced133b43f0e17dbbb36bcbcb21f243c9441b003"
         },
         "pipfile-spec": 6,
         "requires": {
@@ -18,19 +18,19 @@
     "default": {
         "beautifulsoup4": {
             "hashes": [
-                "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35",
-                "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25",
-                "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666"
+                "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30",
+                "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"
             ],
             "index": "pypi",
-            "version": "==4.9.3"
+            "version": "==4.11.1"
         },
         "certifi": {
             "hashes": [
-                "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c",
-                "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"
+                "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14",
+                "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"
             ],
-            "version": "==2020.12.5"
+            "markers": "python_version >= '3.6'",
+            "version": "==2022.9.24"
         },
         "chardet": {
             "hashes": [
@@ -39,45 +39,45 @@
             ],
             "version": "==3.0.4"
         },
-        "colorama": {
+        "charset-normalizer": {
             "hashes": [
-                "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
-                "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
+                "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845",
+                "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"
             ],
-            "index": "pypi",
-            "version": "==0.4.4"
+            "markers": "python_full_version >= '3.6.0'",
+            "version": "==2.1.1"
         },
         "idna": {
             "hashes": [
-                "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
-                "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+                "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
+                "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.10"
+            "markers": "python_version >= '3.5'",
+            "version": "==3.4"
         },
         "requests": {
             "hashes": [
-                "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
-                "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
+                "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983",
+                "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"
             ],
             "index": "pypi",
-            "version": "==2.24.0"
+            "version": "==2.28.1"
         },
         "soupsieve": {
             "hashes": [
-                "sha256:407fa1e8eb3458d1b5614df51d9651a1180ea5fedf07feb46e45d7e25e6d6cdd",
-                "sha256:d3a5ea5b350423f47d07639f74475afedad48cf41c0ad7a82ca13a3928af34f6"
+                "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759",
+                "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"
             ],
-            "markers": "python_version >= '3.0'",
-            "version": "==2.2"
+            "markers": "python_version >= '3.6'",
+            "version": "==2.3.2.post1"
         },
         "urllib3": {
             "hashes": [
-                "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2",
-                "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"
+                "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e",
+                "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
-            "version": "==1.25.11"
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'",
+            "version": "==1.26.12"
         }
     },
     "develop": {
@@ -90,26 +90,27 @@
         },
         "astroid": {
             "hashes": [
-                "sha256:21d735aab248253531bb0f1e1e6d068f0ee23533e18ae8a6171ff892b98297cf",
-                "sha256:cfc35498ee64017be059ceffab0a25bedf7548ab76f2bea691c5565896e7128d"
+                "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83",
+                "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"
             ],
-            "markers": "python_version >= '3.6'",
-            "version": "==2.5.1"
+            "markers": "python_full_version >= '3.7.2'",
+            "version": "==2.12.12"
         },
         "babel": {
             "hashes": [
-                "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5",
-                "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"
+                "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51",
+                "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.9.0"
+            "markers": "python_version >= '3.6'",
+            "version": "==2.10.3"
         },
         "certifi": {
             "hashes": [
-                "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c",
-                "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"
+                "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14",
+                "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"
             ],
-            "version": "==2020.12.5"
+            "markers": "python_version >= '3.6'",
+            "version": "==2022.9.24"
         },
         "chardet": {
             "hashes": [
@@ -118,156 +119,164 @@
             ],
             "version": "==3.0.4"
         },
-        "colorama": {
+        "charset-normalizer": {
             "hashes": [
-                "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b",
-                "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"
+                "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845",
+                "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"
             ],
-            "index": "pypi",
-            "version": "==0.4.4"
+            "markers": "python_full_version >= '3.6.0'",
+            "version": "==2.1.1"
+        },
+        "dill": {
+            "hashes": [
+                "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0",
+                "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==0.3.6"
         },
         "docutils": {
             "hashes": [
-                "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af",
-                "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"
+                "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125",
+                "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==0.16"
+            "version": "==0.17.1"
         },
         "idna": {
             "hashes": [
-                "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
-                "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
+                "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
+                "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.10"
+            "markers": "python_version >= '3.5'",
+            "version": "==3.4"
         },
         "imagesize": {
             "hashes": [
-                "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1",
-                "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"
+                "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b",
+                "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.2.0"
+            "version": "==1.4.1"
+        },
+        "importlib-metadata": {
+            "hashes": [
+                "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab",
+                "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"
+            ],
+            "markers": "python_version < '3.10'",
+            "version": "==5.0.0"
         },
         "isort": {
             "hashes": [
-                "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e",
-                "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"
+                "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7",
+                "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"
             ],
-            "markers": "python_version >= '3.6' and python_version < '4'",
-            "version": "==5.7.0"
+            "markers": "python_version < '4.0' and python_full_version >= '3.6.1'",
+            "version": "==5.10.1"
         },
         "jinja2": {
             "hashes": [
-                "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419",
-                "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"
+                "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
+                "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==2.11.3"
+            "markers": "python_version >= '3.7'",
+            "version": "==3.1.2"
         },
         "lazy-object-proxy": {
             "hashes": [
-                "sha256:1d33d6f789697f401b75ce08e73b1de567b947740f768376631079290118ad39",
-                "sha256:2f2de8f8ac0be3e40d17730e0600619d35c78c13a099ea91ef7fb4ad944ce694",
-                "sha256:3782931963dc89e0e9a0ae4348b44762e868ea280e4f8c233b537852a8996ab9",
-                "sha256:37d9c34b96cca6787fe014aeb651217944a967a5b165e2cacb6b858d2997ab84",
-                "sha256:38c3865bd220bd983fcaa9aa11462619e84a71233bafd9c880f7b1cb753ca7fa",
-                "sha256:429c4d1862f3fc37cd56304d880f2eae5bd0da83bdef889f3bd66458aac49128",
-                "sha256:522b7c94b524389f4a4094c4bf04c2b02228454ddd17c1a9b2801fac1d754871",
-                "sha256:57fb5c5504ddd45ed420b5b6461a78f58cbb0c1b0cbd9cd5a43ad30a4a3ee4d0",
-                "sha256:5944a9b95e97de1980c65f03b79b356f30a43de48682b8bdd90aa5089f0ec1f4",
-                "sha256:6f4e5e68b7af950ed7fdb594b3f19a0014a3ace0fedb86acb896e140ffb24302",
-                "sha256:71a1ef23f22fa8437974b2d60fedb947c99a957ad625f83f43fd3de70f77f458",
-                "sha256:8a44e9901c0555f95ac401377032f6e6af66d8fc1fbfad77a7a8b1a826e0b93c",
-                "sha256:b6577f15d5516d7d209c1a8cde23062c0f10625f19e8dc9fb59268859778d7d7",
-                "sha256:c8fe2d6ff0ff583784039d0255ea7da076efd08507f2be6f68583b0da32e3afb",
-                "sha256:cadfa2c2cf54d35d13dc8d231253b7985b97d629ab9ca6e7d672c35539d38163",
-                "sha256:cd1bdace1a8762534e9a36c073cd54e97d517a17d69a17985961265be6d22847",
-                "sha256:ddbdcd10eb999d7ab292677f588b658372aadb9a52790f82484a37127a390108",
-                "sha256:e7273c64bccfd9310e9601b8f4511d84730239516bada26a0c9846c9697617ef",
-                "sha256:e7428977763150b4cf83255625a80a23dfdc94d43be7791ce90799d446b4e26f",
-                "sha256:e960e8be509e8d6d618300a6c189555c24efde63e85acaf0b14b2cd1ac743315",
-                "sha256:ecb5dd5990cec6e7f5c9c1124a37cb2c710c6d69b0c1a5c4aa4b35eba0ada068",
-                "sha256:ef3f5e288aa57b73b034ce9c1f1ac753d968f9069cd0742d1d69c698a0167166",
-                "sha256:fa5b2dee0e231fa4ad117be114251bdfe6afe39213bd629d43deb117b6a6c40a",
-                "sha256:fa7fb7973c622b9e725bee1db569d2c2ee64d2f9a089201c5e8185d482c7352d"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
-            "version": "==1.5.2"
+                "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada",
+                "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d",
+                "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7",
+                "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe",
+                "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd",
+                "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c",
+                "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858",
+                "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288",
+                "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec",
+                "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f",
+                "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891",
+                "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c",
+                "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25",
+                "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156",
+                "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8",
+                "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f",
+                "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e",
+                "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0",
+                "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==1.8.0"
         },
         "markupsafe": {
             "hashes": [
-                "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473",
-                "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161",
-                "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235",
-                "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5",
-                "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42",
-                "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f",
-                "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39",
-                "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff",
-                "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b",
-                "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014",
-                "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f",
-                "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1",
-                "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e",
-                "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183",
-                "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66",
-                "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b",
-                "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1",
-                "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15",
-                "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1",
-                "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85",
-                "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1",
-                "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e",
-                "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b",
-                "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905",
-                "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850",
-                "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0",
-                "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735",
-                "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d",
-                "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb",
-                "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e",
-                "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d",
-                "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c",
-                "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1",
-                "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2",
-                "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21",
-                "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2",
-                "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5",
-                "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7",
-                "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b",
-                "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8",
-                "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6",
-                "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193",
-                "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f",
-                "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b",
-                "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f",
-                "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2",
-                "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5",
-                "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c",
-                "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032",
-                "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7",
-                "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be",
-                "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"
-            ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.1.1"
+                "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003",
+                "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88",
+                "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5",
+                "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7",
+                "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a",
+                "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603",
+                "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1",
+                "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135",
+                "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247",
+                "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6",
+                "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601",
+                "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77",
+                "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02",
+                "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e",
+                "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63",
+                "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f",
+                "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980",
+                "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b",
+                "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812",
+                "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff",
+                "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96",
+                "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1",
+                "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925",
+                "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a",
+                "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6",
+                "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e",
+                "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f",
+                "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4",
+                "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f",
+                "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3",
+                "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c",
+                "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a",
+                "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417",
+                "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a",
+                "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a",
+                "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37",
+                "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452",
+                "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933",
+                "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a",
+                "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==2.1.1"
         },
         "mccabe": {
             "hashes": [
-                "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42",
-                "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"
+                "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325",
+                "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"
             ],
-            "version": "==0.6.1"
+            "markers": "python_version >= '3.6'",
+            "version": "==0.7.0"
         },
         "packaging": {
             "hashes": [
-                "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5",
-                "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"
+                "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb",
+                "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==20.9"
+            "markers": "python_version >= '3.6'",
+            "version": "==21.3"
+        },
+        "platformdirs": {
+            "hashes": [
+                "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788",
+                "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==2.5.2"
         },
         "pockets": {
             "hashes": [
@@ -278,73 +287,73 @@
         },
         "pygments": {
             "hashes": [
-                "sha256:2656e1a6edcdabf4275f9a3640db59fd5de107d88e8663c5d4e9a0fa62f77f94",
-                "sha256:534ef71d539ae97d4c3a4cf7d6f110f214b0e687e92f9cb9d2a3b0d3101289c8"
+                "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1",
+                "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==2.8.1"
+            "markers": "python_version >= '3.6'",
+            "version": "==2.13.0"
         },
         "pylint": {
             "hashes": [
-                "sha256:0e21d3b80b96740909d77206d741aa3ce0b06b41be375d92e1f3244a274c1f8a",
-                "sha256:d09b0b07ba06bcdff463958f53f23df25e740ecd81895f7d2699ec04bbd8dc3b"
+                "sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df",
+                "sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004"
             ],
             "index": "pypi",
-            "version": "==2.7.2"
+            "version": "==2.15.5"
         },
         "pyparsing": {
             "hashes": [
-                "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1",
-                "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"
+                "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
+                "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
             ],
-            "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==2.4.7"
+            "markers": "python_full_version >= '3.6.8'",
+            "version": "==3.0.9"
         },
         "pytz": {
             "hashes": [
-                "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da",
-                "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"
+                "sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22",
+                "sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914"
             ],
-            "version": "==2021.1"
+            "version": "==2022.5"
         },
         "requests": {
             "hashes": [
-                "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b",
-                "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"
+                "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983",
+                "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"
             ],
             "index": "pypi",
-            "version": "==2.24.0"
+            "version": "==2.28.1"
         },
         "six": {
             "hashes": [
-                "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259",
-                "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"
+                "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926",
+                "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"
             ],
             "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
-            "version": "==1.15.0"
+            "version": "==1.16.0"
         },
         "snowballstemmer": {
             "hashes": [
-                "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2",
-                "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"
+                "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1",
+                "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"
             ],
-            "version": "==2.1.0"
+            "version": "==2.2.0"
         },
         "sphinx": {
             "hashes": [
-                "sha256:672cfcc24b6b69235c97c750cb190a44ecd72696b4452acaf75c2d9cc78ca5ff",
-                "sha256:ef64a814576f46ec7de06adf11b433a0d6049be007fefe7fd0d183d28b581fac"
+                "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d",
+                "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"
             ],
             "index": "pypi",
-            "version": "==3.5.2"
+            "version": "==5.3.0"
         },
         "sphinx-rtd-theme": {
             "hashes": [
-                "sha256:eda689eda0c7301a80cf122dad28b1861e5605cbf455558f3775e1e8200e83a5",
-                "sha256:fa6bebd5ab9a73da8e102509a86f3fcc36dec04a0b52ea80e5a033b2aba00113"
+                "sha256:4d35a56f4508cfee4c4fb604373ede6feae2a306731d533f409ef5c3496fdbd8",
+                "sha256:eec6d497e4c2195fa0e8b2016b337532b8a699a68bcb22a512870e16925c6a5c"
             ],
             "index": "pypi",
-            "version": "==0.5.1"
+            "version": "==1.0.0"
         },
         "sphinxcontrib-applehelp": {
             "hashes": [
@@ -364,11 +373,11 @@
         },
         "sphinxcontrib-htmlhelp": {
             "hashes": [
-                "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f",
-                "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"
+                "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07",
+                "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"
             ],
-            "markers": "python_version >= '3.5'",
-            "version": "==1.0.3"
+            "markers": "python_version >= '3.6'",
+            "version": "==2.0.0"
         },
         "sphinxcontrib-jsmath": {
             "hashes": [
@@ -396,11 +405,11 @@
         },
         "sphinxcontrib-serializinghtml": {
             "hashes": [
-                "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc",
-                "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"
+                "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd",
+                "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"
             ],
             "markers": "python_version >= '3.5'",
-            "version": "==1.1.4"
+            "version": "==1.1.5"
         },
         "toml": {
             "hashes": [
@@ -410,19 +419,115 @@
             "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
             "version": "==0.10.2"
         },
+        "tomli": {
+            "hashes": [
+                "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc",
+                "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"
+            ],
+            "markers": "python_version < '3.11'",
+            "version": "==2.0.1"
+        },
+        "tomlkit": {
+            "hashes": [
+                "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b",
+                "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"
+            ],
+            "markers": "python_version >= '3.6'",
+            "version": "==0.11.6"
+        },
+        "typing-extensions": {
+            "hashes": [
+                "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa",
+                "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"
+            ],
+            "markers": "python_version < '3.10'",
+            "version": "==4.4.0"
+        },
         "urllib3": {
             "hashes": [
-                "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2",
-                "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"
+                "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e",
+                "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"
             ],
-            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'",
-            "version": "==1.25.11"
+            "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'",
+            "version": "==1.26.12"
         },
         "wrapt": {
             "hashes": [
-                "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"
-            ],
-            "version": "==1.12.1"
+                "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3",
+                "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b",
+                "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4",
+                "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2",
+                "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656",
+                "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3",
+                "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff",
+                "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310",
+                "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a",
+                "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57",
+                "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069",
+                "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383",
+                "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe",
+                "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87",
+                "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d",
+                "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b",
+                "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907",
+                "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f",
+                "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0",
+                "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28",
+                "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1",
+                "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853",
+                "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc",
+                "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3",
+                "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3",
+                "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164",
+                "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1",
+                "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c",
+                "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1",
+                "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7",
+                "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1",
+                "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320",
+                "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed",
+                "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1",
+                "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248",
+                "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c",
+                "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456",
+                "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77",
+                "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef",
+                "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1",
+                "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7",
+                "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86",
+                "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4",
+                "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d",
+                "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d",
+                "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8",
+                "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5",
+                "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471",
+                "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00",
+                "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68",
+                "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3",
+                "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d",
+                "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735",
+                "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d",
+                "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569",
+                "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7",
+                "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59",
+                "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5",
+                "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb",
+                "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b",
+                "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f",
+                "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462",
+                "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015",
+                "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"
+            ],
+            "markers": "python_version < '3.11'",
+            "version": "==1.14.1"
+        },
+        "zipp": {
+            "hashes": [
+                "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1",
+                "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"
+            ],
+            "markers": "python_version >= '3.7'",
+            "version": "==3.10.0"
         }
     }
 }
diff --git a/README.md b/README.md
index 20cb06c..015b2b1 100644
--- a/README.md
+++ b/README.md
@@ -6,16 +6,13 @@
     <sup>Metadata</sup>
     <br />
     <a href="https://pypi.org/project/fordev/">
-        <img alt="PyPI" src="https://img.shields.io/pypi/v/fordev" />
-    </a>
-    <a href="https://github.com/matheusfelipeog/fordev/releases">
-        <img alt="GitHub release (latest by date)" src="https://img.shields.io/github/v/release/matheusfelipeog/fordev" />
+        <img alt="PyPI - Version" src="https://img.shields.io/pypi/v/fordev" />
     </a>
     <a href="https://github.com/matheusfelipeog/fordev/blob/master/LICENSE">
-        <img src="https://img.shields.io/github/license/matheusfelipeog/fordev" alt="License MIT" />
+        <img alt="License MIT" src="https://img.shields.io/github/license/matheusfelipeog/fordev" />
     </a>
-    <a href="https://pypi.org/project/fordev/">
-        <img alt="Downloads in month" src="https://img.shields.io/pypi/dm/fordev" />
+    <a href="https://pepy.tech/project/fordev">
+        <img alt="Total Downloads" src="https://pepy.tech/badge/fordev" />
     </a>
 </p>
 
diff --git a/docs/source/conf.py b/docs/source/conf.py
index c6ac232..bc083aa 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -14,7 +14,7 @@
 import sys
 sys.path.insert(0, os.path.abspath('../..'))
 
-from fordev.__about__ import __version__
+from fordev import __version__
 
 # -- Project information -----------------------------------------------------
 
diff --git a/docs/source/fordev/core.rst b/docs/source/fordev/core.rst
index c32eb16..8328f58 100644
--- a/docs/source/fordev/core.rst
+++ b/docs/source/fordev/core.rst
@@ -1,6 +1,5 @@
 .. automodule:: fordev.core
     :no-members:
 
-.. autofunction:: fordev.core._random_user_agent
 .. autofunction:: fordev.core._create_headers
 .. autofunction:: fordev.core.fordev_request
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 23e868d..a32184b 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -12,21 +12,21 @@
 Documentação Oficial
 ====================
 
-.. image:: https://img.shields.io/pypi/status/fordev
-    :alt: PyPI - Status
+.. image:: https://img.shields.io/pypi/v/fordev
+    :alt: PyPI - Version
     :target: https://pypi.org/project/fordev/
 
-.. image:: https://img.shields.io/pypi/dm/fordev
-    :alt: Downloads in month
-    :target: https://pypi.org/project/fordev/
+.. image:: https://img.shields.io/github/license/matheusfelipeog/fordev
+    :alt: License MIT
+    :target: https://github.com/matheusfelipeog/fordev/blob/master/LICENSE
 
-.. image:: https://img.shields.io/pypi/v/fordev
-    :alt: PyPI
-    :target: https://pypi.org/project/fordev/
+.. image:: https://pepy.tech/badge/fordev
+    :alt: Total Downloads
+    :target: https://pepy.tech/project/fordev
 
-.. image:: https://img.shields.io/github/v/release/matheusfelipeog/fordev
-    :alt: GitHub release (latest by date)
-    :target: https://github.com/matheusfelipeog/fordev/releases
+.. image:: https://img.shields.io/pypi/status/fordev
+    :alt: PyPI - Status
+    :target: https://pypi.org/project/fordev/
 
 .. image:: https://readthedocs.org/projects/fordev/badge/?version=latest
     :alt: Documentation Status
@@ -36,10 +36,6 @@ Documentação Oficial
     :alt: Test Status
     :target: https://github.com/matheusfelipeog/fordev/actions/workflows/tests.yml
 
-.. image:: https://img.shields.io/github/license/matheusfelipeog/fordev
-    :alt: License MIT
-    :target: https://github.com/matheusfelipeog/fordev/blob/master/LICENSE
-
 
 .. toctree::
     :hidden:
diff --git a/fordev/__about__.py b/fordev/__about__.py
deleted file mode 100644
index 4cabe0c..0000000
--- a/fordev/__about__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-# -*- coding: utf-8 -*-
-"""Metadados do projeto."""
-
-__version__ = '1.0.3'
-__author__ = 'Matheus Felipe'
-__email__ = 'matheusfelipeog@protonmail.com'
-__author_github__ = 'https://github.com/matheusfelipeog'
-__project_github__ = 'https://github.com/matheusfelipeog/fordev'
diff --git a/fordev/__init__.py b/fordev/__init__.py
index 19c4866..617d685 100644
--- a/fordev/__init__.py
+++ b/fordev/__init__.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """
 fordev
 ------
@@ -46,22 +45,11 @@
     'consts'
 ]
 
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
+__version__ = '1.0.4'
+__author__ = 'Matheus Felipe'
+__email__ = 'matheusfelipeog@protonmail.com'
 
 from fordev import generators
 from fordev import validators
 from fordev import filters
 from fordev import consts
-
-from fordev.utils import CheckVersion
-
-
-# Check if a newer version of fordev package
-CheckVersion.run(
-    current_version=__version__,
-    package_name='fordev'
-)
diff --git a/fordev/consts.py b/fordev/consts.py
index 18822e4..1e76da0 100644
--- a/fordev/consts.py
+++ b/fordev/consts.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """
 fordev.consts
 -------------
@@ -6,29 +5,8 @@
 Este módulo contém todas as variáveis com valores constantes usadas no pacote fordev.
 """
 
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
-
-
 URL_4DEV_API = 'https://www.4devs.com.br/ferramentas_online.php'
 
-USER_AGENTS = [
-    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36',
-    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36',
-    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
-    'Mozilla/5.0 CK={} (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
-    'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko',
-    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; KTXN)',
-    'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2)',
-    'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 OPR/43.0.2442.991',
-    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.78',
-    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.64',
-    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko)',
-]
-
 ALL_UF_CODE = [
     'AC', 'AL', 'AP', 'AM', 'BA', 'CE', 'ES', 'GO', 'MA',
     'MT', 'MS', 'MG','PA', 'PB', 'PR', 'PE', 'PI', 'RJ',
diff --git a/fordev/core.py b/fordev/core.py
index 2a5c8af..9418470 100644
--- a/fordev/core.py
+++ b/fordev/core.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """
 fordev.core
 -----------
@@ -8,29 +7,14 @@
 
 __all__ = ['fordev_request']
 
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
-
-from random import choice
-
 import requests
 
 from fordev.consts import URL_4DEV_API
-from fordev.consts import USER_AGENTS
-
-
-def _random_user_agent() -> str:
-    """Obtenha um user agent aleatório."""
-
-    return choice(USER_AGENTS)
 
 
 def _create_headers(content_length: int, referer: str) -> dict:
     """Gere o header para ser enviado em requests HTTP para o site 4devs.
-    
+
     Parameters
     ----------
     content_length
@@ -43,32 +27,35 @@ def _create_headers(content_length: int, referer: str) -> dict:
     """
 
     headers = {
-        "user-agent": _random_user_agent(),
-        "authority": "www.4devs.com.br",
-        "method": "POST",
-        "path": "/ferramentas_online.php",
-        "scheme": "https",
-        "accept": "*/*",
-        "accept-encoding": "gzip, deflate, br",
-        "accept-language": "pt,en-US;q=0.9,en;q=0.8",
-        "content-length": str(content_length),
-        "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
-        "dnt": "1",
-        "origin": "https://www.4devs.com.br",
-        "referer": "https://www.4devs.com.br/{}".format(referer),
-        "sec-fetch-dest": "empty",
-        "sec-fetch-mode": "cors",
-        "sec-fetch-site": "same-origin",
-        "x-requested-with": "XMLHttpRequest"
+        'user-agent': (
+            'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
+            'Chrome/106.0.0.0 Safari/537.36'
+        ),
+        'authority': 'www.4devs.com.br',
+        'method': 'POST',
+        'path': '/ferramentas_online.php',
+        'scheme': 'https',
+        'accept': '*/*',
+        'accept-encoding': 'gzip, deflate, br',
+        'accept-language': 'pt,en-US;q=0.9,en;q=0.8',
+        'content-length': str(content_length),
+        'content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
+        'dnt': '1',
+        'origin': 'https://www.4devs.com.br',
+        'referer': f'https://www.4devs.com.br/{referer}',
+        'sec-fetch-dest': 'empty',
+        'sec-fetch-mode': 'cors',
+        'sec-fetch-site': 'same-origin',
+        'x-requested-with': 'XMLHttpRequest'
     }
 
     return headers
 
 
 def fordev_request(content_length: int, referer: str, payload: dict) -> dict:
-    """Cria uma request HTTP a API do site 4devs e 
+    """Cria uma request HTTP a API do site 4devs e
     retorna seu conteúdo em formato de dicionário.
-    
+
     Parameters
     ----------
     content_length
@@ -86,14 +73,12 @@ def fordev_request(content_length: int, referer: str, payload: dict) -> dict:
         response = requests.post(
             url=URL_4DEV_API,
             headers=_create_headers(content_length, referer),
-            data=payload
+            data=payload,
+            timeout=10
         )
 
-        # Check if the status code is between 400 to 600,
-        # if yes it returns an error message and the error.
         response.raise_for_status()
-        
-        # On success, returns a message and data.
+
         return {
             'msg': 'success',
             'data': response.text
diff --git a/fordev/filters.py b/fordev/filters.py
index 1797a34..45b9ff2 100644
--- a/fordev/filters.py
+++ b/fordev/filters.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """
 fordev.filters
 --------------
@@ -17,21 +16,15 @@
     'filter_city_name'
 ]
 
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
-
 from bs4 import BeautifulSoup
 
 
 def data_format(data_only: bool, data_dict: dict) -> dict:
     """Filtra os dados conforme especificado."""
-    
+
     if data_only and data_dict['msg'] == 'success':
         return data_dict['data']
-    
+
     return data_dict
 
 
@@ -47,10 +40,8 @@ def filter_bank_account_info(html: str) -> dict:
 
     soup = BeautifulSoup(html, 'html.parser')
 
-    # Get all the labels to use as a key in the dictionary return.
     labels = [div.text for div in soup.find_all('div', 'output-subtitle')]
 
-    # Get all the data to use as a value in the dictionary return.
     data_of_bank_account = [div.text for div in soup.find_all('div', 'output-txt')]
 
     data_dict = dict(
@@ -72,10 +63,8 @@ def filter_vehicle_info(html: str) -> dict:
 
     soup = BeautifulSoup(html, 'html.parser')
 
-    # Get all the labels to use as a key in the dictionary return.
     labels = [div.text[:-1] for div in soup.find_all('strong')]
 
-    # Get all the data to use as a value in the dictionary return.
     data_of_vehicle = [input_.get('value') for input_ in soup.find_all('input', 'margem_menor')]
 
     data_dict = dict(
@@ -97,10 +86,8 @@ def filter_credit_card_info(html: str) -> dict:
 
     soup = BeautifulSoup(html, 'html.parser')
 
-    # Get all the labels to use as a key in the dictionary return.
     labels = [div.text for div in soup.find_all('div', 'output-subtitle')]
 
-    # Get all the data to use as a value in the dictionary return.
     data_of_credit_card = [div.text.strip() for div in soup.find_all('div', 'output-txt')]
 
     data_dict = dict(
@@ -122,10 +109,8 @@ def filter_company_info(html: str) -> dict:
 
     soup = BeautifulSoup(html, 'html.parser')
 
-    # Get all the labels to use as a key in the dictionary return.
     labels = [div.text[:-1] for div in soup.find_all('strong')]
 
-    # Get all the data to use as a value in the dictionary return.
     data_of_company = [input_.get('value') for input_ in soup.find_all('input', 'margem_menor')]
 
     data_dict = dict(
@@ -147,7 +132,6 @@ def filter_city_name(html: str) -> list:
 
     soup = BeautifulSoup(html, 'html.parser')
 
-    # Get text (city name) in option tag.
     return [
         option.text for option in soup.find_all('option')[1:]
     ]
diff --git a/fordev/generators.py b/fordev/generators.py
deleted file mode 100644
index 5131d61..0000000
--- a/fordev/generators.py
+++ /dev/null
@@ -1,601 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-fordev.generators
------------------
-
-Este módulo coleta dados aleatórios gerados pelo site `4Devs <https://www.4devs.com.br/>`_ 
-e disponíbiliza uma API simples para uso.
-
-Use a função ``help()`` para mais informações:
-
->>> from fordev import generators
->>> help(generators)
-Help on module fordev.generators in fordev:
-
-NAME
-    fordev.generators
-
-DESCRIPTION
-(...)
-
-Ou consulte a documentação oficial.
-
-Note
-----
-Muitas funções do módulo ``fordev.generators`` contém parâmetros em comum,
-todos estão descrito abaixo.
-
-Parameters
-----------
-uf_code: str
-    Recebe o Código da **Unidade Federativa** para geração do dado.
-    
-    Caso não saiba o que é ou não conheça o do estado que necessita, 
-    obtenha mais informações em: https://pt.wikipedia.org/wiki/Subdivis%C3%B5es_do_Brasil
-
-formatting: bool
-    Se receber o valor ``True``, retorna os dados formatados.
-    Se receber o valor ``False``, retorna os dados sem formatação.
-
-data_only: bool
-    Se receber o valor ``True``, retorna somente os dados em texto puro.
-    Se receber o valor ``False``, retorna um dicionário contendo uma chave ``msg`` e ``data`` ou ``error``
-    contendo valores correspondentes à nomenclatura de suas chaves.
-
-Sendo assim, sempre que os encontrar, utilize conforme o descrito acima.
-"""
-
-__all__ = [
-    'certificate',
-    'cnh',
-    'bank_account',
-    'cpf',
-    'pis_pasep',
-    'renavam',
-    'vehicle',
-    'vehicle_brand',
-    'vehicle_plate',
-    'cnpj',
-    'rg',
-    'state_registration',
-    'voter_title',
-    'credit_card',
-    'people',
-    'company',
-    'uf',
-    'city'
-]
-
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
-
-from json import loads as json_loads
-
-from random import sample as random_sample
-from random import choice as random_choice
-
-from fordev.core import fordev_request
-
-from fordev.consts import ALL_UF_CODE
-from fordev.consts import ALL_VEHICLE_BRANDS
-from fordev.consts import ALL_BANK_FLAGS
-
-from fordev.validators import raise_for_invalid_uf
-
-from fordev.filters import data_format
-from fordev.filters import filter_city_name
-from fordev.filters import filter_vehicle_info
-from fordev.filters import filter_credit_card_info
-from fordev.filters import filter_bank_account_info
-from fordev.filters import filter_company_info
-
-
-def certificate(type_: str='I', formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código de certidões (birth, wedding, religious wedding and death) aleatórias.
-    
-    Parameters
-    ----------
-    type_
-        O tipo da certidão para geração do código.
-
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-    """
-
-    type_ = type_.upper()
-
-    certificate_types = {'I': 'Indiferente', 'B': 'nascimento', 'W': 'casamento', 'R': 'casamento_religioso', 'D': 'obito'}
-
-    # If type_ not exists in certificate_types, raise exception.
-    if not certificate_types.get(type_, False):
-        msg_error = f'The certificate type "{type_}" is invalid. Enter a valid type.'
-        msg_error += f' Ex: "B" = Birth, "W" = Wedding, "R" = Religious Wedding, "D" = Death and "I" = Indifferent (Default).'
-
-        raise ValueError(msg_error)
-
-    r = fordev_request(
-        content_length=67,  # Max of bytes for generate certificate in all possibilities.
-        referer='gerador_numero_certidoes', 
-        payload={
-            'acao': 'gerador_certidao',
-            'pontuacao': 'S' if formatting else 'N',
-            'tipo_certidao': certificate_types.get(type_)
-        }
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def cnh(data_only: bool=True) -> str:
-    """Random generate of CNH(Carteira Nacional de Habilitação)."""
-
-    r = fordev_request(
-        content_length=14,
-        referer='gerador_de_cnh',
-        payload={'acao': 'gerar_cnh'}
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def bank_account(bank: int=0, uf_code: str='', data_only: bool=True) -> dict:
-    """Gere dados de conta bancária.
-    
-    Parameters
-    ----------
-    bank
-        Recebe um valor númerico de 0 a 5 que representa a
-        bandeira do banco da conta bancária a ser gerada.
-
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-    """
-
-    if not (0 <= bank <= 5):
-        msg_error = f'The bank code value "{bank}" is invalid. Enter a valid bank code.'
-        msg_error += f' The range is 0 to 5.'
-
-        raise ValueError(msg_error)
-
-    # Replace the bank number with the bank code used in 4devs.
-    bank = ['', 2, 121, 85, 120, 151][bank]  # Use the index for get the bank code.
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code, include_blank=True)
-
-    r = fordev_request(
-        content_length=45,
-        referer='gerador_conta_bancaria',
-        payload={
-            'acao': 'gerar_conta_bancaria',
-            'estado': uf_code,
-            'banco': bank
-        }
-    )
-    
-    # Replace data in html format with bank account info only.
-    r['data'] = filter_bank_account_info(r['data'])
-    
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def cpf(uf_code: str='', formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código de um CPF(Cadastro de Pessoas Físicas) aleatório."""
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code, include_blank=True)
-
-    r = fordev_request(
-        content_length=38 if uf_code == '' else 40,
-        referer='gerador_de_cpf',
-        payload={
-            'acao': 'gerar_cpf',
-            'pontuacao': 'S' if formatting else 'N',
-            'cpf_estado': uf_code
-        }
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def pis_pasep(formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código do PIS/PASEP aleatório."""
-
-    r = fordev_request(
-        content_length=26,
-        referer='gerador_de_pis_pasep',
-        payload={
-            'acao': 'gerar_pis',
-            'pontuacao': 'S' if formatting else 'N'
-        }
-    )
-    
-    return data_format(data_only=data_only, data_dict=r)    
-
-
-def renavam(data_only: bool=True) -> str:
-    """Gere o código do RENAVAM(Registro Nacional de Veículos Automotores) aleatório."""
-
-    r = fordev_request(
-        content_length=18,
-        referer='gerador_de_renavam',
-        payload={'acao': 'gerar_renavam'}
-    )
-
-    return data_format(data_only=data_only, data_dict=r) 
-
-
-def vehicle(brand_code: int=0, uf_code: str='', formatting: bool=True, data_only: bool=True) -> dict:
-    """Gere dados de veículo aleatório.
-    
-    Parameters
-    ----------
-    brand
-        Recebe um valor númerico de 0 a 87 que representa a marca do carro para
-        geração dos dados aleatórios.
-
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-    """
-
-    if not (0 <= brand_code <= 87):
-        msg_error = f'The vehicle brand code value "{brand_code}" is invalid. Enter a valid vehicle brand code.'
-        msg_error += f' The range is 0 to 87.'
-
-        raise ValueError(msg_error)
-
-    # Replace the brand code with the brand code used in 4devs.
-    if brand_code != 0:
-        brand_code = ALL_VEHICLE_BRANDS[brand_code]['code']
-    else:
-        brand_code = ''
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code, include_blank=True)
-
-    r = fordev_request(
-        content_length=62,  # Max of bytes for generate vehicle data in all possibilities.
-        referer='gerador_de_veiculos',
-        payload={
-            'acao': 'gerar_veiculo',
-            'pontuacao': 'S' if formatting else 'N',
-            'estado': uf_code,
-            'fipe_codigo_marca': brand_code
-        }
-    )
-    
-    # Replace data in html format with bank account info only.
-    r['data'] = filter_vehicle_info(r['data'])
-    
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def vehicle_brand(n: int=1, data_only: bool=True) -> list:
-    """Obtenha o nome de marca(s) de veículo(s).
-
-    Parameters
-    ----------
-    n
-        Recebe o número de marcas de veículos a ser gerado. O valor mínimo é 1 e o máximo é 87.
-    """
-
-    if not (1 <= n <= 87):
-        msg_error = f'The n value "{n}" is invalid. Enter a valid number of UF.'
-        msg_error += f' The range is 1 to 27 UF code.'
-
-        raise ValueError(msg_error)
-    
-    full_data = {
-        'msg': 'success', 
-        'data': random_sample(
-            [v_brand['brand_name'] for v_brand in ALL_VEHICLE_BRANDS.values()],  # Create a list brand name
-            n 
-        )
-    }
-
-    if data_only:
-        return full_data['data']
-    else:
-        return full_data
-
-
-def vehicle_plate(uf_code: str='', formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código da placa de veículo aleatório."""
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code, include_blank=True)
-
-    r = fordev_request(
-        content_length=36 if uf_code == '' else 38,
-        referer='gerador_de_placa_automoveis',
-        payload={
-            'acao': 'gerar_placa',
-            'pontuacao': 'S' if formatting else 'N',
-            'estado':uf_code
-        }
-    )
-    
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def cnpj(formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código do CNPJ(Cadastro Nacional da Pessoa Jurídica) aleatório."""
-
-    r = fordev_request(
-        content_length=27,
-        referer='gerador_de_cnpj',
-        payload={
-            'acao': 'gerar_cnpj',
-            'pontuacao': 'S' if formatting else 'N',
-        }
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def rg(formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código do RG(Registro Geral) aleatório, emitido por SSP-SP."""
-
-    r = fordev_request(
-        content_length=25,
-        referer='gerador_de_rg',
-        payload={
-            'acao': 'gerar_rg',
-            'pontuacao': 'S' if formatting else 'N',
-        }
-    )
-    
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def state_registration(uf_code: str='SP', formatting: bool=True, data_only: bool=True) -> str:
-    """Gere o código de registro de estado aleatório."""
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code)
-
-    r = fordev_request(
-        content_length=35,
-        referer='gerador_de_inscricao_estadual',
-        payload={
-            'acao': 'gerar_ie',
-            'pontuacao': 'S' if formatting else 'N',
-            'estado': uf_code
-        }
-    )
-    
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def voter_title(uf_code: str, data_only: bool=True) -> str:
-    """Gere o código do título de eleitor aleatório, conforme o UF especificado."""
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code)
-
-    r = fordev_request(
-        content_length=35,
-        referer='gerador_de_titulo_de_eleitor',
-        payload={
-            'acao': 'gerar_titulo_eleitor',
-            'estado': uf_code
-        }
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def credit_card(bank: int=0, formatting: bool=True, data_only: bool=True) -> dict:
-    """Gere dados de cartão de crédito aleatório.
-    
-    Parameters
-    ----------
-    bank
-        Recebe um valor númerico de 0 a 10 representando a
-        bandeira do cartão de crédito a ser gerado.
-        
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-    """
-
-    if not (0 <= bank <= 10):
-        msg_error = f'The bank code value "{bank}" is invalid. Enter a valid bank code.'
-        msg_error += f' The range is 0 to 10.'
-
-        raise ValueError(msg_error)
-
-    # Replace the bank code with the bank flag used in 4devs.
-    if bank != 0:
-        bank = ALL_BANK_FLAGS[bank]
-    else:
-        bank = random_choice(
-            list(ALL_BANK_FLAGS.values())
-        ) 
-
-    r = fordev_request(
-        content_length=43,
-        referer='gerador_de_numero_cartao_credito',
-        payload={
-            'acao': 'gerar_cc',
-            'pontuacao': 'S' if formatting else 'N',
-            'bandeira': bank
-        }
-    )
-    
-    # Replace data in html format with credit card info only.
-    r['data'] = filter_credit_card_info(r['data'])
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def people(
-        n: int=1,
-        sex: str='R',
-        age: int=0,
-        uf_code: str='',
-        formatting: bool=True,
-        data_only: bool=True
-    ) -> str:
-    """Gere dados de pessoa(s) aleatório(s)
-    
-    Parameters
-    ----------
-    n
-        O número de pessoas a ter dados gerados. O mínimo é 1 e o máximo é 30.
-
-    sex
-        Uma string representando o sexo da pessoa para geração dos dados.
-        
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-
-    age
-        A idade da pessoa para geração dos dados. A idade mínima é 18 e a máxima é 80.
-    """
-    
-    sex = sex.upper()
-
-    uf_code = uf_code.upper()
-
-    if not (1 <= n <= 30):
-        msg_error = f'The n value "{n}" is invalid. Enter a valid number of people.'
-        msg_error += f' The range is 1 to 30 peoples.'
-
-        raise ValueError(msg_error)
-
-    if sex not in ['M', 'F', 'R']:
-        msg_error = f'The sex "{sex}" is invalid. Enter a valid sex.'
-        msg_error += f' Ex: "M" = Male, "F" = Feminine or "R" = Random.'
-
-        raise ValueError(msg_error)
-
-    if not (18 <= age <= 80) and age != 0:
-        msg_error = f'The age "{age}" is invalid. Enter a valid age.'
-        msg_error += f' The range is 18 to 80 age'
-
-        raise ValueError(msg_error)
-    
-    raise_for_invalid_uf(uf=uf_code, include_blank=True)
-
-    r = fordev_request(
-        content_length=99,  # Max of bytes for generate people in all possibilities.
-        referer='gerador_de_pessoas',
-        payload={
-            'acao': 'gerar_pessoa',
-            'sexo': 'H' if sex == 'M' else 'M' if sex == 'F' else 'I',  # H, M and I flags are used in 4devs for filter.
-            'pontuacao': 'S' if formatting else 'N',
-            'idade': age,
-            'cep_estado': uf_code,
-            'txt_qtde': n,
-
-            # If the state is not selected, a default flag is used for the city ('Selecione o estado!') or
-            # If the state is selected and city is not selected, a default flag is used for the city ('').
-            'cep_cidade': 'Selecione o estado!' if uf_code == '' else ''
-        }
-    )
-
-    if data_only and r['msg'] == 'success':
-        return json_loads(r['data'])
-    
-    if r['msg'] == 'success':
-
-        # Convert data in str to dict.
-        r['data'] = json_loads(r['data'])
-
-        return r
-    
-    # In case of failure, return msg status and msg error.
-    return r
-
-
-def company(uf_code: str='SP', age: int=1, formatting: bool=True, data_only: bool=True) -> dict:
-    """Gere dados de companhia (empresa/organização) aleatório.
-    
-    Parameters
-    ----------
-    age
-        Representa o tempo de existência da companhia (a idade da companhia).
-    """
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code)
-
-    if not (1 <= age <= 30):
-        msg_error = f'The company age value "{age}" is invalid. Enter a valid company age.'
-        msg_error += f' The range is 1 to 30.'
-
-        raise ValueError(msg_error)
-
-    r = fordev_request(
-        content_length=48,
-        referer='gerador_de_empresas',
-        payload={
-            'acao': 'gerar_empresa',
-            'pontuacao': 'S' if formatting else 'N',
-            'estado': uf_code,
-            'idade': age
-        }
-    )
-    
-    # Replace data in html format with company info only.
-    r['data'] = filter_company_info(r['data'])
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def uf(n: int=1, data_only: bool=True) -> list:
-    """Gere o código da UF(Unidade Federativa) aleatório.
-
-    Parameters
-    ----------
-    n
-        O número de UF's para geração do dado. O mínimo é 1 e o máximo é 27.
-    """
-
-    if not (1 <= n <= 27):
-        msg_error = f'The n value "{n}" is invalid. Enter a valid number of UF.'
-        msg_error += f' The range is 1 to 27 UF code.'
-
-        raise ValueError(msg_error)
-    
-    full_data = {
-        'msg': 'success', 
-        'data': random_sample(ALL_UF_CODE, n)
-        }
-
-    if data_only:
-        return full_data['data']
-    else:
-        return full_data
-
-
-def city(uf_code: str='SP', data_only: bool=True) -> list:
-    """Obtenha as cidades do UF especificado."""
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code)
-
-    r = fordev_request(
-        content_length=35,
-        referer='gerador_de_pessoas',
-        payload={
-            'acao': 'carregar_cidades',
-            'cep_estado': uf_code
-        }
-    )
-    
-    # Replace data in html format with city names only
-    r['data'] = filter_city_name(r['data'])
-
-    return data_format(data_only=data_only, data_dict=r)
diff --git a/fordev/generators/__init__.py b/fordev/generators/__init__.py
new file mode 100644
index 0000000..242d8f2
--- /dev/null
+++ b/fordev/generators/__init__.py
@@ -0,0 +1,83 @@
+"""
+fordev.generators
+-----------------
+
+Este módulo coleta dados aleatórios gerados pelo site `4Devs <https://www.4devs.com.br/>`_
+e disponíbiliza uma API simples para uso.
+
+Use a função ``help()`` para mais informações:
+
+>>> from fordev import generators
+>>> help(generators)
+Help on module fordev.generators in fordev:
+
+NAME
+    fordev.generators
+
+DESCRIPTION
+(...)
+
+Ou consulte a documentação oficial.
+
+Note
+----
+Muitas funções do módulo ``fordev.generators`` contém parâmetros em comum,
+todos estão descrito abaixo.
+
+Parameters
+----------
+uf_code: str
+    Recebe o Código da **Unidade Federativa** para geração do dado.
+
+    Caso não saiba o que é ou não conheça o do estado que necessita,
+    obtenha mais informações em: https://pt.wikipedia.org/wiki/Subdivis%C3%B5es_do_Brasil
+
+formatting: bool
+    Se receber o valor ``True``, retorna os dados formatados.
+    Se receber o valor ``False``, retorna os dados sem formatação.
+
+data_only: bool
+    Se receber o valor ``True``, retorna somente os dados em texto puro.
+    Se receber o valor ``False``, retorna um dicionário contendo uma chave ``msg`` e ``data`` ou ``error``
+    contendo valores correspondentes à nomenclatura de suas chaves.
+
+Sendo assim, sempre que os encontrar, utilize conforme o descrito acima.
+"""
+
+__all__ = [
+    'certificate',
+    'cnh',
+    'bank_account',
+    'cpf',
+    'pis_pasep',
+    'renavam',
+    'vehicle',
+    'vehicle_brand',
+    'vehicle_plate',
+    'cnpj',
+    'rg',
+    'state_registration',
+    'voter_title',
+    'credit_card',
+    'people',
+    'company',
+    'uf',
+    'city'
+]
+
+from fordev.generators.certificate import certificate
+from fordev.generators.cnh import cnh
+from fordev.generators.bank_account import bank_account
+from fordev.generators.cpf import cpf
+from fordev.generators.pis_pasep import pis_pasep
+from fordev.generators.renavam import renavam
+from fordev.generators.vehicle import vehicle, vehicle_brand, vehicle_plate
+from fordev.generators.cnpj import cnpj
+from fordev.generators.rg import rg
+from fordev.generators.state_registration import state_registration
+from fordev.generators.voter_title import voter_title
+from fordev.generators.credit_card import credit_card
+from fordev.generators.people import people
+from fordev.generators.company import company
+from fordev.generators.uf import uf
+from fordev.generators.city import city
diff --git a/fordev/generators/bank_account.py b/fordev/generators/bank_account.py
new file mode 100644
index 0000000..5e4fabe
--- /dev/null
+++ b/fordev/generators/bank_account.py
@@ -0,0 +1,53 @@
+"""
+fordev.generators.bank_account
+------------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+from fordev.filters import filter_bank_account_info
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+
+def bank_account(bank: int=0, uf_code: str='', data_only: bool=True) -> dict:
+    """Gere dados de conta bancária.
+
+    Parameters
+    ----------
+    bank
+        Recebe um valor númerico de 0 a 5 que representa a
+        bandeira do banco da conta bancária a ser gerada.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+    """
+
+    if not (0 <= bank <= 5):
+        msg_error = (
+            f'The bank code value "{bank}" is invalid. Enter a valid bank code.'
+            ' The range is 0 to 5.'
+        )
+
+        raise ValueError(msg_error)
+
+    bank = ['', 2, 121, 85, 120, 151][bank]
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code, include_blank=True)
+
+    resp = fordev_request(
+        content_length=45,
+        referer='gerador_conta_bancaria',
+        payload={
+            'acao': 'gerar_conta_bancaria',
+            'estado': uf_code,
+            'banco': bank
+        }
+    )
+
+    resp['data'] = filter_bank_account_info(resp['data'])
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/certificate.py b/fordev/generators/certificate.py
new file mode 100644
index 0000000..1b05374
--- /dev/null
+++ b/fordev/generators/certificate.py
@@ -0,0 +1,51 @@
+"""
+fordev.generators.certificate
+-----------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def certificate(type_: str='I', formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código de certidões (birth, wedding, religious wedding and death) aleatórias.
+
+    Parameters
+    ----------
+    type_
+        O tipo da certidão para geração do código.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+    """
+
+    type_ = type_.upper()
+
+    certificate_types = {
+        'I': 'Indiferente',
+        'B': 'nascimento',
+        'W': 'casamento',
+        'R': 'casamento_religioso',
+        'D': 'obito'
+    }
+
+    if not certificate_types.get(type_, False):
+        msg_error = (
+            f'The certificate type "{type_}" is invalid. Enter a valid type.'
+            ' Ex: "B" = Birth, "W" = Wedding, "R" = Religious Wedding,'
+            '"D" = Death and "I" = Indifferent (Default).'
+        )
+        raise ValueError(msg_error)
+
+    resp = fordev_request(
+        content_length=67,
+        referer='gerador_numero_certidoes',
+        payload={
+            'acao': 'gerador_certidao',
+            'pontuacao': 'S' if formatting else 'N',
+            'tipo_certidao': certificate_types.get(type_)
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/city.py b/fordev/generators/city.py
new file mode 100644
index 0000000..dbb7aef
--- /dev/null
+++ b/fordev/generators/city.py
@@ -0,0 +1,32 @@
+"""
+fordev.generators.city
+----------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+from fordev.filters import filter_city_name
+from fordev.filters import data_format
+
+
+def city(uf_code: str='SP', data_only: bool=True) -> list:
+    """Obtenha as cidades do UF especificado."""
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code)
+
+    resp = fordev_request(
+        content_length=35,
+        referer='gerador_de_pessoas',
+        payload={
+            'acao': 'carregar_cidades',
+            'cep_estado': uf_code
+        }
+    )
+
+    resp['data'] = filter_city_name(resp['data'])
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/cnh.py b/fordev/generators/cnh.py
new file mode 100644
index 0000000..3192137
--- /dev/null
+++ b/fordev/generators/cnh.py
@@ -0,0 +1,20 @@
+"""
+fordev.generators.cnh
+---------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def cnh(data_only: bool=True) -> str:
+    """Geração aleatória de CNH (Carteira Nacional de Habilitação)."""
+
+    resp = fordev_request(
+        content_length=14,
+        referer='gerador_de_cnh',
+        payload={'acao': 'gerar_cnh'}
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/cnpj.py b/fordev/generators/cnpj.py
new file mode 100644
index 0000000..53b17c2
--- /dev/null
+++ b/fordev/generators/cnpj.py
@@ -0,0 +1,23 @@
+"""
+fordev.generators.cpnj
+----------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def cnpj(formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código do CNPJ(Cadastro Nacional da Pessoa Jurídica) aleatório."""
+
+    resp = fordev_request(
+        content_length=27,
+        referer='gerador_de_cnpj',
+        payload={
+            'acao': 'gerar_cnpj',
+            'pontuacao': 'S' if formatting else 'N',
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/company.py b/fordev/generators/company.py
new file mode 100644
index 0000000..ee7ce43
--- /dev/null
+++ b/fordev/generators/company.py
@@ -0,0 +1,48 @@
+"""
+fordev.generators.company
+-------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+from fordev.filters import filter_company_info
+from fordev.filters import data_format
+
+
+def company(uf_code: str='SP', age: int=1, formatting: bool=True, data_only: bool=True) -> dict:
+    """Gere dados de companhia (empresa/organização) aleatório.
+
+    Parameters
+    ----------
+    age
+        Representa o tempo de existência da companhia (a idade da companhia).
+    """
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code)
+
+    if not (1 <= age <= 30):
+        msg_error = (
+            f'The company age value "{age}" is invalid. Enter a valid company age.'
+            ' The range is 1 to 30.'
+        )
+
+        raise ValueError(msg_error)
+
+    resp = fordev_request(
+        content_length=48,
+        referer='gerador_de_empresas',
+        payload={
+            'acao': 'gerar_empresa',
+            'pontuacao': 'S' if formatting else 'N',
+            'estado': uf_code,
+            'idade': age
+        }
+    )
+
+    resp['data'] = filter_company_info(resp['data'])
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/cpf.py b/fordev/generators/cpf.py
new file mode 100644
index 0000000..fa68be8
--- /dev/null
+++ b/fordev/generators/cpf.py
@@ -0,0 +1,30 @@
+"""
+fordev.generators.cpf
+---------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+
+def cpf(uf_code: str='', formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código de um CPF(Cadastro de Pessoas Físicas) aleatório."""
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code, include_blank=True)
+
+    resp = fordev_request(
+        content_length=38 if uf_code == '' else 40,
+        referer='gerador_de_cpf',
+        payload={
+            'acao': 'gerar_cpf',
+            'pontuacao': 'S' if formatting else 'N',
+            'cpf_estado': uf_code
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/credit_card.py b/fordev/generators/credit_card.py
new file mode 100644
index 0000000..b97c158
--- /dev/null
+++ b/fordev/generators/credit_card.py
@@ -0,0 +1,56 @@
+"""
+fordev.generators.credit_card
+-----------------------------
+"""
+
+from random import choice as random_choice
+
+from fordev.core import fordev_request
+
+from fordev.consts import ALL_BANK_FLAGS
+
+from fordev.filters import filter_credit_card_info
+from fordev.filters import data_format
+
+
+def credit_card(bank: int=0, formatting: bool=True, data_only: bool=True) -> dict:
+    """Gere dados de cartão de crédito aleatório.
+
+    Parameters
+    ----------
+    bank
+        Recebe um valor númerico de 0 a 10 representando a
+        bandeira do cartão de crédito a ser gerado.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+    """
+
+    if not (0 <= bank <= 10):
+        msg_error = (
+            f'The bank code value "{bank}" is invalid. Enter a valid bank code.'
+            ' The range is 0 to 10.'
+        )
+
+        raise ValueError(msg_error)
+
+    if bank != 0:
+        bank = ALL_BANK_FLAGS[bank]
+    else:
+        bank = random_choice(
+            list(ALL_BANK_FLAGS.values())
+        )
+
+    resp = fordev_request(
+        content_length=43,
+        referer='gerador_de_numero_cartao_credito',
+        payload={
+            'acao': 'gerar_cc',
+            'pontuacao': 'S' if formatting else 'N',
+            'bandeira': bank
+        }
+    )
+
+    resp['data'] = filter_credit_card_info(resp['data'])
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/people.py b/fordev/generators/people.py
new file mode 100644
index 0000000..2f93218
--- /dev/null
+++ b/fordev/generators/people.py
@@ -0,0 +1,91 @@
+"""
+fordev.generators.people
+------------------------
+"""
+
+from json import loads as json_loads
+
+from fordev.core import fordev_request
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+
+def people(
+        n: int=1,
+        sex: str='R',
+        age: int=0,
+        uf_code: str='',
+        formatting: bool=True,
+        data_only: bool=True
+    ) -> str:
+    """Gere dados de pessoa(s) aleatório(s)
+
+    Parameters
+    ----------
+    n
+        O número de pessoas a ter dados gerados. O mínimo é 1 e o máximo é 30.
+
+    sex
+        Uma string representando o sexo da pessoa para geração dos dados.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+
+    age
+        A idade da pessoa para geração dos dados. A idade mínima é 18 e a máxima é 80.
+    """
+
+    sex = sex.upper()
+
+    uf_code = uf_code.upper()
+
+    if not (1 <= n <= 30):
+        msg_error = (
+            f'The n value "{n}" is invalid. Enter a valid number of people.'
+            ' The range is 1 to 30 peoples.'
+        )
+
+        raise ValueError(msg_error)
+
+    if sex not in ['M', 'F', 'R']:
+        msg_error = (
+            f'The sex "{sex}" is invalid. Enter a valid sex.'
+            ' Ex: "M" = Male, "F" = Feminine or "R" = Random.'
+        )
+
+        raise ValueError(msg_error)
+
+    if not (18 <= age <= 80) and age != 0:
+        msg_error = (
+            f'The age "{age}" is invalid. Enter a valid age.'
+            ' The range is 18 to 80 age.'
+        )
+
+        raise ValueError(msg_error)
+
+    raise_for_invalid_uf(uf=uf_code, include_blank=True)
+
+    resp = fordev_request(
+        content_length=99,
+        referer='gerador_de_pessoas',
+        payload={
+            'acao': 'gerar_pessoa',
+            'sexo': 'H' if sex == 'M' else 'M' if sex == 'F' else 'I',
+            'pontuacao': 'S' if formatting else 'N',
+            'idade': age,
+            'cep_estado': uf_code,
+            'txt_qtde': n,
+            'cep_cidade': 'Selecione o estado!' if uf_code == '' else ''
+        }
+    )
+
+    if data_only and resp['msg'] == 'success':
+        return json_loads(resp['data'])
+
+    if resp['msg'] == 'success':
+
+        resp['data'] = json_loads(resp['data'])
+
+        return resp
+
+    return resp
diff --git a/fordev/generators/pis_pasep.py b/fordev/generators/pis_pasep.py
new file mode 100644
index 0000000..513b450
--- /dev/null
+++ b/fordev/generators/pis_pasep.py
@@ -0,0 +1,23 @@
+"""
+fordev.generators.pis_pasep
+---------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def pis_pasep(formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código do PIS/PASEP aleatório."""
+
+    resp = fordev_request(
+        content_length=26,
+        referer='gerador_de_pis_pasep',
+        payload={
+            'acao': 'gerar_pis',
+            'pontuacao': 'S' if formatting else 'N'
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/renavam.py b/fordev/generators/renavam.py
new file mode 100644
index 0000000..85de68c
--- /dev/null
+++ b/fordev/generators/renavam.py
@@ -0,0 +1,20 @@
+"""
+fordev.generators.renavam
+-------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def renavam(data_only: bool=True) -> str:
+    """Gere o código do RENAVAM(Registro Nacional de Veículos Automotores) aleatório."""
+
+    resp = fordev_request(
+        content_length=18,
+        referer='gerador_de_renavam',
+        payload={'acao': 'gerar_renavam'}
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/rg.py b/fordev/generators/rg.py
new file mode 100644
index 0000000..4e60f1f
--- /dev/null
+++ b/fordev/generators/rg.py
@@ -0,0 +1,23 @@
+"""
+fordev.generators.rg
+--------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def rg(formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código do RG(Registro Geral) aleatório, emitido por SSP-SP."""
+
+    resp = fordev_request(
+        content_length=25,
+        referer='gerador_de_rg',
+        payload={
+            'acao': 'gerar_rg',
+            'pontuacao': 'S' if formatting else 'N',
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/state_registration.py b/fordev/generators/state_registration.py
new file mode 100644
index 0000000..d2663dc
--- /dev/null
+++ b/fordev/generators/state_registration.py
@@ -0,0 +1,30 @@
+"""
+fordev.generators.state_registration
+------------------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+from fordev.filters import data_format
+
+
+def state_registration(uf_code: str='SP', formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código de registro de estado aleatório."""
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code)
+
+    resp = fordev_request(
+        content_length=35,
+        referer='gerador_de_inscricao_estadual',
+        payload={
+            'acao': 'gerar_ie',
+            'pontuacao': 'S' if formatting else 'N',
+            'estado': uf_code
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/uf.py b/fordev/generators/uf.py
new file mode 100644
index 0000000..3a73be1
--- /dev/null
+++ b/fordev/generators/uf.py
@@ -0,0 +1,36 @@
+"""
+fordev.generators.uf
+--------------------
+"""
+
+from random import sample as random_sample
+
+from fordev.consts import ALL_UF_CODE
+
+
+def uf(n: int=1, data_only: bool=True) -> list:
+    """Gere o código da UF(Unidade Federativa) aleatório.
+
+    Parameters
+    ----------
+    n
+        O número de UF's para geração do dado. O mínimo é 1 e o máximo é 27.
+    """
+
+    if not (1 <= n <= 27):
+        msg_error = (
+            f'The n value "{n}" is invalid. Enter a valid number of UF.'
+            ' The range is 1 to 27 UF code.'
+        )
+
+        raise ValueError(msg_error)
+
+    full_data = {
+        'msg': 'success',
+        'data': random_sample(ALL_UF_CODE, n)
+        }
+
+    if data_only:
+        return full_data['data']
+    else:
+        return full_data
diff --git a/fordev/generators/vehicle.py b/fordev/generators/vehicle.py
new file mode 100644
index 0000000..f4abced
--- /dev/null
+++ b/fordev/generators/vehicle.py
@@ -0,0 +1,118 @@
+"""
+fordev.generators.vehicle
+-------------------------
+"""
+
+from random import sample as random_sample
+
+from fordev.core import fordev_request
+
+from fordev.consts import ALL_VEHICLE_BRANDS
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+from fordev.filters import filter_vehicle_info
+from fordev.filters import data_format
+
+
+def vehicle(
+        brand_code: int=0,
+        uf_code: str='',
+        formatting: bool=True,
+        data_only: bool=True
+    ) -> dict:
+    """Gere dados de veículo aleatório.
+
+    Parameters
+    ----------
+    brand
+        Recebe um valor númerico de 0 a 87 que representa a marca do carro para
+        geração dos dados aleatórios.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+    """
+
+    if not (0 <= brand_code <= 87):
+        msg_error = (
+            f'The vehicle brand code value "{brand_code}" is invalid.'
+            ' Enter a valid vehicle brand code.'
+            ' The range is 0 to 87.'
+        )
+
+        raise ValueError(msg_error)
+
+    if brand_code != 0:
+        brand_code = ALL_VEHICLE_BRANDS[brand_code]['code']
+    else:
+        brand_code = ''
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code, include_blank=True)
+
+    resp = fordev_request(
+        content_length=62,
+        referer='gerador_de_veiculos',
+        payload={
+            'acao': 'gerar_veiculo',
+            'pontuacao': 'S' if formatting else 'N',
+            'estado': uf_code,
+            'fipe_codigo_marca': brand_code
+        }
+    )
+
+    resp['data'] = filter_vehicle_info(resp['data'])
+
+    return data_format(data_only=data_only, data_dict=resp)
+
+
+def vehicle_brand(n: int=1, data_only: bool=True) -> list:
+    """Obtenha o nome de marca(s) de veículo(s).
+
+    Parameters
+    ----------
+    n
+        Recebe o número de marcas de veículos a ser gerado. O valor mínimo é 1 e o máximo é 87.
+    """
+
+    if not (1 <= n <= 87):
+        msg_error = (
+            f'The n value "{n}" is invalid. Enter a valid number of UF.'
+            ' The range is 1 to 27 UF code.'
+        )
+
+        raise ValueError(msg_error)
+
+    full_data = {
+        'msg': 'success',
+        'data': random_sample(
+            [v_brand['brand_name'] for v_brand in ALL_VEHICLE_BRANDS.values()],
+            n
+        )
+    }
+
+    if data_only:
+        return full_data['data']
+    else:
+        return full_data
+
+
+def vehicle_plate(uf_code: str='', formatting: bool=True, data_only: bool=True) -> str:
+    """Gere o código da placa de veículo aleatório."""
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code, include_blank=True)
+
+    resp = fordev_request(
+        content_length=36 if uf_code == '' else 38,
+        referer='gerador_de_placa_automoveis',
+        payload={
+            'acao': 'gerar_placa',
+            'pontuacao': 'S' if formatting else 'N',
+            'estado':uf_code
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/generators/voter_title.py b/fordev/generators/voter_title.py
new file mode 100644
index 0000000..f4bee39
--- /dev/null
+++ b/fordev/generators/voter_title.py
@@ -0,0 +1,29 @@
+"""
+fordev.generators.voter_title
+-----------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.validators.utils import raise_for_invalid_uf
+
+from fordev.filters import data_format
+
+
+def voter_title(uf_code: str, data_only: bool=True) -> str:
+    """Gere o código do título de eleitor aleatório, conforme o UF especificado."""
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code)
+
+    resp = fordev_request(
+        content_length=35,
+        referer='gerador_de_titulo_de_eleitor',
+        payload={
+            'acao': 'gerar_titulo_eleitor',
+            'estado': uf_code
+        }
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/utils.py b/fordev/utils.py
deleted file mode 100644
index 8c8194b..0000000
--- a/fordev/utils.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-fordev.utils
-------------
-
-This module contains useful classes and functions for the fordev package.
-"""
-
-__all__ = ['CheckVersion']
-
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
-
-from colorama import init, deinit, Fore
-
-import requests
-
-
-class CheckVersion(object):
-    """Check if package has a newer version."""
-
-    def __init__(self, current_version: str, package_name: str):
-        
-        self.current_version = current_version
-        self.package_name = package_name
-        self.latest_version = None
-    
-    def endpoint(self):
-        """Build endpoint of Pypi API."""
-
-        pypi = 'https://pypi.org'
-        route = '/pypi/{package}/json'.format(package=self.package_name)
-
-        return pypi + route
-
-    @staticmethod
-    def version_to_tuple(version: str, separator='.'):
-        """Convert version to tuple. Ex: '1.4.3' to (1, 4, 3)."""
-
-        return tuple(map(int, version.split(separator)))
-
-    def get_latest_version(self):
-        try:
-            url = self.endpoint()
-
-            r = requests.get(url)
-            
-            if r.status_code == 200:
-                self.latest_version = r.json()['info']['version']
-
-                return self.version_to_tuple(self.latest_version)
-
-        except Exception:
-            pass
-
-    def is_newer_version_available(self):
-        """Check if latest version is greater than the current version."""
-
-        current_version = self.version_to_tuple(self.current_version)
-        latest_version = self.get_latest_version()
-
-        if latest_version > current_version:
-            return True
-        
-        return False
-
-    def print_status(self):
-        """Print a warning if of package has a newer version."""
-
-        init()  # Start colorama
-
-        warning = (
-            Fore.YELLOW + 'You are using an old version of the {package} package (v{current_version}), '
-            'a new version has been released (v{latest_version}).\n'
-            'Please run: python -m pip install {package} --upgrade' + Fore.RESET
-        ).format(
-            package=self.package_name,
-            current_version=self.current_version,
-            latest_version=self.latest_version
-        )
-
-        print(warning)
-
-        deinit()  # Stop colorama
-    
-    @staticmethod
-    def run(current_version: str, package_name: str):
-        """Run CheckVersion without instantiating an object."""
-
-        check = CheckVersion(current_version, package_name)
-
-        if check.is_newer_version_available():
-            check.print_status()
diff --git a/fordev/validators.py b/fordev/validators.py
deleted file mode 100644
index bd5a494..0000000
--- a/fordev/validators.py
+++ /dev/null
@@ -1,410 +0,0 @@
-# -*- coding: utf-8 -*-
-"""
-fordev.validators
------------------
-
-Este módulo válida os dados utilizando o site `4Devs <https://www.4devs.com.br/>`_
-e disponibiliza uma API simples para uso.
-
-Use a função ``help()`` para mais informações:
-
->>> from fordev import validators
->>> help(validators)
-Help on module fordev.validators in fordev:
-
-NAME
-    fordev.validators
-
-DESCRIPTION
-(...)
-
-Ou consulte a documentação oficial.
-
-Note
-----
-Muitas funções do módulo ``fordev.validators`` contém parâmetros em comum,
-todos estão descritos abaixo.
-
-More details in next section.
-
-Parameter
----------
-data_only: bool
-    Se receber o valor ``True``, retorna somente os dados em texto puro.
-    Se receber o valor ``False``, retorna um dicionário contendo uma chave ``msg`` e ``data`` ou ``error``
-    contendo valores correspondentes à nomenclatura de suas chaves.
-
-Sendo assim, sempre que o encontrar, utilize conforme o descrito acima.
-"""
-
-__all__ = [
-    'is_valid_credit_card',
-    'is_valid_bank_account',
-    'is_valid_certificate',
-    'is_valid_cnh',
-    'is_valid_cnpj',
-    'is_valid_cpf',
-    'is_valid_pis_pasep',
-    'is_valid_renavam',
-    'is_valid_rg',
-    'is_valid_voter_title',
-    'is_valid_state_registration',
-]
-
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
-from fordev.__about__ import __author_github__
-from fordev.__about__ import __project_github__
-
-from fordev.core import fordev_request
-
-from fordev.consts import ALL_UF_CODE
-from fordev.consts import ALL_BANK_FLAGS_2
-
-from fordev.filters import data_format
-
-
-def _data_verification_and_normalize(data: dict) -> dict:
-    """"Verifique se a key existe e se o valor é válido.
-    Se válido, substítui para um novo formato.
-    
-    Parameters
-    ----------
-    data
-        Um dicionário de dados para verificação e mudança de formato.
-    """
-
-    data = data.copy()
-
-    if data.get('data', False):
-        is_valid = data['data'].split(' - ')[-1].lower() == 'verdadeiro'
-        data['data'] = is_valid
-    
-    return data
-
-
-def raise_for_invalid_uf(uf, include_blank=False):
-    """Levanta uma exceção if o código UF for inválido.
-    
-    Parameters
-    ----------
-    include_blank
-        Algumas funções enviam um UF em branco, para considerá-lo
-        defina ``include_blank`` como ``True``.
-    """
-
-    ufs = ALL_UF_CODE.copy()
-
-    if include_blank:
-        ufs.append('')
-
-    if uf not in ufs:
-        msg_error = (
-            f'The UF code "{uf}" is invalid. Enter a valid UF code. Ex: SP, RJ, PB...'
-            ' More info about UF in: https://pt.wikipedia.org/wiki/Subdivis%C3%B5es_do_Brasil'
-        )
-
-        raise ValueError(msg_error)
-
-
-def is_valid_credit_card(flag: int, credit_card_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do cartão de crédito é válido.
-    
-    Parameters
-    ----------
-    flag
-        A bandeira do cartão de crédito que deseja validar o código.
-        
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-
-    credit_card_code
-        O código do cartão de crédito para verificação.
-   """
-
-    # Check if bank code is invalid. If true, raise exception.
-    if not (1 <= flag <= 12):
-        msg_error = f'The flag credit card code value "{flag}" is invalid. Enter a valid flag credit card code.'
-        msg_error += f' The range is 1 to 12.'
-
-        raise ValueError(msg_error)
-
-    flag = ALL_BANK_FLAGS_2[flag]
-
-    content_length = 68
-    referer = 'validador_numero_cartao_credito'
-    payload = {
-        'acao': 'validar_cc',
-        'txt_cc': credit_card_code,
-        'bandeira': flag
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_bank_account(bank: int, agency: str, account: str, data_only: bool=True) -> bool:
-    """Verifique se os dados da conta bancária são válidos.
-    
-    Parameters
-    ----------
-    bank
-        A bandeira do banco da conta bancária que deseja validar os dados.
-        
-        Consulte a doc para verificar as opções suportadas:
-        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
-    
-    agency
-        O código da agência bancária para verificação.
-
-    account
-        O código da conta bancária para verificação.
-   """
-
-    # Check if bank code is invalid. If true, raise exception.
-    if not (1 <= bank <= 5):
-        msg_error = f'The bank code value "{bank}" is invalid. Enter a valid bank code.'
-        msg_error += f' The range is 1 to 5.'
-
-        raise ValueError(msg_error)
-
-    # Replace the bank number with the bank code used in 4devs.
-    bank = [2, 121, 85, 120, 151][bank - 1]  # Use the index for get the bank code.
-
-    content_length = 66
-    referer = 'validador_conta_bancaria'
-    payload = {
-        'acao': 'validar_conta_bancaria',
-        'banco': bank,
-        'agencia': agency,
-        'conta': account
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_certificate(certificate_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código da Certidão (birth, wedding, religious wedding and death) é válido.
-    
-    Parameters
-    ----------
-    certificate_code
-        O código da certidão para verificação.
-    """
-
-    content_length = 75
-    referer = 'validador_certidoes'
-    payload = {
-        'acao': 'validar_certidao',
-        'txt_certidao': certificate_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_cnh(cnh_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código da CNH é válido.
-    
-    Parameters
-    ----------
-    cnh_code
-        O código da CNH para verificação.
-    """
-
-    content_length = 36
-    referer = 'validador_cnh'
-    payload = {
-        'acao': 'validar_cnh',
-        'txt_cnh': cnh_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_cnpj(cnpj_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do CNPJ é válido.
-    
-    Parameters
-    ----------
-    cnpj_code
-        O código CNPJ para verificação.
-    """
-
-    content_length = 47
-    referer = 'validador_cnpj'
-    payload = {
-        'acao': 'validar_cnpj',
-        'txt_cnpj': cnpj_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_cpf(cpf_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do CPF é válido.
-    
-    Parameters
-    ----------
-    cpf_code
-        O código do CPF para verificação.
-    """
-
-    content_length = 39
-    referer = 'validador_cpf'
-    payload = {
-        'acao': 'validar_cpf',
-        'txt_cpf': cpf_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_pis_pasep(pis_pasep_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do PIS/PASEP é válido.
-    
-    Parameters
-    ----------
-    pis_pasep_code
-        O código PIS/PASEP para verificação.
-    """
-
-    content_length = 39
-    referer = 'validador_pis_pasep'
-    payload = {
-        'acao': 'validar_pis',
-        'txt_pis': pis_pasep_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_renavam(renavam_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do RENAVAM é válido.
-    
-    Parameters
-    ----------
-    renavam_code
-        O código do RENAVAM para verificação.
-   """
-
-    content_length = 43
-    referer = 'validador_de_renavam'
-    payload = {
-        'acao': 'validar_renavam',
-        'txt_renavam': renavam_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_rg(rg_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do RG é válido.
-    
-    Parameters
-    ----------
-    rg_code
-        O código do RG para verificação.
-    """
-
-    content_length = 35
-    referer = 'validador_rg'
-    payload = {
-        'acao': 'validar_rg',
-        'txt_rg': rg_code
-    }
-
-    r = _data_verification_and_normalize(
-        fordev_request(content_length, referer, payload)
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_voter_title(voter_title_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do título de eleitor é válido.
-    
-    Parameters
-    ----------
-    voter_title_code
-        O código do título de eleitor para verificação.
-    """
-
-    content_length = 59
-    referer = 'validador_titulo_de_eleitor'
-    payload = {
-        'acao': 'validar_titulo_eleitor',
-        'txt_titulo_eleitor': voter_title_code
-    }
-
-    r = fordev_request(content_length, referer, payload)
-
-    if r.get('data', False):
-        is_valid = r['data'].split(' - ')[-2].lower() == 'verdadeiro'
-        r['data'] = is_valid
-
-    return data_format(data_only=data_only, data_dict=r)
-
-
-def is_valid_state_registration(uf_code: str, state_registration_code: str, data_only: bool=True) -> bool:
-    """Verifique se o código do registro estadual é válido.
-    
-    Parameters
-    ----------
-    uf_code
-        O código UF(Unidade Federativa) do estado que pertence o registro estadual.
-        
-        Mais informações: https://pt.wikipedia.org/wiki/Subdivis%C3%B5es_do_Brasil
-
-    state_registration_code
-        O código do registro estadual para verificação.
-    """
-
-    uf_code = uf_code.upper()
-
-    raise_for_invalid_uf(uf=uf_code)
-
-    r = _data_verification_and_normalize(
-        fordev_request(
-            content_length=48,
-            referer='validar_inscricao_estadual',
-            payload={
-                'acao': 'validar_ie',
-                'txt_ie': state_registration_code,
-                'estado': uf_code
-            }
-        )
-    )
-
-    return data_format(data_only=data_only, data_dict=r)
diff --git a/fordev/validators/__init__.py b/fordev/validators/__init__.py
new file mode 100644
index 0000000..9723565
--- /dev/null
+++ b/fordev/validators/__init__.py
@@ -0,0 +1,63 @@
+"""
+fordev.validators
+-----------------
+
+Este módulo válida os dados utilizando o site `4Devs <https://www.4devs.com.br/>`_
+e disponibiliza uma API simples para uso.
+
+Use a função ``help()`` para mais informações:
+
+>>> from fordev import validators
+>>> help(validators)
+Help on module fordev.validators in fordev:
+
+NAME
+    fordev.validators
+
+DESCRIPTION
+(...)
+
+Ou consulte a documentação oficial.
+
+Note
+----
+Muitas funções do módulo ``fordev.validators`` contém parâmetros em comum,
+todos estão descritos abaixo.
+
+More details in next section.
+
+Parameter
+---------
+data_only: bool
+    Se receber o valor ``True``, retorna somente os dados em texto puro.
+    Se receber o valor ``False``, retorna um dicionário contendo uma chave ``msg`` e ``data`` ou ``error``
+    contendo valores correspondentes à nomenclatura de suas chaves.
+
+Sendo assim, sempre que o encontrar, utilize conforme o descrito acima.
+"""
+
+__all__ = [
+    'is_valid_credit_card',
+    'is_valid_bank_account',
+    'is_valid_certificate',
+    'is_valid_cnh',
+    'is_valid_cnpj',
+    'is_valid_cpf',
+    'is_valid_pis_pasep',
+    'is_valid_renavam',
+    'is_valid_rg',
+    'is_valid_voter_title',
+    'is_valid_state_registration'
+]
+
+from fordev.validators.credit_card import is_valid_credit_card
+from fordev.validators.bank_account import is_valid_bank_account
+from fordev.validators.certificate import is_valid_certificate
+from fordev.validators.cnh import is_valid_cnh
+from fordev.validators.cnpj import is_valid_cnpj
+from fordev.validators.cpf import is_valid_cpf
+from fordev.validators.pis_pasep import is_valid_pis_pasep
+from fordev.validators.renavam import is_valid_renavam
+from fordev.validators.rg import is_valid_rg
+from fordev.validators.voter_title import is_valid_voter_title
+from fordev.validators.state_registration import is_valid_state_registration
diff --git a/fordev/validators/bank_account.py b/fordev/validators/bank_account.py
new file mode 100644
index 0000000..deab67b
--- /dev/null
+++ b/fordev/validators/bank_account.py
@@ -0,0 +1,54 @@
+"""
+fordev.validators.bank_account
+------------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_bank_account(bank: int, agency: str, account: str, data_only: bool=True) -> bool:
+    """Verifique se os dados da conta bancária são válidos.
+
+    Parameters
+    ----------
+    bank
+        A bandeira do banco da conta bancária que deseja validar os dados.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+
+    agency
+        O código da agência bancária para verificação.
+
+    account
+        O código da conta bancária para verificação.
+   """
+
+    if not (1 <= bank <= 5):
+        msg_error = (
+            f'The bank code value "{bank}" is invalid. Enter a valid bank code.'
+            ' The range is 1 to 5.'
+        )
+
+        raise ValueError(msg_error)
+
+    bank = [2, 121, 85, 120, 151][bank - 1]
+
+    content_length = 66
+    referer = 'validador_conta_bancaria'
+    payload = {
+        'acao': 'validar_conta_bancaria',
+        'banco': bank,
+        'agencia': agency,
+        'conta': account
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/certificate.py b/fordev/validators/certificate.py
new file mode 100644
index 0000000..d74a612
--- /dev/null
+++ b/fordev/validators/certificate.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.certificate
+-----------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_certificate(certificate_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código da Certidão (birth, wedding, religious wedding and death) é válido.
+
+    Parameters
+    ----------
+    certificate_code
+        O código da certidão para verificação.
+    """
+
+    content_length = 75
+    referer = 'validador_certidoes'
+    payload = {
+        'acao': 'validar_certidao',
+        'txt_certidao': certificate_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/cnh.py b/fordev/validators/cnh.py
new file mode 100644
index 0000000..fdf43b8
--- /dev/null
+++ b/fordev/validators/cnh.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.cnh
+---------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_cnh(cnh_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código da CNH é válido.
+
+    Parameters
+    ----------
+    cnh_code
+        O código da CNH para verificação.
+    """
+
+    content_length = 36
+    referer = 'validador_cnh'
+    payload = {
+        'acao': 'validar_cnh',
+        'txt_cnh': cnh_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/cnpj.py b/fordev/validators/cnpj.py
new file mode 100644
index 0000000..c7142bf
--- /dev/null
+++ b/fordev/validators/cnpj.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.cnpj
+----------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_cnpj(cnpj_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do CNPJ é válido.
+
+    Parameters
+    ----------
+    cnpj_code
+        O código CNPJ para verificação.
+    """
+
+    content_length = 47
+    referer = 'validador_cnpj'
+    payload = {
+        'acao': 'validar_cnpj',
+        'txt_cnpj': cnpj_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/cpf.py b/fordev/validators/cpf.py
new file mode 100644
index 0000000..e896fdf
--- /dev/null
+++ b/fordev/validators/cpf.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.cpf
+---------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_cpf(cpf_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do CPF é válido.
+
+    Parameters
+    ----------
+    cpf_code
+        O código do CPF para verificação.
+    """
+
+    content_length = 39
+    referer = 'validador_cpf'
+    payload = {
+        'acao': 'validar_cpf',
+        'txt_cpf': cpf_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/credit_card.py b/fordev/validators/credit_card.py
new file mode 100644
index 0000000..224dde6
--- /dev/null
+++ b/fordev/validators/credit_card.py
@@ -0,0 +1,53 @@
+"""
+fordev.validators.credit_card
+-----------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.consts import ALL_BANK_FLAGS_2
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_credit_card(flag: int, credit_card_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do cartão de crédito é válido.
+
+    Parameters
+    ----------
+    flag
+        A bandeira do cartão de crédito que deseja validar o código.
+
+        Consulte a doc para verificar as opções suportadas:
+        https://fordev.rtfd.io/pt_BR/latest/fordev/generators.html
+
+    credit_card_code
+        O código do cartão de crédito para verificação.
+   """
+
+    if not (1 <= flag <= 12):
+        msg_error = (
+            f'The flag credit card code value "{flag}" is invalid.'
+            ' Enter a valid flag credit card code.'
+            ' The range is 1 to 12.'
+        )
+
+        raise ValueError(msg_error)
+
+    flag = ALL_BANK_FLAGS_2[flag]
+
+    content_length = 68
+    referer = 'validador_numero_cartao_credito'
+    payload = {
+        'acao': 'validar_cc',
+        'txt_cc': credit_card_code,
+        'bandeira': flag
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/pis_pasep.py b/fordev/validators/pis_pasep.py
new file mode 100644
index 0000000..1607820
--- /dev/null
+++ b/fordev/validators/pis_pasep.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.pis_pasep
+---------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_pis_pasep(pis_pasep_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do PIS/PASEP é válido.
+
+    Parameters
+    ----------
+    pis_pasep_code
+        O código PIS/PASEP para verificação.
+    """
+
+    content_length = 39
+    referer = 'validador_pis_pasep'
+    payload = {
+        'acao': 'validar_pis',
+        'txt_pis': pis_pasep_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/renavam.py b/fordev/validators/renavam.py
new file mode 100644
index 0000000..b85efda
--- /dev/null
+++ b/fordev/validators/renavam.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.renavam
+-------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_renavam(renavam_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do RENAVAM é válido.
+
+    Parameters
+    ----------
+    renavam_code
+        O código do RENAVAM para verificação.
+   """
+
+    content_length = 43
+    referer = 'validador_de_renavam'
+    payload = {
+        'acao': 'validar_renavam',
+        'txt_renavam': renavam_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/rg.py b/fordev/validators/rg.py
new file mode 100644
index 0000000..a5bcc83
--- /dev/null
+++ b/fordev/validators/rg.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.rg
+--------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+
+
+def is_valid_rg(rg_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do RG é válido.
+
+    Parameters
+    ----------
+    rg_code
+        O código do RG para verificação.
+    """
+
+    content_length = 35
+    referer = 'validador_rg'
+    payload = {
+        'acao': 'validar_rg',
+        'txt_rg': rg_code
+    }
+
+    resp = _data_verification_and_normalize(
+        fordev_request(content_length, referer, payload)
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/state_registration.py b/fordev/validators/state_registration.py
new file mode 100644
index 0000000..8dfc983
--- /dev/null
+++ b/fordev/validators/state_registration.py
@@ -0,0 +1,48 @@
+"""
+fordev.validators.state_registration
+------------------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+from fordev.validators.utils import _data_verification_and_normalize
+from fordev.validators.utils import raise_for_invalid_uf
+
+
+def is_valid_state_registration(
+        uf_code: str,
+        state_registration_code: str,
+        data_only: bool=True
+    ) -> bool:
+    """Verifique se o código do registro estadual é válido.
+
+    Parameters
+    ----------
+    uf_code
+        O código UF(Unidade Federativa) do estado que pertence o registro estadual.
+
+        Mais informações: https://pt.wikipedia.org/wiki/Subdivis%C3%B5es_do_Brasil
+
+    state_registration_code
+        O código do registro estadual para verificação.
+    """
+
+    uf_code = uf_code.upper()
+
+    raise_for_invalid_uf(uf=uf_code)
+
+    resp = _data_verification_and_normalize(
+        fordev_request(
+            content_length=48,
+            referer='validar_inscricao_estadual',
+            payload={
+                'acao': 'validar_ie',
+                'txt_ie': state_registration_code,
+                'estado': uf_code
+            }
+        )
+    )
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/fordev/validators/utils.py b/fordev/validators/utils.py
new file mode 100644
index 0000000..6f6c23a
--- /dev/null
+++ b/fordev/validators/utils.py
@@ -0,0 +1,54 @@
+"""
+fordev.validators.utils
+-----------------------
+"""
+
+__all__ = [
+    '_data_verification_and_normalize',
+    'raise_for_invalid_uf'
+]
+
+from fordev.consts import ALL_UF_CODE
+
+
+def _data_verification_and_normalize(data: dict) -> dict:
+    """"Verifique se a key existe e se o valor é válido.
+    Se válido, substítui para um novo formato.
+
+    Parameters
+    ----------
+    data
+        Um dicionário de dados para verificação e mudança de formato.
+    """
+
+    data = data.copy()
+
+    if data.get('data', False):
+        is_valid = data['data'].split(' - ')[-1].lower() == 'verdadeiro'
+        data['data'] = is_valid
+
+    return data
+
+
+def raise_for_invalid_uf(uf: str, include_blank=False):
+    """Levanta uma exceção if o código UF for inválido.
+
+    Parameters
+    ----------
+    include_blank
+        Algumas funções enviam um UF em branco, para considerá-lo
+        defina ``include_blank`` como ``True``.
+    """
+
+    ufs = ALL_UF_CODE.copy()
+
+    if include_blank:
+        ufs.append('')
+
+    if uf not in ufs:
+        msg_error = (
+            f'The UF code "{uf}" is invalid. Enter a valid UF code. Ex: SP, RJ, PB...'
+            ' More info about UF in: https://pt.wikipedia.org/wiki/Subdivis%C3%B5es_do_Brasil'
+        )
+
+        raise ValueError(msg_error)
diff --git a/fordev/validators/voter_title.py b/fordev/validators/voter_title.py
new file mode 100644
index 0000000..e936956
--- /dev/null
+++ b/fordev/validators/voter_title.py
@@ -0,0 +1,33 @@
+"""
+fordev.validators.voter_title
+-----------------------------
+"""
+
+from fordev.core import fordev_request
+
+from fordev.filters import data_format
+
+
+def is_valid_voter_title(voter_title_code: str, data_only: bool=True) -> bool:
+    """Verifique se o código do título de eleitor é válido.
+
+    Parameters
+    ----------
+    voter_title_code
+        O código do título de eleitor para verificação.
+    """
+
+    content_length = 59
+    referer = 'validador_titulo_de_eleitor'
+    payload = {
+        'acao': 'validar_titulo_eleitor',
+        'txt_titulo_eleitor': voter_title_code
+    }
+
+    resp = fordev_request(content_length, referer, payload)
+
+    if resp.get('data', False):
+        is_valid = resp['data'].split(' - ')[-2].lower() == 'verdadeiro'
+        resp['data'] = is_valid
+
+    return data_format(data_only=data_only, data_dict=resp)
diff --git a/setup.py b/setup.py
index a6bb815..dbaf6c6 100644
--- a/setup.py
+++ b/setup.py
@@ -1,13 +1,11 @@
-# -*- coding: utf-8 -*-
-
 import os
 import sys
 from shutil import rmtree
 from setuptools import setup, find_packages, Command
 
-from fordev.__about__ import __version__
-from fordev.__about__ import __author__
-from fordev.__about__ import __email__
+from fordev import __version__
+from fordev import __author__
+from fordev import __email__
 
 
 here = os.path.abspath(os.path.dirname(__file__))
@@ -22,7 +20,7 @@ class PublishCommand(Command):
     @staticmethod
     def print_status(msg):
         """Prints message in bold and yellow."""
-        print('\033[1;33m{m}\033[0m'.format(m=msg))
+        print(f'\033[1;33m{msg}\033[0m')
 
     def initialize_options(self):
         pass
@@ -39,9 +37,9 @@ def run(self):
 
         except OSError:
             pass
-        
+
         self.print_status('Build Source and Wheel distribution…')
-        os.system('{python} setup.py sdist bdist_wheel'.format(python=sys.executable))
+        os.system(f'{sys.executable} setup.py sdist bdist_wheel')
 
         self.print_status('Uploading the package to PyPi via Twine…')
         os.system('twine upload --config-file .pypirc --repository pypi dist/*')
@@ -79,7 +77,7 @@ def run(self):
         "Source Code": "https://github.com/matheusfelipeog/fordev",
     },
     keywords=[
-        'fordev', '4dev', '4devs', '4devs-api', '4devs-module', 
+        'fordev', '4dev', '4devs', '4devs-api', '4devs-module',
         'fourthdev', 'python', 'api', 'scraping', 'data-generator',
         'fake-data', 'fake-data-generator', 'data-manipulation',
         'data-validation', 'random-data'


Test patch:
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 7087dd8..b917382 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -2,22 +2,23 @@ name: Tests
 
 on:
   push:
-    branches: [ master ]
+    branches: [master, dev]
   pull_request:
-    branches: [ master ]
+    branches: [master, dev]
 
 jobs:
   unittest:
-
     runs-on: ubuntu-latest
     strategy:
       matrix:
-        python-version: [3.6, 3.7, 3.8, 3.9]
+        python-version: ['3.6', '3.7', '3.8', '3.9', '3.10']
 
     steps:
-    - uses: actions/checkout@v2
+    - name: Checkout repository
+      uses: actions/checkout@v3
+
     - name: Set up Python ${{ matrix.python-version }}
-      uses: actions/setup-python@v2
+      uses: actions/setup-python@v4
       with:
         python-version: ${{ matrix.python-version }}
         
diff --git a/tests/__init__.py b/tests/__init__.py
index 40a96af..e69de29 100644
--- a/tests/__init__.py
+++ b/tests/__init__.py
@@ -1,1 +0,0 @@
-# -*- coding: utf-8 -*-
diff --git a/tests/fixtures.py b/tests/fixtures.py
index 511454b..71866ed 100644
--- a/tests/fixtures.py
+++ b/tests/fixtures.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """Fixtures for use of tests."""
 
 HTML_OF_BANK_ACCOUNT_INFOS = """
diff --git a/tests/test_filters.py b/tests/test_filters.py
index 102ed93..b323f6c 100644
--- a/tests/test_filters.py
+++ b/tests/test_filters.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """Tests of fordev.filters module."""
 
 import unittest
@@ -30,7 +29,7 @@ def test_data_format_with_data_only_argument_as_true(self):
 
         self.assertEqual(success_case, 'data of test')
         self.assertDictEqual(failed_case, self.data_failed_case)
-    
+
     def test_data_format_with_data_only_argument_as_false(self):
         success_case = data_format(data_only=False, data_dict=self.data_success_case)
         failed_case = data_format(data_only=False, data_dict=self.data_failed_case)
@@ -69,14 +68,14 @@ def test_vehicle_info_filter(self):
         self.assertEqual(len(result.keys()), 6)
         self.assertCountEqual(['Marca', 'Modelo', 'Ano', 'RENAVAM', 'Placa', 'Cor'], result.keys())
         self.assertCountEqual(['Rolls-Royce', 'Wraith 6.6 V12 Aut.', '2014', '41047812580', 'HVE-9411', 'Verde'], result.values())
-    
+
     def test_credit_card_info_filter(self):
         result = filter_credit_card_info(html=HTML_OF_CREDIT_CARD_INFOS)
 
         self.assertEqual(len(result.keys()), 3)
         self.assertCountEqual(['Número do Cartão', 'Data de Validade', 'Código Segurança (CVV)'], result.keys())
         self.assertCountEqual(['5016 0926 0945 3715', '11/02/2023', '812'], result.values())
-    
+
     def test_company_info_filter(self):
         result = filter_company_info(html=HTML_OF_COMPANY_INFOS)
 
@@ -84,19 +83,19 @@ def test_company_info_filter(self):
         self.assertCountEqual(
             [
                 'Nome', 'CNPJ', 'Inscrição Estadual',
-                'Data de Abertura', 'Site', 'E-Mail', 
-                'CEP', 'Endereço', 'Número', 'Bairro', 
+                'Data de Abertura', 'Site', 'E-Mail',
+                'CEP', 'Endereço', 'Número', 'Bairro',
                 'Cidade', 'Estado', 'Telefone', 'Celular'
             ],
             result.keys()
         )
         self.assertCountEqual(
             [
-                'Isabela e Cristiane Casa Noturna Ltda', '45.641.633/0001-17', 
-                '040.102.816.356', '11/11/2020', 'www.isabelaecristianecasanoturnaltda.com.br', 
-                'estoque@isabelaecristianecasanoturnaltda.com.br', '08559-240', 'Rua Carmem Miranda', 
+                'Isabela e Cristiane Casa Noturna Ltda', '45.641.633/0001-17',
+                '040.102.816.356', '11/11/2020', 'www.isabelaecristianecasanoturnaltda.com.br',
+                'estoque@isabelaecristianecasanoturnaltda.com.br', '08559-240', 'Rua Carmem Miranda',
                 '872', 'Vila Jau', 'Poá', 'SP', '(11) 3597-5594', '(11) 98491-8081'
-            ], 
+            ],
             result.values()
         )
 
@@ -106,8 +105,8 @@ def test_city_name_filter(self):
         self.assertEqual(len(result), 15)
         self.assertCountEqual(
             [
-                'Alto Alegre', 'Amajari', 'Boa Vista', 'Bonfim', 'Cantá', 
-                'Caracaraí', 'Caroebe', 'Iracema', 'Mucajaí', 'Normandia', 
+                'Alto Alegre', 'Amajari', 'Boa Vista', 'Bonfim', 'Cantá',
+                'Caracaraí', 'Caroebe', 'Iracema', 'Mucajaí', 'Normandia',
                 'Pacaraima', 'Rorainópolis', 'São João da Baliza', 'São Luiz', 'Uiramutã'
             ],
             result
diff --git a/tests/test_generators.py b/tests/test_generators.py
index 02fc90b..4472a15 100644
--- a/tests/test_generators.py
+++ b/tests/test_generators.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
 """Tests of fordev.generators module."""
 
 import unittest
@@ -13,7 +12,7 @@ class TestGenerators(unittest.TestCase):
     def test_vehicle_brand_generator_with_data_only_argument_as_true(self):
         brands = vehicle_brand(data_only=True)
         self.assertIsInstance(brands, list)
-    
+
     def test_vehicle_brand_generator_with_data_only_argument_as_false(self):
         brands = vehicle_brand(data_only=False)
         self.assertIsInstance(brands, dict)
@@ -26,11 +25,11 @@ def test_if_vehicle_brand_generator_returns_max_and_min_number_of_data(self):
         max_brands = vehicle_brand(n=87)
         self.assertGreaterEqual(len(min_brands), 1)
         self.assertLessEqual(len(max_brands), 87)
-    
+
     def test_if_vehicle_brand_generator_not_exceed_min_and_max_limit_of_return(self):
         with self.assertRaises(ValueError):
             vehicle_brand(n=0)
-            vehicle_brand(n=-1)  
+            vehicle_brand(n=-1)
             vehicle_brand(n=88)
 
     def test_if_data_type_of_vehicle_brands_generator_return_is_string(self):
@@ -41,7 +40,7 @@ def test_if_data_type_of_vehicle_brands_generator_return_is_string(self):
     def test_uf_generator_with_data_only_argument_as_true(self):
         ufs = uf(data_only=True)
         self.assertIsInstance(ufs, list)
-    
+
     def test_uf_generator_with_data_only_argument_as_false(self):
         ufs = uf(data_only=False)
         self.assertIsInstance(ufs, dict)
@@ -54,11 +53,11 @@ def test_if_uf_generator_returns_max_and_min_number_of_data(self):
         max_ufs = uf(n=27)
         self.assertGreaterEqual(len(min_ufs), 1)
         self.assertLessEqual(len(max_ufs), 27)
-    
+
     def test_if_uf_generator_not_exceed_min_and_max_limit_of_return(self):
         with self.assertRaises(ValueError):
             uf(n=0)
-            uf(n=-1)  
+            uf(n=-1)
             uf(n=28)
 
     def test_if_data_type_of_uf_generator_return_is_string(self):
diff --git a/tests/test_validators.py b/tests/test_validators.py
index f2e839a..2e95ac8 100644
--- a/tests/test_validators.py
+++ b/tests/test_validators.py
@@ -1,14 +1,13 @@
-# -*- coding: utf-8 -*-
 """Tests of fordev.validators module."""
 
 import unittest
 
-from fordev.validators import raise_for_invalid_uf
+from fordev.validators.utils import raise_for_invalid_uf
 
 
 class TestValidators(unittest.TestCase):
     """Test Class of fordev.validators module."""
-    
+
     def test_raise_for_invalid_uf(self):
         raise_for_invalid_uf('SP')
         raise_for_invalid_uf('', include_blank=True)