Repository: joke2k/faker
Pull request #1109 (2020-02-18 08:51:06)

Fixed: region_codes for bic must have 9 digits
### What does this changes

Brief summary of the changes

### What was wrong

Description of what was the root cause of the issue.

### How this fixes it

Description of how the changes fix the issue.

Fixes #...



Patch:
diff --git a/.bumpversion.cfg b/.bumpversion.cfg
index 1029b6ab..748a5194 100644
--- a/.bumpversion.cfg
+++ b/.bumpversion.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 8.5.0
+current_version = 8.13.1
 files = VERSION faker/__init__.py docs/conf.py
 commit = True
 tag = True
diff --git a/.circleci/config.yml b/.circleci/config.yml
deleted file mode 100644
index 3286acf3..00000000
--- a/.circleci/config.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-version: 2
-
-jobs:
-  build:
-    docker:
-      - image: circleci/python:latest-node-browsers
-    steps:
-      - checkout
-      - run: pip install --user tox
-      - run: tox
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
deleted file mode 100644
index 049b5975..00000000
--- a/.github/workflows/lint.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-name: Python Lint
-
-on:
-  push:
-    tags-ignore:
-      - "*"
-
-jobs:
-  lint:
-    runs-on: ubuntu-latest
-
-    steps:
-    - uses: actions/checkout@v2
-    - name: Set up Python
-      uses: actions/setup-python@v2
-      with:
-        python-version: '3.x'
-    - name: Install dependencies
-      run: |
-        python -m pip install tox
-    - name: Lint with flake8
-      run: tox
-      env:
-        TOXENV: flake8
-    - name: Check manifest
-      run: tox
-      env:
-        TOXENV: checkmanifest
-    - name: isort
-      run: tox
-      env:
-        TOXENV: isort
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 59b276b8..14b605fa 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,83 @@
 ## Changelog
 
+### [v8.13.1 - 2021-09-15](https://github.com/joke2k/faker/compare/v8.13.0...v8.13.1)
+
+* Change ``fi_FI`` Provinces to Regions. Thanks @LKajan.
+
+### [v8.13.0 - 2021-09-15](https://github.com/joke2k/faker/compare/v8.12.3...v8.13.0)
+
+* ``uk_UA`` address provider - fix streets and cities names, added regions. Thanks @o-vasyliev.
+
+### [v8.12.3 - 2021-09-15](https://github.com/joke2k/faker/compare/v8.12.2...v8.12.3)
+
+* Fix missing underscores in ``mac_platform_token``. Thanks @iamkeyur.
+
+### [v8.12.2 - 2021-09-15](https://github.com/joke2k/faker/compare/v8.12.1...v8.12.2)
+
+*  Remove period/fullstop from ``en_GB`` prefixes. Thanks @stephengruppetta.
+
+### [v8.12.1 - 2021-08-24](https://github.com/joke2k/faker/compare/v8.12.0...v8.12.1)
+
+* Add missing diacritics in ``fr_FR`` ``person`` provider. Thanks @laowantong.
+
+### [v8.12.0 - 2021-08-20](https://github.com/joke2k/faker/compare/v8.11.0...v8.12.0)
+
+* Added non-geo numbers and services phones format for ``pt_BR``. Thanks @leogregianin.
+* Add datetime formats in ``pt_BR``. Thanks @leogregianin.
+* Add currency formats in ``pt_BR``. Thanks @leogregianin.
+
+### [v8.11.0 - 2021-08-03](https://github.com/joke2k/faker/compare/v8.10.3...v8.11.0)
+
+*  Add ``nic_handle``. Thanks @pishchalnikov.
+
+### [v8.10.3 - 2021-07-26](https://github.com/joke2k/faker/compare/v8.10.2...v8.10.3)
+
+* Remove potentially offensive surname in ``it_IT``. Thanks @lordgordon.
+
+### [v8.10.2 - 2021-07-23](https://github.com/joke2k/faker/compare/v8.10.1...v8.10.2)
+
+* Return list instead of tuple in ``choices_distribution``. Thanks @svisser.
+
+### [v8.10.1 - 2021-07-12](https://github.com/joke2k/faker/compare/v8.10.0...v8.10.1)
+
+* enable faker instances to be unpickled (#1480). Thanks @fcurella.
+
+### [v8.10.0 - 2021-07-07](https://github.com/joke2k/faker/compare/v8.9.1...v8.10.0)
+
+* Add ``ar_AE`` (UAE) phone numbers. Thanks @sshishov.
+
+### [v8.9.1 - 2021-07-02](https://github.com/joke2k/faker/compare/v8.9.0...v8.9.1)
+
+* Skip UnsupportedFeature's on the command line. Thanks @therefromhere.
+
+### [v8.9.0 - 2021-06-30](https://github.com/joke2k/faker/compare/v8.8.2...v8.9.0)
+
+* Add RIPE ID. Thanks @pishchalnikov.
+
+### [v8.8.2 - 2021-06-23](https://github.com/joke2k/faker/compare/v8.8.1...v8.8.2)
+
+* Avoid collision for ``date`` in ``datetime`` provider. Thanks @mattshin.
+
+### [v8.8.1 - 2021-06-16](https://github.com/joke2k/faker/compare/v8.8.0...v8.8.1)
+
+* Fix ``left_digits`` ignored if ``min_value`` is given. Thanks @OJFord.q
+
+### [v8.8.0 - 2021-06-14](https://github.com/joke2k/faker/compare/v8.7.0...v8.8.0)
+
+* Add ``iana_id``, IANA Registrar ID. Thanks @pishchalnikov.
+
+### [v8.7.0 - 2021-06-11](https://github.com/joke2k/faker/compare/v8.6.0...v8.7.0)
+
+* Add tlds for ``th_TH`` internet provider. Thanks @bact.
+
+### [v8.6.0 - 2021-06-07](https://github.com/joke2k/faker/compare/v8.5.1...v8.6.0)
+
+*  Add ``aba()`` method to generate ABA routing numbers. Thanks @mstellon.
+
+### [v8.5.1 - 2021-06-03](https://github.com/joke2k/faker/compare/v8.5.0...v8.5.1)
+
+* Fix  deepcopy for Faker instances.
+
 ### [v8.5.0 - 2021-06-02](https://github.com/joke2k/faker/compare/v8.4.0...v8.5.0)
 
 *  Add  ``image`` provider. Thanks @n1ngu.
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 00000000..a0ee0b10
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,9 @@
+authors: 
+  - family-names: Faraglia
+    given-names: Daniele
+  - name: "Other Contributors"
+cff-version: 1.2.0
+license: MIT
+message: If you use this software, please cite it using these metadata.
+repository-code: "https://github.com/joke2k/faker"
+title: "Faker"
diff --git a/MANIFEST.in b/MANIFEST.in
index ceb0e3b6..72e4bd43 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -4,6 +4,7 @@ include CONTRIBUTING.rst
 include CHANGELOG.md
 include RELEASE_PROCESS.rst
 include VERSION
+include CITATION.cff
 recursive-include tests *.json
 recursive-include tests *.py
 recursive-exclude faker/sphinx *.py
diff --git a/README.rst b/README.rst
index ba40b1bb..572a393d 100644
--- a/README.rst
+++ b/README.rst
@@ -120,7 +120,7 @@ Localization
 
 ``faker.Faker`` can take a locale as an argument, to return localized
 data. If no localized provider is found, the factory falls back to the
-default en\_US locale.
+default LCID string for US english, ie: ``en_US``.
 
 .. code:: python
 
diff --git a/VERSION b/VERSION
index 6d289079..f61979f1 100644
--- a/VERSION
+++ b/VERSION
@@ -1,1 +1,1 @@
-8.5.0
+8.13.1
diff --git a/docs/conf.py b/docs/conf.py
index bb68cee8..d40775d8 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -51,9 +51,9 @@ copyright = '2014, Daniele Faraglia'
 # built documents.
 #
 # The short X.Y version.
-version = '8.5.0'
+version = '8.13.1'
 # The full version, including alpha/beta/rc tags.
-release = '8.5.0'
+release = '8.13.1'
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
diff --git a/faker/__init__.py b/faker/__init__.py
index 0339112e..f1135ea0 100644
--- a/faker/__init__.py
+++ b/faker/__init__.py
@@ -2,6 +2,6 @@ from faker.factory import Factory
 from faker.generator import Generator
 from faker.proxy import Faker
 
-VERSION = '8.5.0'
+VERSION = '8.13.1'
 
 __all__ = ('Factory', 'Generator', 'Faker')
diff --git a/faker/cli.py b/faker/cli.py
index 786060a3..cef26c7e 100644
--- a/faker/cli.py
+++ b/faker/cli.py
@@ -7,7 +7,7 @@ import sys
 from pathlib import Path
 from typing import Any, Dict, List, Optional, TextIO
 
-from faker import VERSION, Faker, documentor
+from faker import VERSION, Faker, documentor, exceptions
 from faker.config import AVAILABLE_LOCALES, DEFAULT_LOCALE, META_PROVIDERS_MODULES
 
 __author__ = 'joke2k'
@@ -86,8 +86,15 @@ def print_doc(provider_or_field=None,
 
     else:
         doc = documentor.Documentor(fake)
+        unsupported = []
 
-        formatters = doc.get_formatters(with_args=True, with_defaults=True)
+        while True:
+            try:
+                formatters = doc.get_formatters(with_args=True, with_defaults=True, excludes=unsupported)
+            except exceptions.UnsupportedFeature as e:
+                unsupported.append(e.name)
+            else:
+                break
 
         for provider, fakers in formatters:
 
@@ -104,7 +111,7 @@ def print_doc(provider_or_field=None,
 
             for p, fs in d.get_formatters(with_args=True, with_defaults=True,
                                           locale=language,
-                                          excludes=base_provider_formatters):
+                                          excludes=base_provider_formatters + unsupported):
                 print_provider(d, p, fs, output=output)
 
 
diff --git a/faker/exceptions.py b/faker/exceptions.py
index 0feb4dd1..21bc606d 100644
--- a/faker/exceptions.py
+++ b/faker/exceptions.py
@@ -10,3 +10,6 @@ class UniquenessException(BaseFakerException):
 
 class UnsupportedFeature(BaseFakerException):
     """The requested feature is not available on this system."""
+    def __init__(self, msg, name):
+        self.name = name
+        super().__init__(msg)
diff --git a/faker/providers/address/fi_FI/__init__.py b/faker/providers/address/fi_FI/__init__.py
index 045bf386..9ea65fb6 100644
--- a/faker/providers/address/fi_FI/__init__.py
+++ b/faker/providers/address/fi_FI/__init__.py
@@ -95,25 +95,28 @@ class Provider(AddressProvider):
         'Yhdistynyt kuningaskunta', 'Yhdysvallat', 'Zimbabwe',
     )
 
+    # Data from Finnish legislation:
+    # https://www.finlex.fi/fi/laki/alkup/2019/20190978
     states = (
-        'Turun ja Porin lääni', 'Uudenmaan ja Hämeen lääni', 'Pohjanmaan lääni',
-        'Viipurin ja Savonlinnan lääni', 'Käkisalmen lääni',
-        'Savonlinnan ja Kymenkartanon lääni', 'Kymenkartanon ja Savon lääni',
-        'Vaasan lääni', 'Oulun lääni', 'Kymenkartanon lääni',
-        'Savon ja Karjalan lääni', 'Viipurin lääni', 'Uudenmaan lääni',
-        'Hämeen lääni', 'Mikkelin lääni', 'Kuopion lääni', 'Ahvenanmaan lääni',
-        'Petsamon lääni', 'Lapin lääni', 'Kymen lääni', 'Keski-Suomen lääni',
-        'Pohjois-Karjalan lääni', 'Etelä-Suomen lääni', 'Länsi-Suomen lääni',
-        'Itä-Suomen lääni', '', 'Turun ja Porin lääni',
-        'Uudenmaan ja Hämeen lääni', 'Pohjanmaan lääni',
-        'Viipurin ja Savonlinnan lääni', 'Käkisalmen lääni',
-        'Savonlinnan ja Kymenkartanon lääni', 'Kymenkartanon ja Savon lääni',
-        'Vaasan lääni', 'Oulun lääni', 'Kymenkartanon lääni',
-        'Savon ja Karjalan lääni', 'Viipurin lääni', 'Uudenmaan lääni',
-        'Hämeen lääni', 'Mikkelin lääni', 'Kuopion lääni', 'Ahvenanmaan lääni',
-        'Petsamon lääni', 'Lapin lääni', 'Kymen lääni', 'Keski-Suomen lääni',
-        'Pohjois-Karjalan lääni', 'Etelä-Suomen lääni', 'Länsi-Suomen lääni',
-        'Itä-Suomen lääni',
+        'Ahvenanmaa',
+        'Etelä-Karjala',
+        'Etelä-Pohjanmaa',
+        'Etelä-Savo',
+        'Kainuu',
+        'Kanta-Häme',
+        'Keski-Pohjanmaa',
+        'Keski-Suomi',
+        'Kymenlaakso',
+        'Lappi',
+        'Pirkanmaa',
+        'Pohjanmaa',
+        'Pohjois-Karjala',
+        'Pohjois-Pohjanmaa',
+        'Pohjois-Savo',
+        'Päijät-Häme',
+        'Satakunta',
+        'Uusimaa',
+        'Varsinais-Suomi',
     )
 
     street_suffixes = ('tie', 'katu', 'polku', 'kuja', 'bulevardi')
diff --git a/faker/providers/address/uk_UA/__init__.py b/faker/providers/address/uk_UA/__init__.py
index a892049b..75742c60 100644
--- a/faker/providers/address/uk_UA/__init__.py
+++ b/faker/providers/address/uk_UA/__init__.py
@@ -2,13 +2,511 @@ from .. import Provider as AddressProvider
 
 
 class Provider(AddressProvider):
-    address_formats = ['{{street_address}}, {{city}}, {{postcode}}']
+    address_formats = ['{{street_address}}, {{city_name}}, {{postcode}}']
     building_number_formats = ['#', '##', '###']
-    city_formats = ['{{city_prefix}} {{first_name}}']
-    street_address_formats = ['{{street_name}}, {{building_number}}']
-    street_name_formats = ('{{street_prefix}} {{street_title}}', )
+    city_formats = ['{{city_prefix}} {{city_name}}']
+    street_address_formats = ('{{street_prefix}} {{street_name}}, буд. {{building_number}}',
+                              '{{street_prefix}} {{street_name}}, буд. {{building_number}} кв. {{building_number}}')
+
+    street_name_formats = ('{{street_prefix}} {{street_title}}')
 
     city_prefixes = ['місто', 'село', 'селище', 'хутір']
+
+    city_names = (
+        "Авдіївка",
+        "Алмазна",
+        "Алупка",
+        "Алушта",
+        "Алчевськ",
+        "Амвросіївка",
+        "Ананьїв",
+        "Андрушівка",
+        "Антрацит ",
+        "Апостолове",
+        "Армянськ",
+        "Арциз",
+        "Балаклія",
+        "Балта",
+        "Бар",
+        "Баранівка",
+        "Барвінкове",
+        "Батурин",
+        "Бахмач",
+        "Бахмут",
+        "Бахчисарай",
+        "Баштанка",
+        "Белз",
+        "Бердичів",
+        "Бердянськ",
+        "Берегове",
+        "Бережани",
+        "Березань ",
+        "Березівка",
+        "Березне",
+        "Берестечко",
+        "Берислав",
+        "Бершадь",
+        "Бібрка",
+        "Біла Церква",
+        "Білгород-Дністровський",
+        "Білицьке",
+        "Білогірськ",
+        "Білозерське",
+        "Білопілля",
+        "Біляївка",
+        "Благовіщенське",
+        "Бобринець",
+        "Бобровиця",
+        "Богодухів",
+        "Богуслав",
+        "Боково-Хрустальне",
+        "Болград",
+        "Болехів",
+        "Борзна",
+        "Борислав",
+        "Бориспіль",
+        "Борщів",
+        "Боярка",
+        "Бровари",
+        "Броди",
+        "Брянка",
+        "Бунге ",
+        "Буринь",
+        "Бурштин ",
+        "Буськ",
+        "Буча",
+        "Бучач",
+        "Валки ",
+        "Вараш",
+        "Василівка ",
+        "Васильків",
+        "Ватутіне",
+        "Вашківці",
+        "Великі Мости",
+        "Верхівцеве",
+        "Верхньодніпровськ",
+        "Вижниця",
+        "Вилкове",
+        "Винники",
+        "Виноградів",
+        "Вишгород",
+        "Вишневе ",
+        "Вільногірськ",
+        "Вільнянськ",
+        "Вінниця",
+        "Вовчанськ",
+        "Вознесенівка",
+        "Вознесенськ",
+        "Волноваха",
+        "Володимир-Волинський",
+        "Волочиськ",
+        "Ворожба",
+        "Вуглегірськ",
+        "Вугледар",
+        "Гадяч",
+        "Гайворон",
+        "Гайсин",
+        "Галич",
+        "Генічеськ",
+        "Географія Вільнянська",
+        "Герца",
+        "Гірник ",
+        "Гірське",
+        "Глиняни",
+        "Глобине",
+        "Глухів",
+        "Гнівань",
+        "Гола Пристань",
+        "Голубівка",
+        "Горішні Плавні",
+        "Горлівка",
+        "Городенка",
+        "Городище ",
+        "Городня",
+        "Городок",
+        "Горохів",
+        "Гребінка",
+        "Гуляйполе",
+        "Дебальцеве",
+        "Деражня",
+        "Дергачі",
+        "Джанкой",
+        "Дніпро ",
+        "Дніпрорудне",
+        "Добромиль",
+        "Добропілля",
+        "Довжанськ",
+        "Докучаєвськ",
+        "Долина ",
+        "Долинська",
+        "Донецьк",
+        "Дрогобич",
+        "Дружба ",
+        "Дружківка",
+        "Дубляни",
+        "Дубно",
+        "Дубровиця",
+        "Дунаївці",
+        "Енергодар",
+        "Євпаторія",
+        "Єнакієве",
+        "Жашків",
+        "Жданівка",
+        "Жидачів",
+        "Житомир",
+        "Жмеринка",
+        "Жовква",
+        "Жовті Води",
+        "Заводське",
+        "Залізне",
+        "Заліщики",
+        "Запоріжжя",
+        "Заставна",
+        "Збараж",
+        "Зборів",
+        "Звенигородка",
+        "Здолбунів",
+        "Зеленодольськ",
+        "Зимогір\'я",
+        "Зіньків",
+        "Зміїв",
+        "Знам\'янка",
+        "Золоте",
+        "Золотоноша",
+        "Золочів",
+        "Зоринськ",
+        "Зугрес",
+        "Івано-Франківськ",
+        "Ізмаїл",
+        "Ізюм",
+        "Ізяслав",
+        "Іллінці",
+        "Іловайськ",
+        "Інкерман",
+        "Ірміно",
+        "Ірпінь",
+        "Іршава",
+        "Ічня",
+        "Кагарлик",
+        "Кадіївка",
+        "Калинівка ",
+        "Калуш",
+        "Кальміуське",
+        "Кам\'янець-Подільський",
+        "Кам\'янка (Черкаська область)",
+        "Кам\'янка-Бузька",
+        "Кам\'янка-Дніпровська",
+        "Кам\'янське",
+        "Камінь-Каширський",
+        "Канів",
+        "Карлівка",
+        "Каховка",
+        "Керч",
+        "Київ",
+        "Кипуче",
+        "Ківерці",
+        "Кілія",
+        "Кіцмань",
+        "Кобеляки",
+        "Ковель",
+        "Кодима",
+        "Козятин",
+        "Коломия",
+        "Комарно",
+        "Конотоп",
+        "Копичинці",
+        "Корець",
+        "Коростень",
+        "Коростишів",
+        "Корсунь-Шевченківський",
+        "Корюківка",
+        "Косів",
+        "Костопіль",
+        "Костянтинівка",
+        "Краматорськ",
+        "Красилів",
+        "Красногорівка",
+        "Красноград",
+        "Красноперекопськ",
+        "Кременець",
+        "Кременчук",
+        "Кремінна",
+        "Кривий Ріг",
+        "Кролевець",
+        "Кропивницький",
+        "Куп\'янськ",
+        "Курахове",
+        "Ладижин",
+        "Ланівці",
+        "Лебедин",
+        "Лиман ",
+        "Липовець",
+        "Лисичанськ",
+        "Лозова ",
+        "Лохвиця",
+        "Лубни",
+        "Луганськ",
+        "Лутугине",
+        "Луцьк",
+        "Львів",
+        "Любомль",
+        "Люботин",
+        "Макіївка",
+        "Мала Виска",
+        "Малин",
+        "Мар\'їнка",
+        "Марганець ",
+        "Маріуполь",
+        "Мелітополь",
+        "Мена ",
+        "Мерефа",
+        "Миколаїв",
+        "Миколаївка ",
+        "Миргород",
+        "Мирноград",
+        "Миронівка",
+        "Міусинськ",
+        "Могилів-Подільський",
+        "Молодогвардійськ",
+        "Молочанськ",
+        "Монастириська",
+        "Монастирище",
+        "Моршин",
+        "Моспине",
+        "Мостиська",
+        "Мукачево",
+        "Надвірна",
+        "Немирів",
+        "Нетішин",
+        "Ніжин",
+        "Нікополь",
+        "Нова Каховка",
+        "Нова Одеса",
+        "Новгород-Сіверський",
+        "Нове Давидково",
+        "Новий Буг",
+        "Новий Калинів",
+        "Новий Розділ",
+        "Новоазовськ",
+        "Нововолинськ",
+        "Новоград-Волинський",
+        "Новогродівка",
+        "Новодністровськ",
+        "Новодружеськ",
+        "Новомиргород",
+        "Новомосковськ",
+        "Новоселиця",
+        "Новоукраїнка",
+        "Новояворівськ",
+        "Носівка",
+        "Обухів",
+        "Овруч",
+        "Одеса",
+        "Олевськ",
+        "Олександрівськ",
+        "Олександрія",
+        "Олешки",
+        "Оріхів",
+        "Остер ",
+        "Острог",
+        "Охтирка",
+        "Очаків",
+        "П\'ятихатки",
+        "Павлоград",
+        "Первомайськ",
+        "Первомайський ",
+        "Перевальськ",
+        "Перемишляни",
+        "Перечин",
+        "Перещепине",
+        "Переяслав",
+        "Першотравенськ",
+        "Петрово-Красносілля",
+        "Пирятин",
+        "Південне ",
+        "Підгайці",
+        "Підгородне",
+        "Погребище",
+        "Подільськ",
+        "Покров",
+        "Покровськ",
+        "Пологи ",
+        "Полонне",
+        "Полтава",
+        "Помічна",
+        "Попасна",
+        "Почаїв",
+        "Привілля",
+        "Прилуки",
+        "Приморськ (Україна)",
+        "Прип\'ять ",
+        "Пустомити",
+        "Путивль",
+        "Рава-Руська",
+        "Радехів",
+        "Радивилів",
+        "Радомишль",
+        "Рахів",
+        "Рені",
+        "Решетилівка",
+        "Ржищів",
+        "Рівне",
+        "Ровеньки",
+        "Рогатин",
+        "Родинське",
+        "Рожище",
+        "Роздільна",
+        "Ромни",
+        "Рубіжне",
+        "Рудки",
+        "Саки ",
+        "Самбір",
+        "Сарни",
+        "Свалява",
+        "Сватове",
+        "Світловодськ",
+        "Світлодарськ",
+        "Святогірськ",
+        "Севастополь",
+        "Селидове",
+        "Семенівка",
+        "Середина-Буда",
+        "Сєвєродонецьк",
+        "Синельникове",
+        "Сіверськ",
+        "Сімферополь",
+        "Скадовськ",
+        "Скалат",
+        "Сквира",
+        "Сколе",
+        "Славута",
+        "Славутич",
+        "Слов\'янськ",
+        "Сміла",
+        "Снігурівка",
+        "Сніжне",
+        "Сновськ",
+        "Снятин",
+        "Сокаль",
+        "Сокиряни",
+        "Соледар",
+        "Сорокине",
+        "Соснівка ",
+        "Старий Крим",
+        "Старий Самбір",
+        "Старобільськ",
+        "Старокостянтинів",
+        "Стебник",
+        "Сторожинець",
+        "Стрий",
+        "Судак ",
+        "Судова Вишня",
+        "Сулимівка (Слов\'янськ)",
+        "Суми",
+        "Суходільськ",
+        "Таврійськ",
+        "Тальне",
+        "Тараща",
+        "Татарбунари",
+        "Теплодар",
+        "Теребовля",
+        "Тернівка ",
+        "Тернопіль",
+        "Тетіїв",
+        "Тиврів",
+        "Тисмениця",
+        "Тлумач",
+        "Токмак",
+        "Торецьк",
+        "Тростянець",
+        "Трускавець",
+        "Тульчин",
+        "Турка",
+        "Тячів",
+        "Угнів",
+        "Ужгород",
+        "Узин",
+        "Українка ",
+        "Українськ",
+        "Умань",
+        "Устилуг",
+        "Фастів",
+        "Федорівка",
+        "Феодосія",
+        "Харків",
+        "Харцизьк",
+        "Херсон",
+        "Хирів",
+        "Хмельницький",
+        "Хмільник",
+        "Ходорів",
+        "Хорол ",
+        "Хоростків",
+        "Хотин",
+        "Хрестівка",
+        "Христинівка",
+        "Хрустальний",
+        "Хуст",
+        "Часів Яр",
+        "Червоноград",
+        "Червоносів",
+        "Черкаси",
+        "Чернівці",
+        "Чернігів",
+        "Чигирин",
+        "Чистякове",
+        "Чоп",
+        "Чорнобиль",
+        "Чорноморськ",
+        "Чортків",
+        "Чугуїв",
+        "Чуднів",
+        "Шаргород",
+        "Шахтарськ",
+        "Шепетівка",
+        "Шостка",
+        "Шпола",
+        "Шумськ",
+        "Щастя ",
+        "Щолкіне",
+        "Южне",
+        "Южноукраїнськ",
+        "Яворів",
+        "Яготин",
+        "Ялта",
+        "Ямпіль",
+        "Яремче",
+        "Ясинувата",
+    )
+
+    region_names = (
+        "Автономна Республіка Крим",
+        "Вінницька область",
+        "Волинська область",
+        "Дніпропетровська область",
+        "Донецька область",
+        "Житомирська область",
+        "Закарпатська область",
+        "Запорізька область",
+        "Івано-Франківська область",
+        "Київська область",
+        "Кіровоградська область",
+        "Луганська область",
+        "Львівська область",
+        "Миколаївська область",
+        "Одеська область",
+        "Полтавська область",
+        "Рівненська область",
+        "Сумська область",
+        "Тернопільська область",
+        "Харківська область",
+        "Херсонська область",
+        "Хмельницька область",
+        "Черкаська область",
+        "Чернівецька область",
+        "Чернігівська область",
+    )
+
     countries = [
         'Австралія', 'Австрія', 'Азербайджан', 'Албанія', 'Алжир', 'Ангола',
         'Андорра', 'Антигуа і Барбуда', 'Аргентина', 'Афганістан',
@@ -50,196 +548,1519 @@ class Provider(AddressProvider):
         'Чорногорія', 'Швейцарія', 'Швеція', 'Шрі-Ланка', 'Ямайка', 'Японія',
     ]
     street_prefixes = [
-        'вулиця', 'набережна',
+        'вулиця', 'набережна', 'провулок', 'площа', 'проспект', 'узвіз', 'сквер', 'парк', 'шосе',
     ]
-    street_suffixes = ['узвіз']
 
     # https://data.gov.ua/en/dataset/__-120/resource/76e2684f-e75c-45e5-a0b2-6d5596ab47f8
     # https://opendata.drohobych-rada.gov.ua/sites/default/files/%D0%90%D0%B4%D1%80%D0%B5%D1%81%D0%B8%20%D0%94%D1%80%D0%BE%D0%B3%D0%BE%D0%B1%D0%B8%D1%87.xlsx
     street_titles = [
-        '22 Січня',
-        'Адама Міцкевича',
+        '1-ша Лінія 4-ї ст. Люстдорфської дороги',
+        '1-ша Лінія 6-й ст. Люстдорфської дороги',
+        '1-ша Лінія Марії Демченко',
+        '1-ша Суворовська',
+        '1-й Академічний тупик',
+        '10-та Лінія 6-й ст. Люстдорфської дороги',
+        '10-та Лінія Марії Демченко',
+        '10-та Суворовська',
+        '11-ша Лінія 6-й ст. Люстдорфської дороги',
+        '11-та Лінія Марії Демченко',
+        '11-та ст. Великого Фонтану пляж',
+        '11-та Суворовська',
+        '12-та Лінія 6-й ст. Люстдорфської дороги',
+        '12-та ст. Великого Фонтану пляж',
+        '12-та Суворовська',
+        '13-та Лінія 6-й ст. Люстдорфської дороги',
+        '13-та ст. Великого Фонтану пляж',
+        '13-та Суворовська',
+        '14-та Лінія 6-й ст. Люстдорфської дороги',
+        '14-та ст. Великого Фонтану пляж',
+        '14-та Суворовська',
+        '15-та Лінія 6-й ст. Люстдорфської дороги',
+        '15-та ст. Великого Фонтану пляж',
+        '15-та Суворовська',
+        '16-та Лінія 6-й ст. Люстдорфської дороги',
+        '17-та Лінія 6-й ст. Люстдорфської дороги',
+        '18-та Лінія 6-й ст. Люстдорфської дороги',
+        '19-та Лінія',
+        '19-й км Старокиївської дороги',
+        '2-га Лінія 4-ї ст. Люстдорфської дороги',
+        '2-га Лінія 6-й ст. Люстдорфської дороги',
+        '2-га Лінія Марії Демченко',
+        '2-га Суворовська',
+        '2-й Академічний тупик',
+        '21-й км Старокиївської дороги',
+        '3-тя Лінія 4-ї ст. Люстдорфської дороги',
+        '3-тя Лінія 6-й ст. Люстдорфської дороги',
+        '3-тя Лінія Марії Демченко',
+        '3-тя Суворовська',
+        '4-та Лінія 6-й ст. Люстдорфської дороги',
+        '4-та Лінія Марії Демченко',
+        '4-та Суворовська',
+        '40-річчя оборони Одеси',
+        '411-ї батареї',
+        '5-та Лінія 6-й ст. Люстдорфської дороги',
+        '5-та Лінія Марії Демченко',
+        '5-та Суворовська',
+        '6-та Лінія 6-й ст. Люстдорфської дороги',
+        '6-та Лінія Марії Демченко',
+        '6-та Суворовська',
+        '7-ма Лінія 6-й ст. Люстдорфської дороги',
+        '7-ма Лінія Дачі Ковалевського',
+        '7-ма Суворовська',
+        '8-ма Лінія 6-й ст. Люстдорфської дороги',
+        '8-ма Лінія Дачі Ковалевського',
+        '8-ма Суворовська',
+        '9-та Лінія Дачі Ковалевського',
+        '9-та Суворовська',
+        'Абрикосова',
+        'Абрикосовий',
+        'Авангардна',
+        'Авдєєва-Чорноморського',
+        'Авіаторів',
+        'Авіаційна',
+        'Аграрна',
+        'Агрономічна',
+        'Агрономічний',
+        'Адміральський',
+        'Аеродромна',
+        'Аеродромний 1-й',
+        'Аеродромний 2-й',
+        'Аеродромний 3-й',
+        'Аеропортівська',
+        'Аеропортівський 1-й',
+        'Аеропортівський 2-й',
+        'Аеропортівський 3-й',
+        'Аеропортівський 4-й',
+        'Аеропортівський 5-й',
+        'Аеропортівський 6-й',
+        'Азербайджан',
+        'Азовський',
+        'Академіка Богатського',
+        'Академіка Вавилова',
+        'Академіка Векслера',
+        'Академіка Вільямса',
+        'Академіка Вільямса',
+        'Академіка Вільямса',
+        'Академіка Воробйова',
+        'Академіка Гаркавого',
+        'Академіка Глушка',
+        'Академіка Заболотного',
+        'Академіка Корольова',
+        'Академіка Панкратової',
         'Академіка Сахарова',
-        'Андрея Шептицького',
-        'Андрія Мельника',
-        'Андрія Чайковського',
-        'Антона Чехова',
-        'Архипа Люльки',
-        'Байди',
-        'Богдана Лепкого',
+        'Академіка Філатова',
+        'Академіка Ясиновського',
+        'Академічна',
+        'Академічний',
+        'Акордна',
+        'Алмазна',
+        'Альпіністів',
+        'Амбулаторна',
+        'Амбулаторний',
+        'Амбулаторний 1-й',
+        'Амбулаторний 2-й',
+        'Амундсена, 1-й',
+        'Амундсена, 2-й',
+        'Амундсена, 3-й',
+        'Амурська',
+        'Амурський 1-й',
+        'Амурський 2-й',
+        'Амурський 3-й',
+        'Амурський 4-й',
+        'Ананьївська',
+        'Ангарська',
+        'Андреєвського',
+        'Андрійця Олега',
+        'Андросовський',
+        'Анни Ахматової',
+        'Аполона Скальковського',
+        'Аптекарський',
+        'Аркадіївський',
+        'Аркадійська',
+        'Аркаса Миколи',
+        'Армійська',
+        'Артезіанська',
+        'Артилерійська',
+        'Артилерійський 2-й',
+        'Архітекторська',
+        'Архітектурна',
+        'Асєєва Юрія',
+        'Асташкіна',
+        'Асташкіна',
+        'Астрономічна',
+        'Астрономічний',
+        'Ашгабатська',
+        'Бабеля',
+        'Багрицького',
+        'Базарна',
+        'Байдарочний',
+        'Байкал тупик',
+        'Байкальська',
+        'Балківська',
+        'Балтська дорога',
+        'Балтський 1-й',
+        'Балтський 2-й',
+        'Балтський 3-й',
+        'Балтський 4-й',
+        'Балтський 5-й',
+        'Балтський 6-й',
+        'Балтський 7-й',
+        'Балтський 8-й',
+        'Банний',
+        'Баркасний',
+        'Басейна',
+        'Басейний 1-й',
+        'Басейний 2-й',
+        'Басейний 3-й',
+        'Басейний 4-й',
+        'Басейний 6-й',
+        'Бахчева',
+        'Баштанна',
+        'Безіменний',
+        'Берегова',
+        'Березова',
+        'Березовий',
+        'Бернардацці',
+        'Бессарабська',
+        'Бехтерєва',
+        'Бібліотечна',
+        'Білоруська',
+        'Більшовицький',
+        'Біляївська',
+        'Бірюкова',
+        'Бісквітний',
+        'Бітумна',
+        'Благовидової',
         'Богдана Хмельницького',
-        'Бойківська',
-        'Бориса Грінченка',
-        'Бориславська',
-        'Братів Кицилів',
-        'Броніслава Козловського',
-        'Бруно Шульца',
+        'Богуна',
+        'Бодаревського',
+        'Бокаріуса Миколи',
+        'Болгарська',
+        'Болградська',
+        'Бориса Дерев\'янка',
+        'Бориса Літвака',
+        'Бородінська',
+        'Ботанічний',
+        'Братів Поджіо',
+        'Братська',
+        'Брестська',
+        'Бреуса',
+        'Бригадна',
+        'Бугаївська',
         'Будівельна',
-        'Буковинська',
-        "В'ячеслава Чорновола",
-        'Василя Барського',
+        'Будівельний',
+        'Бузкова',
+        'Бузковий',
+        'Бузковий 1-й',
+        'Бузковий 2-й',
+        'Буніна',
+        'Бучми',
+        'В’ячеслава Чорновола',
+        'Валіховський',
+        'Ванний',
+        'Ванцетті',
+        'Ванцетті',
+        'Вапняна',
+        'Вапняне селище',
+        'Вапняний 1-й',
+        'Вапняний 2-й',
+        'Вапняний 3-й',
+        'Варненська',
+        'Василя Кандинського',
+        'Василя Кандинського 1-й',
+        'Василя Кандинського 2-й',
+        'Василя Кандинського 3-й',
+        'Василя Кандинського 4-й',
+        'Василя Кандинського 5-й',
         'Василя Симоненка',
         'Василя Стуса',
-        'Вербова',
+        'Васнецова',
+        'Васнецова',
+        'Ватманський',
+        'Велика Арнаутська',
+        'Велика Садова',
+        'Венгера',
+        'Верещагіна',
+        'Вернидуба',
+        'Верстатобудівна',
+        'Вертелецького',
+        'Верф’яний',
+        'Верхня',
+        'Вершинна',
+        'Весела',
+        'Весняна',
+        'Ветеранів праці',
+        'Вєтрова',
+        'Вєтрогонова',
+        'Виїзна',
+        'Виноградна',
+        'Виноградна 1-ша',
+        'Виноградна 2-га',
+        'Виноградна 3-тя',
+        'Виноградний',
+        'Виноградний тупик',
+        'Висока',
+        'Високий',
+        'Висоцького',
+        'Виставочна',
+        'Вишнева',
+        'Вишневий',
+        'Відважних',
+        'Військовий узвіз',
+        'Вільгельма Габсбурга',
+        'Віри Інбер',
+        'Віри Фігнер',
+        'Віри Холодної',
+        'Вірського',
+        'Вітчизняна',
+        'Віцеадмірала Азарова',
+        'Віцеадмірала Жукова',
+        'Водний',
+        'Водопровідна',
+        'Водопровідний 1-й',
+        'Водопровідний 2-й',
+        'Водопровідний 3-й',
+        'Вознесенський',
         'Вокзальна',
-        'Володимира Івасюка',
-        'Володимира Бірчака',
-        'Володимира Великого',
-        'Володимира Вернадського',
-        'Володимира Винниченка',
-        'Володимира Гнатюка',
-        'Володимира Чапельського',
-        'Володимира Чапельського',
-        'Гайдамацька',
+        'Вокзальний',
+        'Волзький',
+        'Волна тупик',
+        'Волниста',
+        'Володимира Вінниченка',
+        'Володимира Хавкіна',
+        'Володі Дубініна',
+        'Волоколамська',
+        'Воронезька',
+        'Воронцовський',
+        'Восьмого березня',
+        'Восьмого березня 1-й',
+        'Восьмого березня 2-й',
+        'Восьмого березня 3-й',
+        'Восьмого березня 4-й',
+        'Восьмого березня 5-й',
+        'Восьмого березня 6-й',
+        'Восьмого березня 7-й',
+        'Восьмого березня 8-й',
+        'Восьмого березня 9-й',
+        'Восьмого Березня Лінія 1-ша',
+        'Восьмого Березня Лінія 2-га',
+        'Восьмого Березня Лінія 3-тя',
+        'Восьмого Березня Лінія 4-та',
+        'Восьмого Березня Лінія 5-та',
+        'Восьмого березня узвіз',
+        'Восьмого березня узвіз',
+        'Вузький',
+        'Вчительська',
+        'Вчительської, 2-й',
+        'Гаванна',
+        'Гагаріна',
+        'Гагаріна',
+        'Гагаріна',
+        'Гагарінське плато',
+        'Газова',
+        'Газовий',
+        'Гаріна',
+        'Гаршина',
+        'Гаршина',
+        'Гастелло',
+        'Гвардійська',
+        'Гвоздична',
+        'Гвоздичний',
+        'Гена Іоганна',
+        'Генуезька',
+        'Геологічна',
+        'Георгія Гамова',
+        'Геранієва',
         'Героїв Крут',
-        'Глінки',
-        'Гончарська',
-        'Горішня Брама',
-        'Григорія Коссака',
-        'Григорія Сковороди',
-        'Грюнвальдська',
-        'Данила Галицького',
-        'Данила Нечая',
-        'Дмитра Бортнянського',
-        'Дмитра Бурка',
-        'Дмитра Вітовського',
-        'Дмитра Грицая',
-        'Дмитра Котка',
+        'Героїв Небесної Сотні',
+        'Героїв оборони Одеси',
+        'Героїв прикордонників',
+        'Герцена',
+        'Гетьманський',
+        'Гілельса',
+        'Гімназична',
+        'Гладкова',
+        'Глазунова',
+        'Глазунова 1-й',
+        'Глазунова 2-й',
+        'Глиняна',
+        'Глухий міст',
+        'Гоголя',
+        'Головківська',
+        'Головна',
+        'Гонтаренко',
+        'Горбатий міст',
+        'Горбиста',
+        'Горизонтальна',
+        'Горіхова',
+        'Городня',
+        'Госпітальний',
+        'Градоначальницька',
+        'Гранатна',
+        'Гранатний',
+        'Грецька',
+        'Грецька',
+        'Грецький',
+        'Грибоєдова',
+        'Грузинська',
+        'Грузовий',
+        'Давида Ойстраха',
+        'Далекосхідна',
+        'Дальницька',
+        'Дальницьке',
+        'Дальній',
+        'Дальня',
+        'Данила Крижанівського',
+        'Данькевича',
+        'Дача Ковалевського',
+        'Дачна',
+        'Дачний',
+        'Дачний 1-й',
+        'Дачний 2-й',
+        'Дворянська',
+        'Дев’ята',
+        'Деволанівська',
+        'Деволанівський узвіз',
+        'Дежньова',
+        'Декабристів',
+        'Дельфін',
+        'Дем’янова',
+        'Демократична',
+        'Депутатський',
+        'Деревообробна',
+        'Деревообробний 1-й',
+        'Деревообробний 2-й',
+        'Деревообробний 3-й',
+        'Деревообробний 4-й',
+        'Деревообробний 5-й',
+        'Державіна',
+        'Державіна',
+        'Дерибасівська',
+        'Десантний',
+        'Десята',
+        'Десятого квітня',
+        'Десятого квітня',
+        'Джерельна',
+        'Джутовий',
+        'Дзвінка',
+        'Дігтярна',
+        'Дідріхсона',
+        'Діхтієвського Віктора',
+        'Дмитрія Донського',
+        'Дмитрія Донського',
+        'Дніпровська',
+        'Дніпропетровська дорога',
         'Дністровська',
-        'Євгена Гребінки',
-        'Євгена Коновальця',
-        'Захарії Копистенського',
-        'Зварицька',
+        'Добровольського',
+        'Довга',
+        'Довженка',
+        'Докова',
+        'Долинська',
+        'Донецька',
+        'Донцова Дмитра',
+        'Дорбуду',
+        'Дорожня',
+        'Достоєвського',
+        'Достоєвського',
+        'Друга',
+        'Дружний',
+        'Дубова',
+        'Дубовий гай',
+        'Дукова',
+        'Думська',
+        'Дунаєва',
+        'Дунаєвського',
+        'Дунаєвського 1-й',
+        'Дунаєвського 2-й',
+        'Дунаєвського 3-й',
+        'Дунайська',
+        'Дюківська',
+        'Дюківський сад',
+        'Економічний',
+        'Елеваторна',
+        'Естафетна',
+        'Естонська',
+        'Естонський',
+        'Єврейська',
+        'Єлисаветградський',
+        'Єліна',
+        'Єлісаветинська',
+        'Єнісейська',
+        'Єрмака',
+        'Єфімова',
+        'Жаботинського',
+        'Жасминна',
+        'Жевахова',
+        'Желябова',
+        'Житкова',
+        'Житомирська',
+        'Житомирський 3-й',
+        'Житомирський 4-й',
+        'Жоліо-Кюрі',
+        'Жолкова Бориса',
+        'Жуковського',
+        'Заводська',
+        'Заводська 1-ша',
+        'Заводська 2-га',
+        'Заводська 3-тя',
+        'Заводська 4-та',
+        'Заводська 5-та',
+        'Задніпровського',
+        'Закарпатська',
+        'Залізнична',
+        'Залізничний 3-й',
+        'Заньковецької',
+        'Запорізька',
+        'Зарічна',
+        'Західний 1-й',
+        'Західний 2-й',
+        'Західний 3-й',
+        'Західний 4-й',
         'Зелена',
-        'Івана Вагилевича',
-        'Івана Вендзиловича',
-        'Івана Верхратського',
-        'Івана Карпенка-Карого',
-        'Івана Котляревського',
-        'Івана Мазепи',
-        'Івана Макуха',
-        'Івана Пулюя',
-        'Івана Підкови',
-        'Івана Сірка',
-        'Івана Труша',
+        'Зелена балка',
+        'Зелена гірка',
+        'Зелений',
+        'Зернова',
+        'Злакова',
+        'Змієнка Всеволода',
+        'Зої Космодем’янської',
+        'Золотий берег',
+        'Зоопаркова',
+        'Зоринська',
+        'Зоряна',
+        'Івана Вазова',
+        'Івана Микитенка',
         'Івана Франка',
-        'Іллі Рєпіна',
-        'Індустріальна',
-        'Ірини Вільде',
-        'Йосипа Левицького',
-        'Йосипа Сліпого',
-        'Йосифа Стадника',
+        'Івана Франка',
+        'Іванівська',
+        'Іванівський переїзд',
+        'Іванова',
+        'Іванова 1-й',
+        'Іванова 2-й',
+        'Іванова Ігоря',
+        'Івасюка Володимира',
+        'Івахненка Петра',
+        'Ільфа і Петрова',
+        'ім. С.Ю. Вітте',
+        'ім. К.Г. Паустовського',
+        'Інглезі',
+        'Індійська',
+        'Інтернаціональний',
+        'Іподромний',
+        'Іспанська',
+        'Іспанський',
+        'Історія Футболу',
+        'Італійський',
+        'Іцхака Рабіна',
+        'Йосипа Тимченка',
+        'Кавказька',
+        'Кавказький',
+        'Кавунова',
+        'Казанська',
+        'Казковий',
+        'Калинова',
+        'Калнишевського Петра',
+        'Каманіна',
+        'Каманіна',
+        'Камишова',
+        'Канатна',
+        'Канатний',
+        'Капітана Гаврікова',
+        'Капітана Кузнецова',
+        'Кар’єрна',
+        'Карантинна',
+        'Карантинний узвіз',
+        'Каретний',
+        'Каркашадзе',
         'Карпатська',
-        'Кирило - Мефодіївська',
-        'Київська',
-        'Княгині Ольги',
-        'Ковальська',
-        'Козацька',
-        'Коминярська',
+        'Картамишевська',
+        'Картамишевський',
+        'Касима Юрія',
+        'Каспійський',
+        'Катаєва',
+        'Катерининська',
+        'Катерининська',
+        'Каховський',
+        'Качалова',
+        'Каштанова',
+        'Квіткова',
+        'Квітковий',
+        'Квітнева',
+        'Кедровий',
+        'Керченська',
+        'Керченський 1-й',
+        'Керченський 2-й',
+        'Керченський 3-й',
+        'Кибальчича',
+        'Київське',
+        'Килимовий',
+        'Кипарисний 1-й',
+        'Кипарисний 2-й',
+        'Кипарисний 3-й',
+        'Китобійна',
+        'Китобійний 1-й',
+        'Китобійний 2-й',
+        'Кифоренка Бориса',
+        'Кишинівська',
+        'Кільовий',
+        'Кільцева',
+        'Кінна',
+        'Кісельова Ігоря',
+        'Кладовищенська',
+        'Кладовищний',
+        'Кленова',
+        'Клинова',
+        'Ключовий 1-й',
+        'Ключовий 2-й',
+        'Книжковий',
+        'Князівська',
+        'Князівський',
+        'Коблевська',
+        'Ковалевського',
+        'Ковалевського узвіз',
+        'Ковиловий',
+        'Колективний',
+        'Колекційна',
+        'Колонічна',
+        'Колонтаївська',
+        'Комітетська',
+        'Компасний',
+        'Композитора Глинки',
+        'Композитора Глинки',
+        'Композитора Ніщинського',
+        'Кондрашина',
+        'Кондренка',
+        'Конструкторський',
+        'Контрадмірала Луніна',
+        'Кордонна',
+        'Кордонний',
+        'Корнюшина',
+        'Короленка',
+        'Короткий',
+        'Косвена',
+        'Косий',
+        'Космонавта Комарова',
+        'Космонавтів',
+        'Косовська',
+        'Косовський',
+        'Костанді',
+        'Костанді 2-й',
+        'Костанді 3-й',
+        'Кострова',
+        'Косяченка Олексія',
+        'Котляревського',
+        'Коцебу міст',
+        'Коцюбинського',
+        'Кощового отамана',
+        'Крайня',
+        'Красива',
+        'Красна',
+        'Красний',
+        'Красних Зорь',
+        'Краснова',
+        'Красносільська',
+        'Краснослобідська',
+        'Краснослобідський',
+        'Кредитний',
+        'Кренкеля',
+        'Кривобалківська',
+        'Крижанівський',
+        'Крилова',
+        'Кримська',
+        'Кримський',
+        'Кристаловського',
+        'Кришталева',
+        'Кришталевий',
+        'Кропивницького',
+        'Кругова',
+        'Круговий',
+        'Крутоярська',
         'Крушельницької',
-        'Купальська',
-        'Лева Толстого',
-        'Лемківська',
-        'Леся Курбаса',
-        'Леся Мартовича',
+        'Кузнечна',
+        'Куликове поле',
+        'Куликовський 2-й',
+        'Куниці',
+        'Купріна',
+        'Курганська',
+        'Курортний',
+        'Курортний 6-й',
+        'Курська',
+        'Кустанайська',
+        'Кустанайський 2-й',
+        'Кутова',
+        'Кутузова',
+        'Куяльницький міст',
+        'Лавкова',
+        'Лазурний 1-й',
+        'Лазурний 2-й',
+        'Лазурний 3-й',
+        'Лазурний 4-й',
+        'Лазурний 5-й',
+        'Лазурний 6-й',
+        'Ламаний',
+        'Ланжерон',
+        'Ланжеронівська',
+        'Ланжеронівський узвіз',
+        'Латвійський узвіз',
+        'Левадна',
+        'Леваневського',
+        'Леваневського',
+        'Леваневського',
+        'Леваневського тупик',
+        'Левітана',
+        'Левкоєва',
+        'Лейтенанта Шмідта',
+        'Леонова',
+        'Леонтовича',
+        'Лермонтовський',
+        'Лермонтовський 2-й',
+        'Лесі Українки',
         'Лесі Українки',
+        'Леха Качинського',
+        'Лиманна',
+        'Лиманний',
+        'Лиманчик 2-й Лінія 1-ша',
+        'Лиманчик 2-й Лінія 11-та',
+        'Лиманчик 2-й Лінія 2-га',
+        'Лиманчик 2-й Лінія 3-тя',
+        'Лиманчик 2-й Лінія 4-та',
+        'Лиманчик 2-й Лінія 5-та',
+        'Лиманчик 2-й Лінія 8-ма',
+        'Лиманчик 2-й Лінія 9-та',
+        'Лип Івана та Юрія',
+        'Липнева',
+        'Листяна',
+        'Листяний',
+        'Литовська',
+        'Ліверпульський',
+        'Лідерсівський',
+        'Лізи Чайкіної',
+        'Лінійна',
+        'Лінійний',
+        'Лїнія 1-ша',
+        'Лінія 22-га',
+        'Лінія 23-тя',
+        'Лінія 24-та',
+        'Лінія 25-та',
+        'Лінія 26-та',
+        'Лінія 27-ма',
+        'Лінія 28-ма',
+        'Лінія 29-та',
+        'Лінія 30-та',
+        'Лінія 31-ша',
+        'Лінія 32-га',
+        'Лінія 33-тя',
+        'Лінія 35-та',
+        'Лінія 36-та',
+        'Лінія 37-ма',
+        'Лінія 38-ма',
+        'Лінія 39-та',
+        'Лінія 40-ва',
+        'Лінія 41-ша',
+        'Лінія 42-га',
+        'Лінія 43-тя',
+        'Лінія 44-та',
+        'Лінія 45-та',
+        'Лінія 46-та',
+        'Лінія 47-ма',
+        'Лінія 48-ма',
+        'Лінія 49-та',
+        'Лінія 50-та',
+        'Лінія 51-ша',
+        'Лінія 52-га',
+        'Лінія 53-тя',
+        'Лінія 54-та',
+        'Лінія 55-та',
+        'Літакова',
+        'Літературна',
+        'Літній',
+        'Літня',
+        'Лобачевського',
+        'Лодочний',
+        'Локальна',
+        'Локомотивна',
+        'Локомотивний 1-й',
+        'Локомотивний 2-й',
+        'Локомотивний 3-й',
+        'Локомотивний 4-й',
+        'Ломоносова',
+        'Луганська',
+        'Лугова',
+        'Лузанівка',
+        'Лузанівка',
+        'Лузанівська',
+        'Лузанівський',
+        'Лузанівський 1-й',
+        'Лузанівський 2-й',
+        'Лунний',
+        'Луценка Івана',
+        'Луцька',
+        'Лучиста',
+        'Льва Симиренка',
+        'Льва Толстого',
+        'Льва Толстого',
         'Львівська',
-        'Людвіга ван Бетховена',
-        'Лішнянська',
-        'Максима Залізняка',
-        'Максима Кривоноса',
-        'Максима Рильського',
-        'Малий Ринок',
-        'Марка Кропивницького',
-        'Маркіяна Шашкевича',
-        'Марії Заньковецької',
+        'Львівський',
+        'Любашівський',
+        'Людмили Гінзбург',
+        'Люстдорфська дорога',
+        'Люстдорфський',
+        'Лютеранський',
+        'Лютнева',
+        'Лютневий 1-й',
+        'Лютневий 2-й',
+        'Лядова',
+        'Ляпідевського',
+        'Ляпунова',
+        'М’ясоєдовська',
+        'Магістральна',
+        'Магнітогорська',
+        'Магнітогорський',
+        'Магнітогорський 2-й',
+        'Магнітогорський 3-й',
+        'Мазараті',
+        'Мазепи Івана',
+        'Майстерний',
+        'Макаренка',
+        'Макарова',
+        'Макова',
+        'Маковий',
+        'Мала',
+        'Мала Арнаутська',
+        'Мала Садова',
+        'Маланова',
+        'Малиновський',
+        'Маловського',
+        'Манежна',
+        'Манежний',
+        'Маразліївська',
+        'Марата',
+        'Марата 1-й',
+        'Марата 2-й',
+        'Маринеско узвіз',
+        'Мариністів',
+        'Марії Демченко',
+        'Марії Демченко',
+        'Марії Демченко 2-й',
         'Маріїнська',
-        'Механізаторів',
+        'Марсельська',
+        'Маршала Бабаджаняна',
+        'Маршала Говорова',
+        'Маршала Малиновського',
+        'Маршрутна',
+        'Матеріальний 1-й',
+        'Матроська Слобідка',
+        'Матроська Слобідка',
+        'Матроський узвіз',
+        'Матюшенка',
+        'Махачкалинська',
+        'Мацієвської',
+        'Мацієвської узвіз',
+        'Машинобудівний',
+        'Маяковського',
+        'Маячний',
+        'Мелітопольська',
+        'Мельницька',
+        'Металістів',
+        'Метрополітенівський',
+        'Мечникова',
+        'Мечникова',
+        'Мигдальна',
+        'Миколаївська дорога',
+        'Миколаївський 1-й',
+        'Миколи Бажана',
+        'Миколи Боровського',
         'Миколи Вороного',
-        'Миколи Гоголя',
-        'Миколи Леонтовича',
-        'Миколи Лисенка',
-        'Миколи Некрасова',
-        'Мирона Тарнавського',
-        'Мирослава Тураша',
-        'Михайла Вербицького',
+        'Миколи Гефта',
+        'Миколи Гумільова',
+        'Миколи Огренича',
+        'Миколи Плигуна',
+        'Мирна',
+        'Митна',
+        'Митракова',
+        'Михайла Божія',
         'Михайла Грушевського',
-        'Михайла Зубрицького',
-        'Михайла Коцюбинського',
-        'Михайла Лермонтова',
-        'Михайла Остроградського',
-        'Михайла Павлика',
-        'Михайла Старицького',
-        'Млинарська',
-        'Модеста Менцинського',
-        'Музична',
+        'Михайла Жванецького',
+        'Михайлівська',
+        'Михайлівська',
+        'Мінська',
+        'Місячна',
+        'Місячна',
+        'Міхновського Миколи',
+        'Міцкевича',
+        'Мічманський 1-й',
+        'Мічманський 2-й',
+        'Мічуріна',
+        'Мічуріна',
+        'Мічуріна',
+        'Могилівська',
+        'Молоді',
+        'Молодіжна',
+        'Молодіжна',
+        'Молодогвардійська',
+        'Молокова',
+        'Монастирський',
+        'Монгольська',
+        'Морехідна',
+        'Морехідний',
+        'Морська',
+        'Морський',
+        'Морський 2-й',
+        'Москвіна',
+        'Москеті',
+        'Мостовий',
+        'Моторна',
+        'Моторний 1-й',
+        'Моторний 2-й',
+        'Моторний 3-й',
+        'Мукачівський',
+        'Мусіна',
+        'Набережна',
+        'Навігаційний',
+        'Надіїі',
+        'Наклонна',
+        'Наливна',
         'Нафтовиків',
+        'Нафтовиків',
+        'Нафтовиків 1-й',
+        'Нафтовиків 2-й',
+        'Нафтовиків 3-й',
+        'Нахімова',
+        'Наявний 1-й',
+        'Наявний 2-й',
+        'Наявний 3-й',
+        'Наявний 4-й',
+        'Наявний 5-й',
+        'Наявний 6-й',
+        'Наявний 7-й',
+        'Небесної Сотні',
+        'Недєліна',
+        'Нежданової',
+        'Нежданової',
+        'Незалежності',
+        'Некрасова',
+        'Немировича-Данченка',
+        'Неплія',
+        'Нерубайська',
+        'Нескучна',
+        'Нечипуренка',
+        'Ніжинська',
+        'Нікітіна',
+        'Нова',
         'Нова',
+        'Нова',
+        'Новаторів',
+        'Новгородська',
+        'Новгородський',
+        'Новгородський 2-й',
+        'Новий',
+        'Новиков міст',
+        'Новикова',
+        'Новікова 2-га',
+        'Новобазарний',
+        'Новоберегова',
+        'Новомосковська дорога',
+        'Новоселів',
+        'Новоселів',
+        'Новосельского',
+        'Новоукраїнський',
+        'Новощіпний ряд',
+        'Об\'їзна дорога',
+        'Обільна',
+        'Обільний 1-й',
+        'Обільний 2-й',
+        'Оборони Ленінграду',
+        'Обривиста',
+        'Обсерваторний',
+        'Овідіопольська',
+        'Овідіопольська дорога',
+        'Овідіопольська дуга',
+        'Овідіопольський',
+        'Одарія',
+        'Одеса-Головна',
+        'Одеська',
+        'Одеський',
         'Озерна',
-        'Олега Ольжича',
-        'Олександра Кониського',
-        'Олександра Пушкіна',
-        'Олекси Довбуша',
-        'Олексндра Довженка',
-        'Олени Теліги',
-        'Олеся Гончара',
-        'Опришківська',
-        'Осипа Турянського',
+        'Окружна',
+        'Олександра Блока',
+        'Олександра Вронського',
+        'Олександра Кутузакія',
+        'Олександра Матросова',
+        'Олександра Невського',
+        'Олександра Невського 1-й',
+        'Олександра Невського 2-й',
+        'Олександра Невського 3-й',
+        'Олександра Невського 4-й',
+        'Олександра Невського 5-й',
+        'Олександра Стурдзи',
+        'Олександра Тимошенка',
+        'Олександрівський',
+        'Олексіївська',
+        'Ольгіївська',
+        'Ольгіївський узвіз',
+        'Омська',
+        'Онезька',
+        'Онілової',
+        'Оранжерейний',
+        'Орликова',
+        'Орловська',
+        'Орловський',
+        'Осипова',
+        'Осіння',
         'Остапа Вишні',
-        'Остапа Нижанківського',
-        'Павла Грабовського',
-        'Павла Полуботка',
+        'Отамана Головатого',
+        'Отамана Чепіги',
+        'Отрада',
+        'Отрадна',
+        'Офіцерська',
+        'Офіцерський 1-й',
+        'Офіцерський 2-й',
+        'П\'ята',
+        'Пiвденний',
+        'Павла Кравцова',
+        'Павла Шклярука',
+        'Павлова',
+        'Павлодарська',
+        'Палія Семена',
+        'Палубна',
+        'Палубний',
         'Панаса Мирного',
+        'Пантелеймонівська',
+        'Панченка',
+        'Парашутний',
         'Паркова',
-        'Петра Дорошенка',
-        'Петра Сагайдачного',
-        'Пилипа Орлика',
-        'Пластунів',
-        'Прорізна',
+        'Парковий',
+        'Партизанська',
+        'Партизанської Слави',
+        'Парусна',
+        'Пассіонарії',
+        'Пастера',
+        'Патріотична',
+        'Паустовського',
+        'Педагогічна',
+        'Педагогічний',
+        'Пейзажна',
+        'Перемоги',
+        'Перемоги',
+        'Перепечка',
+        'Пересипський міст',
+        'Пересипська 1-ша',
+        'Пересипська 10-та',
+        'Пересипська 2-га',
+        'Пересипська 3-тя',
+        'Пересипська 4-та',
+        'Пересипська 5-та',
+        'Пересипська 6-та',
+        'Пересипська 7-ма',
+        'Пересипська 8-ма',
+        'Пересипська 9-та',
+        'Пересипський 1-й',
+        'Пересипський 2-й',
+        'Пересипський узвіз',
+        'Перлинна',
+        'Перша',
+        'Перший Кришталевий',
+        'Першотравневий 1-й',
+        'Першотравневий 2-й',
+        'Першотравневий 3-й',
+        'Пестеля',
+        'Пестеля',
+        'Петра Лещенка',
+        'Петрашевського',
+        'Пироговська',
+        'Пироговський',
+        'Писарева',
         'Південна',
-        'Раневицька',
-        'Рихтицька',
-        'Рівна',
+        'Південна дорога',
+        'Південно-Санаторний',
+        'Північна',
+        'Північний',
+        'Підйомний',
+        'Пілотна',
+        'Пісочна',
+        'Пісочний',
+        'Пішонівська',
+        'Планетна',
+        'Платанова',
+        'Плієва',
+        'Пляжна',
+        'Побратимів',
+        'Подільська',
+        'Поїзна',
+        'Покровський',
+        'Ползунова 1-й',
+        'Ползунова 2-й',
+        'Політкаторжан',
+        'Політкаторжан',
+        'Полтавська',
+        'Полуничний',
+        'Польова',
+        'Польова',
+        'Польовий 1-й',
+        'Польська',
+        'Польський узвіз',
+        'Поперечний',
+        'Посівна',
+        'Посмітного',
+        'Поштова',
+        'Поштовий',
+        'Преображенська',
+        'Пресича Олександра',
+        'Пржевальського',
+        'Прибережний',
+        'Привозна',
+        'Привокзальна',
+        'Привокзальний',
+        'Приморська',
+        'Приморський',
+        'Приморський',
+        'Прирейкова',
+        'Проектна 1-ша',
+        'Проектна 2-га',
+        'Проектний 5-й',
+        'Проектований 3-й',
+        'Проектований 4-й',
+        'Проїзний 1-й',
+        'Проїзний 2-й',
+        'Проїзний 3-й',
+        'Прокатна',
+        'Пролетарський 3-й',
+        'Промислова',
+        'Промисловий',
+        'Прорізна',
+        'Прорізний',
+        'Просвіти',
+        'Просьолочна',
+        'Проточний',
+        'Професора Каришковського',
+        'Професора Коровицького',
+        'Профспілкова',
+        'Прохоровська',
+        'Прохоровський',
+        'Прохоровський',
+        'Проценка',
+        'Псковська',
+        'Псковський',
+        'Пугачова',
+        'Путьова',
+        'Пушкінська',
+        'ПшеничнаРадищева',
+        'Радіальна',
+        'Радіальний',
+        'Радіо',
+        'Радісна',
+        'Радісний',
+        'Разумовська',
+        'Раїси Сергієнко',
+        'Райдужна',
+        'Ракетна',
+        'Рачкова',
+        'Регенсбург',
+        'Рекордний',
+        'Рельєфна',
+        'Ремонтна',
+        'Республіканська',
+        'Рєпіна',
+        'Рибальська',
+        'Рибальська балка',
+        'Рибальський',
+        'Ризька',
+        'Рівний',
+        'Рівності',
+        'Рівності',
+        'Рівності 1-й',
+        'Рівності 2-й',
         'Різдвяна',
-        'Ріпницька',
-        'Самбірська',
-        'Северина Наливайка',
-        'Солоний Ставок',
-        'Спартака',
+        'Різницький',
+        'Різовська',
+        'Рішельєвська',
+        'Рожева',
+        'Роздольна',
+        'Розкидайлівська',
+        'Розумовський 1-й',
+        'Розумовський 2-й',
+        'Романа Кармена',
+        'Романтиків',
+        'Романтичний',
+        'Ромашкова',
+        'Ростовська',
+        'Рощева',
+        'Рульовий',
+        'Сабанєєв',
+        'Сабанський',
+        'Савицький',
+        'Савранська',
+        'Садиковська',
+        'Садова',
+        'Садова 1-ша',
+        'Садова 2-га',
+        'Садова 3-тя',
+        'Садова 4-та',
+        'Садова 5-та',
+        'Садова 6-та',
+        'Садовий',
+        'Садовського',
+        'Саксаганського',
+        'Салтикова-Щедріна',
+        'Самарська',
+        'Самодіяльна',
+        'Санаторний',
+        'Санітарна',
+        'Сашка Хорошенка',
+        'Світанку',
+        'Світла',
+        'Світлий',
+        'Свободи',
+        'Святослава Ріхтера',
+        'Севастопольський',
+        'Сегедська',
+        'Селекційна',
+        'Селекційний',
+        'Селищна',
+        'Селищний',
+        'Семафорний',
+        'Семінарська',
+        'Сергія Ейзенштейна',
+        'Сергія Уточкіна',
+        'Сергія Ядова',
+        'Серединський',
+        'Середньофонтанська',
+        'Середньофонтанський',
+        'Середня',
+        'Сєрова',
+        'Сєрогодського',
+        'Сєченова',
+        'Сибірська',
+        'Сирітський',
+        'Сирітський 2-й',
+        'Сільська',
+        'Сільськогосподарський',
+        'Сімферопольська',
+        'Сінна',
+        'Скворцова',
+        'Скидановська',
+        'Скидановський узвіз',
+        'Складська',
+        'Скляна',
+        'Скляний 1-й',
+        'Скляний 2-й',
+        'Скляний 3-й',
+        'Скрипковий',
+        'Слави',
+        'Слави',
+        'Слєпньова',
+        'Сливова',
+        'Слобідська',
+        'Слобідський узвіз',
+        'Слов\'янська',
+        'Сміливий',
+        'Смоленська',
+        'Собінова',
+        'Соборна',
+        'Совіньйонівський',
+        'Солонцюватий',
+        'Солонцюватий 1-й',
+        'Соляна',
+        'Соляний 1-й',
+        'Соляний 2-й',
+        'Соляний 3-й',
+        'Соляний 4-й',
+        'Соляний 5-й',
+        'Соляний 6-й',
+        'Соляний 7-й',
+        'Сонячна',
+        'Сонячна',
+        'Сортувальна 1-ша',
+        'Сортувальна 2-га',
+        'Сосюри',
+        'Софії Перовської',
+        'Софіївська',
+        'Соціальна',
+        'Спартаківська',
+        'Спартаківський',
+        'Спаський',
+        'Спиридонівська',
         'Спортивна',
-        'Станіслава Людкевича',
-        'Станіславська',
-        'Степана Коваліва',
-        'Степана Рудавського',
-        'Стрийська',
-        'Східна',
-        'Січових Стрільців',
-        'Тараса Шевченка',
-        'Твердохліба',
-        'Тисменицька',
-        'Тита Реваковича',
+        'Спортивний',
+        'Сталепрокатна',
+        'Стамбульський',
+        'Станційна 1-ша',
+        'Станційна 2-га',
+        'Станційна 3-тя',
+        'Старицького',
+        'Старобазарний',
+        'Старокінний',
+        'Старопортофранківська',
+        'Старорізнична',
+        'Старосінна',
+        'Стахановський 4-й',
+        'Стельмаха',
+        'Степана Олійника узвіз',
+        'Степана Разіна',
+        'Степна',
+        'Степний 2-й',
+        'Степова',
+        'Стеценко',
+        'Стєклова',
+        'Стовпова',
+        'Стороженка Олега',
+        'Стражеска Миколи',
+        'Строганов міст',
+        'Строганова',
+        'Студена',
+        'Студентський',
+        'Студентський 1-й',
+        'Студентський 2-й',
+        'Студентський 3-й',
+        'Студентський 4-й',
+        'Студентський 5-й',
+        'Суворовська',
+        'Суднобудівна',
+        'Суднобудівний',
+        'Сумська',
+        'Сумський',
+        'Суперфосфатна',
+        'Супутників',
+        'Сурикова',
+        'Сурикова 1-й',
+        'Сурикова 2-й',
+        'Сухолиманна',
+        'Східний',
+        'Східний 1-й',
+        'Східний 2-й',
+        'Східчастий 3-й',
+        'Східчастий 4-й',
+        'Східчастий',
+        'Сьома',
+        'Таїрова',
+        'Таїрова',
+        'Танкерна',
+        'Танкістів',
+        'Танфільєва',
+        'Тарутинська',
+        'Творча',
+        'Текстильників',
+        'Теліги Олени',
+        'Тепла',
+        'Теплична',
+        'Тепличний 1-й',
+        'Тепличний 2-й',
+        'Терещенка Володимира',
+        'Тетяни Тесс',
+        'Технічний',
+        'Тещин міст',
+        'Тимірязєва',
+        'Тимірязєва',
+        'Тимірязєва 3-й',
+        'Тимірязєва 4-й',
+        'Тимірязєва 5-й',
+        'Тираспольська',
+        'Тираспольська',
+        'Тираспольське',
         'Тиха',
-        'Трускавецька',
-        'Уляни Кравченко',
-        'Устима Кармелюка',
-        'Устияновичів',
+        'Тіниста',
+        'Тінистий',
+        'Тінистий',
+        'Ткачова',
+        'Товарний',
+        'Толбухіна',
+        'Толбухіна',
+        'Толбухіна',
+        'Тополина',
+        'Тополиний',
+        'Топольського',
+        'Торгова',
+        'Травневий',
+        'Травневий 1-й',
+        'Травневий 2-й',
+        'Травневий 3-й',
+        'Травневий 4-й',
+        'Травневий 5-й',
+        'Тракторна',
+        'Трамвайна',
+        'Трамвайний',
+        'Транспортна',
+        'Траса Здоров\'я',
+        'Троїцька',
+        'Троїцького Миколи',
+        'Тролейбусна',
+        'Трояндова',
+        'Трудова',
+        'Трудовий',
+        'Трудових резервів',
+        'Тульська',
+        'Тульська',
+        'Тупиковий',
+        'Тупиковий 1-й',
+        'Тупиковий 2-й',
+        'Тургенєва',
+        'Туристська',
+        'Туристський',
+        'Тюльпанний',
+        'Угорська',
+        'Удільний',
+        'Українська',
+        'Український 1-й',
+        'Український 2-й',
+        'Український 3-й',
+        'Улітіна',
+        'Уманська',
+        'Умова',
+        'Університетський',
+        'Уральська',
+        'Уральський',
+        'Урожайна',
+        'Усатівська',
+        'Успенська',
+        'Успенський',
+        'Утьосова',
+        'Училищна',
+        'Учительський',
+        'Учнівська',
+        'Ушакова',
+        'Ушинського',
+        'Уютна',
+        'Ф. Пішеніна',
         'Фабрична',
-        'Фредеріка Шопена',
-        'Холмська',
-        'Шевська',
-        'Шкільна',
-        'Шолом Алейхема',
+        'Фестивальний',
+        'Флотська',
+        'Флотський 1-й',
+        'Флотський 2-й',
+        'Флотський 3-й',
+        'Флотський 4-й',
+        'Фонтанська дорога',
+        'Французький',
+        'Фруктовий',
+        'Хаджибейська дорога',
+        'Хаджибейський 1-й',
+        'Хаджибейський 2-й',
+        'Хаджибейський 3-й',
+        'Харківська',
+        'Хвойний',
+        'Херсонський',
+        'Херсонський сквер',
+        'Хімічна',
+        'Хімічний 1-й',
+        'Хімічний 2-й',
+        'Хімічний 3-й',
+        'Хлібна гавань',
+        'Художника Федорова',
+        'Хутірська',
+        'Хутірський',
+        'Цебриківська',
+        'Цегельнозаводська',
+        'Цегляна',
+        'Цементний',
+        'Центральна',
+        'Центральний аеропорт',
+        'Церковна',
+        'Цимлянська',
+        'Ціолковського',
+        'Чайковського',
+        'Чапаєва',
+        'Чапаєва',
+        'Чапаєва',
+        'Чапаєва 2-й',
+        'Черепанових',
+        'Черепанових 2-й',
+        'Черешнева',
+        'Черкаська',
+        'Чернишевського',
+        'Чернівецький',
+        'Чернігівська',
+        'Чернігівський',
+        'Черняховського',
+        'Четверта',
+        'Чехова',
+        'Чорноморка',
+        'Чорноморська',
+        'Чорноморський',
+        'Чорноморський',
+        'Чорноморський 1-й',
+        'Чорноморський 10-й',
+        'Чорноморський 11-й',
+        'Чорноморський 12-й',
+        'Чорноморський 13-й',
+        'Чорноморський 2-й',
+        'Чорноморський 3-й',
+        'Чорноморський 4-й',
+        'Чорноморський 5-й',
+        'Чорноморський 6-й',
+        'Чорноморський 7-й',
+        'Чорноморський 8-й',
+        'Чорноморський 9-й',
+        'Чорноморського козацтва',
+        'Чубаївська',
+        'Чубаївський',
+        'Чумацька',
+        'Шампанський',
+        'Шахтинський',
+        'Шебелінський',
+        'Шевченка',
+        'Шевченка парк',
+        'Шептицікого',
+        'Шефська',
+        'Шилова',
+        'Ширшова',
+        'Ширяївський',
+        'Шишкіна',
+        'Шишкіна',
+        'Шишкіна 1-й',
+        'Шишкіна 2-й',
+        'Шишкіна 3-й',
+        'Шкільний',
+        'Шкільний аеродром',
+        'Шкіперська',
+        'Шкодова гора',
+        'Шовкуненка',
+        'Шовкуненка',
+        'Шолохова',
+        'Шоста',
+        'Шостої 1-й',
+        'Шостої 2-й',
         'Шота Руставелі',
-        'Юліуша Словацького',
-        'Юрія Дрогобича',
-        'Юрія Федьковича',
-        'Якова Головацького',
-        'Ярослава Осмомисла',
+        'Штабний',
+        'Штильова',
+        'Штурвальна',
+        'Штурманська',
+        'Шухевича Романа',
+        'Щіпний',
+        'Щоглова',
+        'Щоголєва',
+        'Щукіна',
+        'Ювілейний 1-й',
+        'Ювілейний 2-й',
+        'Юннатів',
+        'Юннатів 1-й',
+        'Юннатів 2-й',
+        'Юннатів 3-й',
+        'Юрженка Олександра',
+        'Юрія Олеші',
+        'Юрія Яновського',
+        'Юхима Геллера',
+        'Юхима Фесенка',
+        'Яблочкіної',
+        'Яблунева',
+        'Яблучна',
+        'Якірний',
+        'Якутська',
+        'Ялинкова',
+        'Ялинковий',
+        'Ямська',
+        'Ямчитського',
+        'Ярморочна площа',
+        'Яружний',
+        'Ясна',
+        'Яхненка Семена',
+        'Яші Гордієнка',
     ]
 
     def city_prefix(self):
         return self.random_element(self.city_prefixes)
 
+    def city_name(self):
+        return self.random_element(self.city_names)
+
     def postcode(self):
         """The code consists of five digits (01000-99999)"""
         return f'{self.generator.random.randint(0, 10)}{self.generator.random.randint(1000, 10000)}'
@@ -247,5 +2068,13 @@ class Provider(AddressProvider):
     def street_prefix(self):
         return self.random_element(self.street_prefixes)
 
-    def street_title(self):
+    def street_name(self):
         return self.random_element(self.street_titles)
+
+    def street_title(self):
+        prefix = self.street_prefix()
+        street = self.street_name()
+        return prefix + ' ' + street
+
+    def region(self):
+        return self.random_element(self.region_names)
diff --git a/faker/providers/bank/__init__.py b/faker/providers/bank/__init__.py
index ee46e800..9c7407b3 100644
--- a/faker/providers/bank/__init__.py
+++ b/faker/providers/bank/__init__.py
@@ -1,6 +1,7 @@
 import re
 import string
 
+from math import ceil
 from string import ascii_uppercase
 
 from .. import BaseProvider
@@ -29,6 +30,19 @@ class Provider(BaseProvider):
     bban_format = '????#############'
     country_code = 'GB'
 
+    def aba(self):
+        """Generate an ABA routing transit number."""
+        fed_num = self.random_int(min=1, max=12)
+        rand = self.numerify('######')
+        aba = f"{fed_num:02}{rand}"
+
+        # calculate check digit
+        d = [int(n) for n in aba]
+        chk_digit = 3*(d[0] + d[3] + d[6]) + 7*(d[1] + d[4] + d[7]) + d[2] + d[5]
+        chk_digit = ceil(chk_digit/10)*10 - chk_digit
+
+        return f"{aba}{chk_digit}"
+
     def bank_country(self):
         """Generate the bank provider's ISO 3166-1 alpha-2 country code."""
         return self.country_code
diff --git a/faker/providers/bank/ru_RU/__init__.py b/faker/providers/bank/ru_RU/__init__.py
index 1964a828..30a315fc 100644
--- a/faker/providers/bank/ru_RU/__init__.py
+++ b/faker/providers/bank/ru_RU/__init__.py
@@ -19,7 +19,7 @@ class Provider(BankProvider):
         '42', '44', '45', '46', '47', '49', '50', '52', '53', '54', '56', '57', '58', '60', '61', '63',
         '64', '65', '66', '67', '68', '69', '70', '71', '73', '75', '76', '77', '78', '79', '80', '81',
         '82', '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97',
-        '98', '99', '111', '118', '7110', '718', '7114', '719',
+        '98', '99',
     )
 
     department_code_formats = (
diff --git a/faker/providers/currency/pt_BR/__init__.py b/faker/providers/currency/pt_BR/__init__.py
new file mode 100644
index 00000000..17ee8e3f
--- /dev/null
+++ b/faker/providers/currency/pt_BR/__init__.py
@@ -0,0 +1,9 @@
+from .. import Provider as CurrencyProvider
+
+
+class Provider(CurrencyProvider):
+
+    price_formats = ["#,##", "%#,##", "%##,##", "%.###,##", "%#.###,##"]
+
+    def pricetag(self):
+        return ("R$" + self.numerify(self.random_element(self.price_formats)))
diff --git a/faker/providers/date_time/__init__.py b/faker/providers/date_time/__init__.py
index bbd297b6..ba4b3bb6 100644
--- a/faker/providers/date_time/__init__.py
+++ b/faker/providers/date_time/__init__.py
@@ -1,7 +1,9 @@
 import re
 
 from calendar import timegm
-from datetime import MAXYEAR, date, datetime, timedelta
+from datetime import MAXYEAR
+from datetime import date as dtdate
+from datetime import datetime, timedelta
 
 from dateutil import relativedelta
 from dateutil.tz import gettz, tzlocal, tzutc
@@ -1542,7 +1544,7 @@ class Provider(BaseProvider):
 
     @classmethod
     def _parse_date_time(cls, value, tzinfo=None):
-        if isinstance(value, (datetime, date)):
+        if isinstance(value, (datetime, dtdate)):
             return datetime_to_timestamp(value)
         now = datetime.now(tzinfo)
         if isinstance(value, timedelta):
@@ -1560,9 +1562,9 @@ class Provider(BaseProvider):
     def _parse_date(cls, value):
         if isinstance(value, datetime):
             return value.date()
-        elif isinstance(value, date):
+        elif isinstance(value, dtdate):
             return value
-        today = date.today()
+        today = dtdate.today()
         if isinstance(value, timedelta):
             return today + value
         if isinstance(value, str):
@@ -1850,9 +1852,9 @@ class Provider(BaseProvider):
         :example Date('2012-04-04')
         :return Date
         """
-        today = date.today()
-        this_century_start = date(today.year - (today.year % 100), 1, 1)
-        next_century_start = date(this_century_start.year + 100, 1, 1)
+        today = dtdate.today()
+        this_century_start = dtdate(today.year - (today.year % 100), 1, 1)
+        next_century_start = dtdate(this_century_start.year + 100, 1, 1)
 
         if before_today and after_today:
             return self.date_between_dates(
@@ -1873,9 +1875,9 @@ class Provider(BaseProvider):
         :example Date('2012-04-04')
         :return Date
         """
-        today = date.today()
-        this_decade_start = date(today.year - (today.year % 10), 1, 1)
-        next_decade_start = date(this_decade_start.year + 10, 1, 1)
+        today = dtdate.today()
+        this_decade_start = dtdate(today.year - (today.year % 10), 1, 1)
+        next_decade_start = dtdate(this_decade_start.year + 10, 1, 1)
 
         if before_today and after_today:
             return self.date_between_dates(this_decade_start, next_decade_start)
@@ -1895,9 +1897,9 @@ class Provider(BaseProvider):
         :example Date('2012-04-04')
         :return Date
         """
-        today = date.today()
+        today = dtdate.today()
         this_year_start = today.replace(month=1, day=1)
-        next_year_start = date(today.year + 1, 1, 1)
+        next_year_start = dtdate(today.year + 1, 1, 1)
 
         if before_today and after_today:
             return self.date_between_dates(this_year_start, next_year_start)
@@ -1918,7 +1920,7 @@ class Provider(BaseProvider):
         :example DateTime('2012-04-04 11:02:02')
         :return DateTime
         """
-        today = date.today()
+        today = dtdate.today()
         this_month_start = today.replace(day=1)
 
         next_month_start = this_month_start + \
diff --git a/faker/providers/date_time/pt_BR/__init__.py b/faker/providers/date_time/pt_BR/__init__.py
new file mode 100644
index 00000000..e853211f
--- /dev/null
+++ b/faker/providers/date_time/pt_BR/__init__.py
@@ -0,0 +1,37 @@
+from .. import Provider as DateTimeProvider
+
+
+class Provider(DateTimeProvider):
+
+    DAY_NAMES = {
+        "0": "domingo",
+        "1": "segunda-feira",
+        "2": "terça-feira",
+        "3": "quarta-feira",
+        "4": "quinta-feira",
+        "5": "sexta-feira",
+        "6": "sábado",
+    }
+
+    MONTH_NAMES = {
+        "01": "janeiro",
+        "02": "fevereiro",
+        "03": "março",
+        "04": "abril",
+        "05": "maio",
+        "06": "junho",
+        "07": "julho",
+        "08": "agosto",
+        "09": "setembro",
+        "10": "outubro",
+        "11": "novembro",
+        "12": "dezembro",
+    }
+
+    def day_of_week(self):
+        day = self.date("%w")
+        return self.DAY_NAMES[day]
+
+    def month_name(self):
+        month = self.month()
+        return self.MONTH_NAMES[month]
diff --git a/faker/providers/internet/__init__.py b/faker/providers/internet/__init__.py
index eed6bf67..f5ebc38b 100644
--- a/faker/providers/internet/__init__.py
+++ b/faker/providers/internet/__init__.py
@@ -563,3 +563,45 @@ class Provider(BaseProvider):
         height_ = height or self.random_int(max=1024)
         placeholder_url = self.random_element(self.image_placeholder_services)
         return placeholder_url.format(width=width_, height=height_)
+
+    def iana_id(self):
+        """Returns IANA Registrar ID
+        https://www.iana.org/assignments/registrar-ids/registrar-ids.xhtml
+
+        :rtype: str
+        """
+
+        return str(self.random_int(min=1, max=8888888))
+
+    def ripe_id(self):
+        """Returns RIPE Organization ID
+        https://www.ripe.net/manage-ips-and-asns/db/support/organisation-object-in-the-ripe-database
+
+        :rtype: str
+        """
+
+        lex = '?' * self.random_int(min=2, max=4)
+        num = '%' * self.random_int(min=1, max=5)
+        return self.bothify(f'ORG-{lex}{num}-RIPE').upper()
+
+    def nic_handle(self, suffix='FAKE'):
+        """Returns NIC Handle ID
+        https://www.apnic.net/manage-ip/using-whois/guide/person/
+
+        :rtype: str
+        """
+
+        if len(suffix) < 2:
+            raise ValueError('suffix length must be greater than or equal to 2')
+
+        lex = '?' * self.random_int(min=2, max=4)
+        num = '%' * self.random_int(min=1, max=5)
+        return self.bothify(f'{lex}{num}-{suffix}').upper()
+
+    def nic_handles(self, count=1, suffix='????'):
+        """Returns NIC Handle ID list
+
+        :rtype: list[str]
+        """
+
+        return [self.nic_handle(suffix=suffix) for _ in range(count)]
diff --git a/faker/providers/internet/th_TH/__init__.py b/faker/providers/internet/th_TH/__init__.py
new file mode 100644
index 00000000..229ff5e3
--- /dev/null
+++ b/faker/providers/internet/th_TH/__init__.py
@@ -0,0 +1,32 @@
+from collections import OrderedDict
+
+from .. import Provider as InternetProvider
+
+
+class Provider(InternetProvider):
+    free_email_domains = (
+        "hotmail.com",
+        "gmail.com",
+        "outlook.com",
+        "yahoo.com",
+        "ymail.com",
+        "kon.in.th",
+        "icloud.com",
+        "protonmail.com",
+    )
+
+    tlds = OrderedDict(
+        (
+            ("in.th", 100),
+            ("co.th", 80),
+            ("go.th", 40),
+            ("or.th", 40),
+            ("ac.th", 20),
+            ("net.th", 10),
+            ("mi.th", 5),
+            ("co", 10),
+            ("net", 20),
+            ("com", 150),
+            ("org", 50),
+        ),
+    )
diff --git a/faker/providers/misc/__init__.py b/faker/providers/misc/__init__.py
index 5cf7822f..d6572080 100644
--- a/faker/providers/misc/__init__.py
+++ b/faker/providers/misc/__init__.py
@@ -305,7 +305,7 @@ class Provider(BaseProvider):
             import PIL.Image
             import PIL.ImageDraw
         except ImportError:
-            raise UnsupportedFeature("`image` requires the `Pillow` python library.")
+            raise UnsupportedFeature("`image` requires the `Pillow` python library.", "image")
 
         (width, height) = size
         image = PIL.Image.new('RGB', size, self.generator.color(hue=hue, luminosity=luminosity))
diff --git a/faker/providers/person/en_GB/__init__.py b/faker/providers/person/en_GB/__init__.py
index 413fa50b..609332be 100644
--- a/faker/providers/person/en_GB/__init__.py
+++ b/faker/providers/person/en_GB/__init__.py
@@ -588,5 +588,5 @@ class Provider(PersonProvider):
         ('Watkins', 0.06),
     ))
 
-    prefixes_female = ('Mrs.', 'Ms.', 'Miss', 'Dr.')
-    prefixes_male = ('Mr.', 'Dr.')
+    prefixes_female = ('Mrs', 'Ms', 'Miss', 'Dr')
+    prefixes_male = ('Mr', 'Dr')
diff --git a/faker/providers/person/fr_FR/__init__.py b/faker/providers/person/fr_FR/__init__.py
index 42df5875..53a4c41c 100644
--- a/faker/providers/person/fr_FR/__init__.py
+++ b/faker/providers/person/fr_FR/__init__.py
@@ -208,7 +208,6 @@ class Provider(PersonProvider):
         'Margot',
         'Margaret',
         'Maggie',
-        'daisy',
         'Marianne',
         'Marie',
         'Marine',
@@ -259,41 +258,41 @@ class Provider(PersonProvider):
     last_names = (
         'Martin', 'Bernard', 'Thomas', 'Robert', 'Petit', 'Dubois', 'Richard', 'Garcia', 'Durand', 'Moreau', 'Lefebvre',
         'Simon', 'Laurent', 'Michel', 'Leroy', 'Martinez', 'David', 'Fontaine', 'Da Silva', 'Morel', 'Fournier',
-        'Dupont', 'Bertrand', 'Lambert', 'Rousseau', 'Girard', 'Roux', 'Vincent', 'Lefevre', 'Boyer', 'Lopez', 'Bonnet',
-        'Andre', 'Francois', 'Mercier', 'Muller', 'Guerin', 'Legrand', 'Sanchez', 'Garnier', 'Chevalier', 'Faure',
-        'Perez', 'Clement', 'Fernandez', 'Blanc', 'Robin', 'Morin', 'Gauthier', 'Pereira', 'Perrin', 'Roussel', 'Henry',
-        'Duval', 'Gautier', 'Nicolas', 'Masson', 'Marie', 'Noel', 'Ferreira', 'Lemaire', 'Mathieu', 'Riviere', 'Denis',
+        'Dupont', 'Bertrand', 'Lambert', 'Rousseau', 'Girard', 'Roux', 'Vincent', 'Lefèvre', 'Boyer', 'Lopez', 'Bonnet',
+        'Andre', 'François', 'Mercier', 'Muller', 'Guérin', 'Legrand', 'Sanchez', 'Garnier', 'Chevalier', 'Faure',
+        'Perez', 'Clément', 'Fernandez', 'Blanc', 'Robin', 'Morin', 'Gauthier', 'Pereira', 'Perrin', 'Roussel', 'Henry',
+        'Duval', 'Gautier', 'Nicolas', 'Masson', 'Marie', 'Noël', 'Ferreira', 'Lemaire', 'Mathieu', 'Rivière', 'Denis',
         'Marchand', 'Rodriguez', 'Dumont', 'Payet', 'Lucas', 'Dufour', 'Dos Santos', 'Joly', 'Blanchard', 'Meunier',
-        'Rodrigues', 'Caron', 'Gerard', 'Fernandes', 'Brunet', 'Meyer', 'Barbier', 'Leroux', 'Renard', 'Goncalves',
+        'Rodrigues', 'Caron', 'Gérard', 'Fernandes', 'Brunet', 'Meyer', 'Barbier', 'Leroux', 'Renard', 'Goncalves',
         'Gaillard', 'Brun', 'Roy', 'Picard', 'Giraud', 'Roger', 'Schmitt', 'Colin', 'Arnaud', 'Vidal', 'Gonzalez',
         'Lemoine', 'Roche', 'Aubert', 'Olivier', 'Leclercq', 'Pierre', 'Philippe', 'Bourgeois', 'Renaud', 'Martins',
         'Leclerc', 'Guillaume', 'Lacroix', 'Lecomte', 'Benoit', 'Fabre', 'Carpentier', 'Vasseur', 'Louis', 'Hubert',
         'Jean', 'Dumas', 'Rolland', 'Grondin', 'Rey', 'Huet', 'Gomez', 'Dupuis', 'Guillot', 'Berger', 'Moulin',
         'Hoarau', 'Menard', 'Deschamps', 'Fleury', 'Adam', 'Boucher', 'Poirier', 'Bertin', 'Charles', 'Aubry',
         'Da Costa', 'Royer', 'Dupuy', 'Maillard', 'Paris', 'Baron', 'Lopes', 'Guyot', 'Carre', 'Jacquet', 'Renault',
-        'Herve', 'Charpentier', 'Klein', 'Cousin', 'Collet', 'Leger', 'Ribeiro', 'Hernandez', 'Bailly', 'Schneider',
-        'Le Gall', 'Ruiz', 'Langlois', 'Bouvier', 'Gomes', 'Prevost', 'Julien', 'Lebrun', 'Breton', 'Germain', 'Millet',
-        'Boulanger', 'Remy', 'Le Roux', 'Daniel', 'Marques', 'Maillot', 'Leblanc', 'Le Goff', 'Barre', 'Perrot',
-        'Leveque', 'Marty', 'Benard', 'Monnier', 'Hamon', 'Pelletier', 'Alves', 'Etienne', 'Marchal', 'Poulain',
-        'Tessier', 'Lemaitre', 'Guichard', 'Besson', 'Mallet', 'Hoareau', 'Gillet', 'Weber', 'Jacob', 'Collin',
-        'Chevallier', 'Perrier', 'Michaud', 'Carlier', 'Delaunay', 'Chauvin', 'Alexandre', 'Marechal', 'Antoine',
+        'Hervé', 'Charpentier', 'Klein', 'Cousin', 'Collet', 'Léger', 'Ribeiro', 'Hernandez', 'Bailly', 'Schneider',
+        'Le Gall', 'Ruiz', 'Langlois', 'Bouvier', 'Gomes', 'Prévost', 'Julien', 'Lebrun', 'Breton', 'Germain', 'Millet',
+        'Boulanger', 'Rémy', 'Le Roux', 'Daniel', 'Marques', 'Maillot', 'Leblanc', 'Le Goff', 'Barre', 'Perrot',
+        'Lévêque', 'Marty', 'Benard', 'Monnier', 'Hamon', 'Pelletier', 'Alves', 'Étienne', 'Marchal', 'Poulain',
+        'Tessier', 'Lemaître', 'Guichard', 'Besson', 'Mallet', 'Hoareau', 'Gillet', 'Weber', 'Jacob', 'Collin',
+        'Chevallier', 'Perrier', 'Michaud', 'Carlier', 'Delaunay', 'Chauvin', 'Alexandre', 'Maréchal', 'Antoine',
         'Lebon', 'Cordier', 'Lejeune', 'Bouchet', 'Pasquier', 'Legros', 'Delattre', 'Humbert', 'De Oliveira', 'Briand',
         'Lamy', 'Launay', 'Gilbert', 'Perret', 'Lesage', 'Gay', 'Nguyen', 'Navarro', 'Besnard', 'Pichon', 'Hebert',
         'Cohen', 'Pons', 'Lebreton', 'Sauvage', 'De Sousa', 'Pineau', 'Albert', 'Jacques', 'Pinto', 'Barthelemy',
-        'Turpin', 'Bigot', 'Lelievre', 'Georges', 'Reynaud', 'Ollivier', 'Martel', 'Voisin', 'Leduc', 'Guillet',
-        'Vallee', 'Coulon', 'Camus', 'Marin', 'Teixeira', 'Costa', 'Mahe', 'Didier', 'Charrier', 'Gaudin', 'Bodin',
-        'Guillou', 'Gregoire', 'Gros', 'Blanchet', 'Buisson', 'Blondel', 'Paul', 'Dijoux', 'Barbe', 'Hardy', 'Laine',
-        'Evrard', 'Laporte', 'Rossi', 'Joubert', 'Regnier', 'Tanguy', 'Gimenez', 'Allard', 'Devaux', 'Morvan', 'Levy',
+        'Turpin', 'Bigot', 'Lelièvre', 'Georges', 'Reynaud', 'Ollivier', 'Martel', 'Voisin', 'Leduc', 'Guillet',
+        'Vallée', 'Coulon', 'Camus', 'Marin', 'Teixeira', 'Costa', 'Mahe', 'Didier', 'Charrier', 'Gaudin', 'Bodin',
+        'Guillou', 'Grégoire', 'Gros', 'Blanchet', 'Buisson', 'Blondel', 'Paul', 'Dijoux', 'Barbe', 'Hardy', 'Laine',
+        'Evrard', 'Laporte', 'Rossi', 'Joubert', 'Regnier', 'Tanguy', 'Gimenez', 'Allard', 'Devaux', 'Morvan', 'Lévy',
         'Dias', 'Courtois', 'Lenoir', 'Berthelot', 'Pascal', 'Vaillant', 'Guilbert', 'Thibault', 'Moreno', 'Duhamel',
         'Colas', 'Masse', 'Baudry', 'Bruneau', 'Verdier', 'Delorme', 'Blin', 'Guillon', 'Mary', 'Coste', 'Pruvost',
         'Maury', 'Allain', 'Valentin', 'Godard', 'Joseph', 'Brunel', 'Marion', 'Texier', 'Seguin', 'Raynaud', 'Bourdon',
         'Raymond', 'Bonneau', 'Chauvet', 'Maurice', 'Legendre', 'Loiseau', 'Ferrand', 'Toussaint', 'Techer', 'Lombard',
         'Lefort', 'Couturier', 'Bousquet', 'Diaz', 'Riou', 'Clerc', 'Weiss', 'Imbert', 'Jourdan', 'Delahaye', 'Gilles',
-        'Guibert', 'Begue', 'Descamps', 'Delmas', 'Peltier', 'Dupre', 'Chartier', 'Martineau', 'Laroche', 'Leconte',
-        'Maillet', 'Parent', 'Labbe', 'Potier', 'Bazin', 'Normand', 'Pottier', 'Torres', 'Lagarde', 'Blot', 'Jacquot',
-        'Lemonnier', 'Grenier', 'Rocher', 'Bonnin', 'Boutin', 'Fischer', 'Munoz', 'Neveu', 'Lacombe', 'Mendes',
+        'Guibert', 'Bègue', 'Descamps', 'Delmas', 'Peltier', 'Dupré', 'Chartier', 'Martineau', 'Laroche', 'Leconte',
+        'Maillet', 'Parent', 'Labbé', 'Potier', 'Bazin', 'Normand', 'Pottier', 'Torres', 'Lagarde', 'Blot', 'Jacquot',
+        'Lemonnier', 'Grenier', 'Rocher', 'Bonnin', 'Boutin', 'Fischer', 'Munoz', 'Neveu', 'Lacombe', 'Mendès',
         'Delannoy', 'Auger', 'Wagner', 'Fouquet', 'Mace', 'Ramos', 'Pages', 'Petitjean', 'Chauveau', 'Foucher', 'Peron',
-        'Guyon', 'Gallet', 'Rousset', 'Traore', 'Bernier', 'Vallet', 'Letellier', 'Bouvet', 'Hamel', 'Chretien',
+        'Guyon', 'Gallet', 'Rousset', 'Traore', 'Bernier', 'Vallet', 'Letellier', 'Bouvet', 'Hamel', 'Chrétien',
         'Faivre', 'Boulay', 'Thierry', 'Samson', 'Ledoux', 'Salmon', 'Gosselin', 'Lecoq', 'Pires', 'Leleu', 'Becker',
         'Diallo', 'Merle', 'Valette',
     )
diff --git a/faker/providers/person/it_IT/__init__.py b/faker/providers/person/it_IT/__init__.py
index 43c26d52..6858fb14 100644
--- a/faker/providers/person/it_IT/__init__.py
+++ b/faker/providers/person/it_IT/__init__.py
@@ -201,7 +201,7 @@ class Provider(PersonProvider):
         'Monteverdi', 'Monti', 'Morabito', 'Morandi', 'Morandini', 'Morellato', 'Moresi',
         'Moretti', 'Morgagni', 'Morlacchi', 'Morosini', 'Morpurgo', 'Morricone', 'Morrocco',
         'Mortati', 'Morucci', 'Moschino', 'Mozart', 'Munari', 'Muratori', 'Murialdo',
-        'Murri', 'Musatti', 'Mussolini', 'Muti', 'Naccari', 'Nadi', 'Napolitano', 'Natta',
+        'Murri', 'Musatti', 'Muti', 'Naccari', 'Nadi', 'Napolitano', 'Natta',
         'Navarria', 'Navone', 'Necci', 'Nibali', 'Nicoletti', 'Nicolini', 'Nicolucci',
         'Nievo', 'Niggli', 'Niscoromni', 'Nitti', 'Nitto', 'Nolcini', 'Nonis', 'Norbiato',
         'Nordio', 'Nosiglia', 'Notarbartolo', 'Novaro', 'Nugnes', 'Odescalchi', 'Offredi',
@@ -243,7 +243,7 @@ class Provider(PersonProvider):
         'Sokolov', 'Solari', 'Solimena', 'Sollima', 'Sommaruga', 'Sonnino', 'Soprano',
         'Soranzo', 'Sordi', 'Sorrentino', 'Spadafora', 'Spallanzani', 'Spanevello', 'Speri',
         'Spinelli', 'Spinola', 'Squarcione', 'Sraffa', 'Staglieno', 'Stefanelli', 'Stein',
-        'Stoppani', 'Storladi', 'Stradivari', 'Strangio', 'Stucchi', 'Surian', 'T',
+        'Stoppani', 'Storladi', 'Stradivari', 'Strangio', 'Stucchi', 'Surian',
         'Tacchini', 'Taccola', 'Tafuri', 'Tagliafierro', 'Taliani', 'Taliercio', 'Tamborini',
         'Tamburello', 'Tamburi', 'Tamburini', 'Tanzini', 'Tarantini', 'Tarantino', 'Tarchetti',
         'Tartaglia', 'Tartini', 'Tasca', 'Tasso', 'Tassoni', 'Tebaldi', 'Tedesco', 'Telesio',
diff --git a/faker/providers/person/th_TH/__init__.py b/faker/providers/person/th_TH/__init__.py
index 0f8aacf0..3a3f9c84 100644
--- a/faker/providers/person/th_TH/__init__.py
+++ b/faker/providers/person/th_TH/__init__.py
@@ -804,7 +804,7 @@ class Provider(PersonProvider):
         "ถนัดภาษา",
         "ถนัดรบ",
         "ถนัดรักษา",
-        "ถนัดหัดถกรรม",
+        "ถนัดหัตถกรรม",
         "ถนัดอักษร",
         "ถนัดอาวุธ",
         "ถนิมมาศ",
diff --git a/faker/providers/phone_number/ar_AE/__init__.py b/faker/providers/phone_number/ar_AE/__init__.py
new file mode 100644
index 00000000..0a3f04b9
--- /dev/null
+++ b/faker/providers/phone_number/ar_AE/__init__.py
@@ -0,0 +1,91 @@
+from .. import Provider as PhoneNumberProvider
+
+
+class Provider(PhoneNumberProvider):
+    # Source: https://en.wikipedia.org/wiki/Telephone_numbers_in_the_United_Arab_Emirates
+
+    cellphone_formats = (
+        '{{area_code}} {{cellphone_provider_code}} ### ####',
+        '{{area_code}}{{cellphone_provider_code}}#######',
+        '0{{cellphone_provider_code}} ### ####',
+        '0{{cellphone_provider_code}}#######',
+    )
+
+    telephone_formats = (
+        '{{area_code}} {{telephone_provider_code}} ### ####',
+        '{{area_code}}{{telephone_provider_code}}#######',
+        '0{{telephone_provider_code}} ### ####',
+        '0{{telephone_provider_code}}#######',
+    )
+
+    toll_formats = (
+        '200####',
+        '600######',
+        '800###',
+        '800####',
+        '800#####',
+        '800######',
+        '800#######',
+    )
+
+    services_phones_formats = (
+        '999',
+        '901',
+        '998',
+        '997',
+        '996',
+        '991',
+        '922',
+    )
+
+    formats = cellphone_formats + \
+        telephone_formats + \
+        services_phones_formats + \
+        toll_formats
+
+    def cellphone_provider_code(self):
+        return self.random_element([
+            '50',
+            '52',
+            '54',
+            '55',
+            '56',
+            '58',
+        ])
+
+    def telephone_provider_code(self):
+        return self.random_element([
+            '1',
+            '2',
+            '3',
+            '4',
+            '6',
+            '7',
+            '9',
+        ])
+
+    def area_code(self):
+        return self.random_element([
+            '00971',
+            '+971',
+        ])
+
+    def cellphone_number(self):
+        pattern = self.random_element(self.cellphone_formats)
+        return self.numerify(self.generator.parse(pattern))
+
+    def telephone_number(self):
+        pattern = self.random_element(self.telephone_formats)
+        return self.numerify(self.generator.parse(pattern))
+
+    def service_phone_number(self):
+        pattern = self.random_element(self.services_phones_formats)
+        return self.numerify(self.generator.parse(pattern))
+
+    def toll_number(self):
+        pattern = self.random_element(self.toll_formats)
+        return self.numerify(self.generator.parse(pattern))
+
+    def phone_number(self):
+        pattern = self.random_element(self.formats)
+        return self.numerify(self.generator.parse(pattern))
diff --git a/faker/providers/phone_number/ar_PS/__init__.py b/faker/providers/phone_number/ar_PS/__init__.py
index 0bbf52d6..dca200dd 100644
--- a/faker/providers/phone_number/ar_PS/__init__.py
+++ b/faker/providers/phone_number/ar_PS/__init__.py
@@ -90,7 +90,7 @@ class Provider(PhoneNumberProvider):
 
     )
 
-    toll_foramts = (
+    toll_formats = (
         '1 700 ### ###',
         '1-700-###-###',
         '1 800 ### ###',
@@ -106,7 +106,7 @@ class Provider(PhoneNumberProvider):
     formats = cellphone_formats + \
         telephone_formats + \
         services_phones_formats + \
-        toll_foramts
+        toll_formats
 
     def provider_code(self):
         return self.random_element([
@@ -135,7 +135,7 @@ class Provider(PhoneNumberProvider):
         return self.numerify(self.generator.parse(pattern))
 
     def toll_number(self):
-        pattern = self.random_element(self.toll_foramts)
+        pattern = self.random_element(self.toll_formats)
         return self.numerify(self.generator.parse(pattern))
 
     def phone_number(self):
diff --git a/faker/providers/phone_number/pt_BR/__init__.py b/faker/providers/phone_number/pt_BR/__init__.py
index 46b1fb0b..2097f2ff 100644
--- a/faker/providers/phone_number/pt_BR/__init__.py
+++ b/faker/providers/phone_number/pt_BR/__init__.py
@@ -75,6 +75,14 @@ class Provider(PhoneNumberProvider):
         '71 ####-####',
         '81 ####-####',
         '84 ####-####',
+        '0300 ### ####',
+        '0500 ### ####',
+        '0800 ### ####',
+        '0900 ### ####',
+        '0300-###-####',
+        '0500-###-####',
+        '0800-###-####',
+        '0900-###-####',
     )
 
     msisdn_formats = (
@@ -102,6 +110,31 @@ class Provider(PhoneNumberProvider):
         '+55 (##) 9 ####-####',
     )
 
+    services_phones_formats = (
+        '100',
+        '128',
+        '151',
+        '152',
+        '153',
+        '156',
+        '180',
+        '181',
+        '185',
+        '188',
+        '190',
+        '191',
+        '192',
+        '193',
+        '194',
+        '197',
+        '198',
+        '199',
+    )
+
     def cellphone_number(self):
         pattern = self.random_element(self.cellphone_formats)
         return self.numerify(self.generator.parse(pattern))
+
+    def service_phone_number(self):
+        pattern = self.random_element(self.services_phones_formats)
+        return self.numerify(self.generator.parse(pattern))
diff --git a/faker/providers/python/__init__.py b/faker/providers/python/__init__.py
index 7823f592..ec28ddc0 100644
--- a/faker/providers/python/__init__.py
+++ b/faker/providers/python/__init__.py
@@ -1,3 +1,4 @@
+import math
 import string
 import sys
 import warnings
@@ -69,10 +70,15 @@ class Provider(BaseProvider):
         if positive and min_value is not None and min_value <= 0:
             raise ValueError(
                 'Cannot combine positive=True with negative or zero min_value')
+        if left_digits is not None and max_value and math.ceil(math.log10(abs(max_value))) > left_digits:
+            raise ValueError('Max value must fit within left digits')
+        if left_digits is not None and min_value and math.ceil(math.log10(abs(min_value))) > left_digits:
+            raise ValueError('Min value must fit within left digits')
 
         # Make sure at least either left or right is set
         if left_digits is None and right_digits is None:
-            left_digits = self.random_int(1, sys.float_info.dig - 1)
+            needed_left_digits = max(1, math.ceil(math.log10(max(abs(max_value or 1), abs(min_value or 1)))))
+            right_digits = self.random_int(1, sys.float_info.dig - needed_left_digits)
 
         # If only one side is set, choose #digits for other side
         if (left_digits is None) ^ (right_digits is None):
@@ -90,6 +96,13 @@ class Provider(BaseProvider):
 
         sign = ''
         if (min_value is not None) or (max_value is not None):
+            # Make sure left_digits still respected
+            if left_digits is not None:
+                if max_value is None:
+                    max_value = 10 ** left_digits  # minus smallest representable, adjusted later
+                if min_value is None:
+                    min_value = -(10 ** left_digits)  # plus smallest representable, adjusted later
+
             if max_value is not None and max_value < 0:
                 max_value += 1  # as the random_int will be generated up to max_value - 1
             if min_value is not None and min_value < 0:
@@ -107,6 +120,14 @@ class Provider(BaseProvider):
                 result = float('0.' + '0' * (right_digits - 1) + '1')
             else:
                 result += sys.float_info.epsilon
+
+        if right_digits:
+            result = min(result, 10 ** left_digits - float(f'0.{"0" * (right_digits - 1)}1'))
+            result = max(result, -(10 ** left_digits + float(f'0.{"0" * (right_digits - 1)}1')))
+        else:
+            result = min(result, 10 ** left_digits - 1)
+            result = max(result, -(10 ** left_digits + 1))
+
         return result
 
     def _safe_random_int(self, min_value, max_value, positive):
diff --git a/faker/providers/user_agent/__init__.py b/faker/providers/user_agent/__init__.py
index 2a4c8a7d..40fe1830 100644
--- a/faker/providers/user_agent/__init__.py
+++ b/faker/providers/user_agent/__init__.py
@@ -192,7 +192,7 @@ class Provider(BaseProvider):
 
     def mac_platform_token(self):
         """Generate a MacOS platform token used in user agent strings."""
-        return (f'Macintosh; {self.random_element(self.mac_processors)} Mac OS X 10 '
+        return (f'Macintosh; {self.random_element(self.mac_processors)} Mac OS X 10_'
                 f'{self.generator.random.randint(5, 12)}_{self.generator.random.randint(0, 9)}')
 
     def android_platform_token(self):
diff --git a/faker/proxy.py b/faker/proxy.py
index bed7316e..25d29525 100644
--- a/faker/proxy.py
+++ b/faker/proxy.py
@@ -1,3 +1,4 @@
+import copy
 import functools
 import random
 import re
@@ -100,7 +101,6 @@ class Faker:
         :param attr: attribute name
         :return: the appropriate attribute
         """
-
         if len(self._factories) == 1:
             return getattr(self._factories[0], attr)
         elif attr in self.generator_attrs:
@@ -113,6 +113,23 @@ class Faker:
             factory = self._select_factory(attr)
             return getattr(factory, attr)
 
+    def __deepcopy__(self, memodict={}):
+        cls = self.__class__
+        result = cls.__new__(cls)
+        result._locales = copy.deepcopy(self._locales)
+        result._factories = copy.deepcopy(self._factories)
+        result._factory_map = copy.deepcopy(self._factory_map)
+        result._weights = copy.deepcopy(self._weights)
+        result._unique_proxy = UniqueProxy(self)
+        result._unique_proxy._seen = {
+            k: {result._unique_proxy._sentinel}
+            for k in self._unique_proxy._seen.keys()
+        }
+        return result
+
+    def __setstate__(self, state):
+        self.__dict__.update(state)
+
     @property
     def unique(self):
         return self._unique_proxy
@@ -266,6 +283,16 @@ class UniqueProxy:
         else:
             raise TypeError("Accessing non-functions through .unique is not supported.")
 
+    def __getstate__(self):
+        # Copy the object's state from self.__dict__ which contains
+        # all our instance attributes. Always use the dict.copy()
+        # method to avoid modifying the original state.
+        state = self.__dict__.copy()
+        return state
+
+    def __setstate__(self, state):
+        self.__dict__.update(state)
+
     def _wrap(self, name, function):
         @functools.wraps(function)
         def wrapper(*args, **kwargs):
diff --git a/faker/py.typed b/faker/py.typed
new file mode 100644
index 00000000..e69de29b
diff --git a/faker/utils/distribution.py b/faker/utils/distribution.py
index 64cc2e08..93b133d4 100644
--- a/faker/utils/distribution.py
+++ b/faker/utils/distribution.py
@@ -61,7 +61,7 @@ def choices_distribution(
 
     if hasattr(random, 'choices'):
         if length == 1 and p is None:
-            return (random.choice(a),)
+            return [random.choice(a)]
         else:
             return random.choices(a, weights=p, k=length)
     else:
diff --git a/setup.py b/setup.py
index 5e418e25..4cde7624 100644
--- a/setup.py
+++ b/setup.py
@@ -59,6 +59,9 @@ setup(
     url='https://github.com/joke2k/faker',
     license='MIT License',
     packages=find_packages(exclude=excluded_packages),
+    package_data={
+        "faker": ["py.typed"],
+    },
     platforms=["any"],
     zip_safe=zip_safe,
     python_requires=">=3.6",


Test patch:
diff --git a/.github/workflows/test-ubuntu.yml b/.github/workflows/ci.yml
similarity index 74%
rename from .github/workflows/test-ubuntu.yml
rename to .github/workflows/ci.yml
index 2d2a786a..64ff14b4 100644
--- a/.github/workflows/test-ubuntu.yml
+++ b/.github/workflows/ci.yml
@@ -1,10 +1,42 @@
 name: Python Tests
 
-on: [push]
+on:
+  push:
+    branches:
+      - master
+  pull_request:
+    branches:
+      - master
 
 jobs:
+  lint:
+    runs-on: ubuntu-latest
+
+    steps:
+    - uses: actions/checkout@v2
+    - name: Set up Python
+      uses: actions/setup-python@v2
+      with:
+        python-version: '3.x'
+    - name: Install dependencies
+      run: |
+        python -m pip install tox
+    - name: Lint with flake8
+      run: tox
+      env:
+        TOXENV: flake8
+    - name: Check manifest
+      run: tox
+      env:
+        TOXENV: checkmanifest
+    - name: isort
+      run: tox
+      env:
+        TOXENV: isort
+
   test_ubuntu:
     runs-on: ubuntu-latest
+    needs: [lint]
     strategy:
       matrix:
         python: [3.6, 3.7, 3.8, 3.9, "pypy3"]
@@ -30,6 +62,7 @@ jobs:
 
   test_alpine:
     runs-on: ubuntu-latest
+    needs: [lint]
 
     steps:
     - uses: actions/checkout@v2
@@ -48,6 +81,7 @@ jobs:
 
   test_32bit:
     runs-on: ubuntu-latest
+    needs: [lint]
 
     steps:
     - uses: actions/checkout@v2
diff --git a/tests/providers/__init__.py b/tests/providers/__init__.py
index 23816985..af1f6767 100644
--- a/tests/providers/__init__.py
+++ b/tests/providers/__init__.py
@@ -152,6 +152,16 @@ class TestBaseProvider:
             letter = faker.random_letter()
             assert letter.isalpha()
 
+    @pytest.mark.parametrize('length', [0, 1, 2], ids=[
+        'empty_list', 'list_with_one_element', 'list_with_two_elements',
+    ])
+    def test_random_letters(self, faker, length):
+        letters = faker.random_letters(length=length)
+        assert len(letters) == length
+        assert isinstance(letters, list)
+        for letter in letters:
+            assert letter.isalpha()
+
     def test_random_lowercase_letter(self, faker, num_samples):
         for _ in range(num_samples):
             letter = faker.random_lowercase_letter()
diff --git a/tests/providers/test_bank.py b/tests/providers/test_bank.py
index 9a3276ec..cd6760ae 100644
--- a/tests/providers/test_bank.py
+++ b/tests/providers/test_bank.py
@@ -23,8 +23,21 @@ def is_valid_iban(iban):
     return check % 97 == 1
 
 
+def is_valid_aba(aba):
+    d = [int(n) for n in aba]
+    chkdgt = (3*(d[0]+d[3]+d[6]) + 7*(d[1]+d[4]+d[7]) + (d[2]+d[5]+d[8]))
+    if chkdgt % 10 == 0:
+        return True
+    return False
+
+
 class TestNoNo:
     """Test no_NO bank provider"""
+    def test_aba(self, faker, num_samples):
+        for _ in range(num_samples):
+            aba = faker.aba()
+            assert len(aba) == 9
+            assert is_valid_aba(aba)
 
     def test_bban(self, faker, num_samples):
         for _ in range(num_samples):
diff --git a/tests/providers/test_currency.py b/tests/providers/test_currency.py
index 60703517..d63a8a38 100644
--- a/tests/providers/test_currency.py
+++ b/tests/providers/test_currency.py
@@ -346,3 +346,19 @@ class TestRoRo:
         for _ in range(num_samples):
             pricetag = faker.pricetag()
             assert isinstance(pricetag, str)
+
+
+class TestPtBr:
+    """Test pt_BR currency provider"""
+
+    num_samples = 100
+
+    @classmethod
+    def setup_class(cls):
+        from faker.providers.currency.pt_BR import Provider as PtBrCurrencyProvider
+        cls.provider = PtBrCurrencyProvider
+
+    def test_pricetag(self, faker, num_samples):
+        for _ in range(num_samples):
+            pricetag = faker.pricetag()
+            assert isinstance(pricetag, str)
diff --git a/tests/providers/test_date_time.py b/tests/providers/test_date_time.py
index c48bcd56..33c4f16a 100644
--- a/tests/providers/test_date_time.py
+++ b/tests/providers/test_date_time.py
@@ -25,6 +25,7 @@ from faker.providers.date_time.es_ES import Provider as EsEsProvider
 from faker.providers.date_time.hy_AM import Provider as HyAmProvider
 from faker.providers.date_time.it_IT import Provider as ItItProvider
 from faker.providers.date_time.pl_PL import Provider as PlProvider
+from faker.providers.date_time.pt_BR import Provider as PtBrProvider
 from faker.providers.date_time.pt_PT import Provider as PtPtProvider
 from faker.providers.date_time.ro_RO import Provider as RoRoProvider
 from faker.providers.date_time.ru_RU import Provider as RuProvider
@@ -83,6 +84,12 @@ class TestDateTime(unittest.TestCase):
         assert date <= end_date
         assert date >= start_date
 
+    def test_date(self):
+        date_format = '%Y-%m-%d'
+        date_string = self.fake.date(pattern=date_format)
+        assert isinstance(date_string, str)
+        assert isinstance(datetime.strptime(date_string, date_format), datetime)
+
     def test_day(self):
         day = self.fake.day_of_week()
         assert isinstance(day, str)
@@ -1097,6 +1104,21 @@ class TestTrTr(unittest.TestCase):
         assert month in TrTrProvider.MONTH_NAMES.values()
 
 
+class TestPtBr(unittest.TestCase):
+
+    def setUp(self):
+        self.fake = Faker('pt_BR')
+        Faker.seed(0)
+
+    def test_day(self):
+        day = self.fake.day_of_week()
+        assert day in PtBrProvider.DAY_NAMES.values()
+
+    def test_month(self):
+        month = self.fake.month_name()
+        assert month in PtBrProvider.MONTH_NAMES.values()
+
+
 class TestPtPt(unittest.TestCase):
 
     def setUp(self):
diff --git a/tests/providers/test_internet.py b/tests/providers/test_internet.py
index b2db5731..2f9c37d9 100644
--- a/tests/providers/test_internet.py
+++ b/tests/providers/test_internet.py
@@ -14,6 +14,8 @@ from faker.providers.internet.en_GB import Provider as EnGbInternetProvider
 from faker.providers.internet.es_ES import Provider as EsEsInternetProvider
 from faker.providers.internet.pl_PL import Provider as PlPlInternetProvider
 from faker.providers.internet.ro_RO import Provider as RoRoInternetProvider
+from faker.providers.internet.ru_RU import Provider as RuRuInternetProvider
+from faker.providers.internet.th_TH import Provider as ThThInternetProvider
 from faker.providers.internet.zh_CN import Provider as ZhCnInternetProvider
 from faker.providers.person.ja_JP import Provider as JaPersonProvider
 from faker.utils import text
@@ -303,6 +305,30 @@ class TestInternetProvider:
         expected_domain = 'cqphixmpdfpptskr.com'
         assert faker.dga(day=1, month=1, year=1000, tld='com', length=16) == expected_domain
 
+    def test_iana_id(self, faker, num_samples):
+        for _ in range(num_samples):
+            assert 1 <= int(faker.iana_id()) <= 8888888
+
+    def test_ripe_id(self, faker, num_samples):
+        pattern = re.compile(r'^ORG-[A-Z]{2,4}[1-9]\d{0,4}-RIPE$')
+        for _ in range(num_samples):
+            assert pattern.fullmatch(faker.ripe_id())
+
+    def test_nic_handles(self, faker, num_samples):
+        pattern = re.compile(r'^[A-Z]{2,4}[1-9]\d{0,4}-[A-Z]*')
+        for _ in range(num_samples):
+            nhs = faker.nic_handles()
+            for nh in nhs:
+                assert pattern.fullmatch(nh)
+
+        nhs = faker.nic_handles(suffix='??', count=num_samples)
+        assert len(nhs) == num_samples
+        for nh in nhs:
+            assert pattern.fullmatch(nh)
+
+        with pytest.raises(ValueError):
+            faker.nic_handles(suffix='')
+
 
 class TestInternetProviderUrl:
     """ Test internet url generation """
@@ -664,3 +690,48 @@ class TestRoRo:
     def test_tld(self, faker):
         tld = faker.tld()
         assert tld in PlPlInternetProvider.tlds
+
+
+class TestRuRu:
+    """Test ru_RU internet provider methods"""
+
+    def test_free_email_domain(self, faker):
+        assert faker.free_email_domain() in RuRuInternetProvider.free_email_domains
+
+    def test_tld(self, faker):
+        assert faker.tld() in RuRuInternetProvider.tlds
+
+    @patch(
+        'faker.providers.internet.Provider.user_name',
+        lambda x: 'ИванИванов',
+    )
+    def test_ascii_safe_email(self, faker):
+        email = faker.ascii_safe_email()
+        validate_email(email)
+        assert email.split('@')[0] == 'ivanivanov'
+
+    @patch(
+        'faker.providers.internet.Provider.user_name',
+        lambda x: 'АлександрСмирнов',
+    )
+    def test_ascii_free_email(self, faker):
+        email = faker.ascii_free_email()
+        validate_email(email)
+        assert email.split('@')[0] == 'aleksandrsmirnov'
+
+    @patch(
+        'faker.providers.internet.Provider.user_name',
+        lambda x: 'СергейКузнецов',
+    )
+    def test_ascii_company_email(self, faker):
+        email = faker.ascii_company_email()
+        validate_email(email)
+        assert email.split('@')[0] == 'sergekuznetsov'
+
+
+class TestThTh:
+    """Test th_TH internet provider methods"""
+
+    def test_tld(self, faker):
+        tld = faker.tld()
+        assert tld in ThThInternetProvider.tlds
diff --git a/tests/providers/test_misc.py b/tests/providers/test_misc.py
index 41de338d..35413597 100644
--- a/tests/providers/test_misc.py
+++ b/tests/providers/test_misc.py
@@ -326,9 +326,11 @@ class TestMiscProvider:
 
     def test_image_no_pillow(self, faker):
         with patch.dict("sys.modules", {"PIL": None}):
-            with pytest.raises(exceptions.UnsupportedFeature):
+            with pytest.raises(exceptions.UnsupportedFeature) as excinfo:
                 faker.image()
 
+            assert excinfo.value.name == "image"
+
     def test_dsv_with_invalid_values(self, faker):
         with pytest.raises(ValueError):
             faker.dsv(num_rows='1')
diff --git a/tests/providers/test_phone_number.py b/tests/providers/test_phone_number.py
index 952e3259..287cfae5 100644
--- a/tests/providers/test_phone_number.py
+++ b/tests/providers/test_phone_number.py
@@ -37,7 +37,8 @@ class TestPtBr:
         pattern = re.compile(
             r'(?:\+55 )?'
             r'(?:[1-8]1|84|\((?:0[1-8]1|084)\))'
-            r' \d{4}[ -]\d{4}',
+            r' \d{4}[ -]\d{4}|'
+            r'\d{4}?[ -]\d{3}[ -]\d{4}',
         )
         for _ in range(num_samples):
             phone_number = faker.phone_number()
@@ -59,6 +60,12 @@ class TestPtBr:
             cellphone = faker.cellphone_number()
             assert pattern.fullmatch(cellphone)
 
+    def test_service_phone(self, faker, num_samples):
+        pattern = re.compile(r'1(?:0|2|5|8|9)?(?:[0-9])')
+        for _ in range(num_samples):
+            service = faker.service_phone_number()
+            assert pattern.fullmatch(service)
+
 
 class TestHuHu:
     """Test hu_HU phone number provider methods"""
@@ -246,3 +253,59 @@ class TestEsEs:
         for _ in range(num_samples):
             phone_number = faker.phone_number()
             assert pattern.fullmatch(phone_number)
+
+
+class TestArAe:
+    """Test ar_AE phone number provider methods"""
+
+    cellphone_pattern = (
+        r'(?:\+|00)971\s?5[024568]\s?\d{3}\s?\d{4}|'
+        r'05[024568]\s?\d{3}\s?\d{4}'
+    )
+    telephone_pattern = (
+        r'(?:\+|00)971\s?[1234679]\s?\d{3}\s?\d{4}|'
+        r'0[1234679]\s?\d{3}\s?\d{4}'
+    )
+    toll_pattern = (
+        r'200\d{4}|'
+        r'600\d{6}|'
+        r'800\d{3,7}'
+    )
+    service_phone_pattern = (
+        r'9(?:9(?:9|8|7|6|1)|01|22)'
+    )
+
+    def test_cellphone_number(self, faker, num_samples):
+        pattern = re.compile(self.cellphone_pattern)
+        for _ in range(num_samples):
+            cellphone = faker.cellphone_number()
+            assert pattern.fullmatch(cellphone)
+
+    def test_telephone_number(self, faker, num_samples):
+        pattern = re.compile(self.telephone_pattern)
+        for _ in range(num_samples):
+            telephone = faker.telephone_number()
+            assert pattern.fullmatch(telephone)
+
+    def test_toll_number(self, faker, num_samples):
+        pattern = re.compile(self.toll_pattern)
+        for _ in range(num_samples):
+            toll = faker.toll_number()
+            assert pattern.fullmatch(toll)
+
+    def test_service_phone_number(self, faker, num_samples):
+        pattern = re.compile(self.service_phone_pattern)
+        for _ in range(num_samples):
+            service = faker.service_phone_number()
+            assert pattern.fullmatch(service)
+
+    def test_phone_number(self, faker, num_samples):
+        pattern = re.compile(
+            rf'{self.cellphone_pattern}|'
+            rf'{self.telephone_pattern}|'
+            rf'{self.toll_pattern}|'
+            rf'{self.service_phone_pattern}',
+        )
+        for _ in range(num_samples):
+            phone = faker.phone_number()
+            assert pattern.fullmatch(phone)
diff --git a/tests/providers/test_python.py b/tests/providers/test_python.py
index 30592d06..afe4229b 100644
--- a/tests/providers/test_python.py
+++ b/tests/providers/test_python.py
@@ -132,6 +132,16 @@ class TestPyfloat(unittest.TestCase):
             result = self.fake.pyfloat(min_value=min_value)
             self.assertGreaterEqual(result, min_value)
 
+    def test_min_value_and_left_digits(self):
+        """
+        Combining the min_value and left_digits keyword arguments produces
+        numbers that obey both of those constraints.
+        """
+
+        result = self.fake.pyfloat(left_digits=1, min_value=0)
+        self.assertLess(result, 10)
+        self.assertGreaterEqual(result, 0)
+
     def test_max_value(self):
         max_values = (0, 10, -1000, 1000, 999999)
 
@@ -139,6 +149,16 @@ class TestPyfloat(unittest.TestCase):
             result = self.fake.pyfloat(max_value=max_value)
             self.assertLessEqual(result, max_value)
 
+    def test_max_value_zero_and_left_digits(self):
+        """
+        Combining the max_value and left_digits keyword arguments produces
+        numbers that obey both of those constraints.
+        """
+
+        result = self.fake.pyfloat(left_digits=2, max_value=0)
+        self.assertLessEqual(result, 0)
+        self.assertGreater(result, -100)
+
     def test_max_value_should_be_greater_than_min_value(self):
         """
         An exception should be raised if min_value is greater than max_value
@@ -160,6 +180,17 @@ class TestPyfloat(unittest.TestCase):
         self.assertLessEqual(result, 100)
         self.assertGreater(result, 0)
 
+    def test_max_and_min_value_negative(self):
+        """
+        Combining the max_value and min_value keyword arguments with
+        negative values for each produces numbers that obey both of
+        those constraints.
+        """
+
+        result = self.fake.pyfloat(max_value=-100, min_value=-200)
+        self.assertLessEqual(result, -100)
+        self.assertGreaterEqual(result, -200)
+
     def test_positive_and_min_value_incompatible(self):
         """
         An exception should be raised if positive=True is set, but
diff --git a/tests/providers/test_user_agent.py b/tests/providers/test_user_agent.py
index 0e8ab70c..cda2fccc 100644
--- a/tests/providers/test_user_agent.py
+++ b/tests/providers/test_user_agent.py
@@ -8,6 +8,7 @@ class TestUserAgentProvider:
     num_samples = 1000
     android_token_pattern = re.compile(r'Android (?P<android_version>\d+(?:\.\d){0,2})')
     ios_token_pattern = re.compile(r'^(?P<apple_device>.*?); CPU \1 OS (?P<ios_version>\d+(?:_\d){0,2}) like Mac OS X')
+    mac_token_pattern = re.compile(r'Macintosh; (?P<mac_processor>.*?) Mac OS X 10_([5-9]|1[0-2])_(\d)')
 
     def test_android_platform_token(self, faker, num_samples):
         for _ in range(num_samples):
@@ -19,3 +20,8 @@ class TestUserAgentProvider:
             match = self.ios_token_pattern.fullmatch(faker.ios_platform_token())
             assert match.group('apple_device') in UaProvider.apple_devices
             assert match.group('ios_version').replace('_', '.') in UaProvider.ios_versions
+
+    def test_mac_platform_token(self, faker, num_samples):
+        for _ in range(num_samples):
+            match = self.mac_token_pattern.fullmatch(faker.mac_platform_token())
+            assert match.group('mac_processor') in UaProvider.mac_processors
diff --git a/tests/test_proxy.py b/tests/test_proxy.py
index 38de6650..f2cacd53 100644
--- a/tests/test_proxy.py
+++ b/tests/test_proxy.py
@@ -1,3 +1,5 @@
+import copy
+import pickle
 import random
 
 from collections import OrderedDict
@@ -389,3 +391,14 @@ class TestFakerProxyClass:
         expected = sorted(expected)
         attributes = dir(fake)
         assert attributes == expected
+
+    def test_copy(self):
+        fake = Faker("it_IT")
+        fake2 = copy.deepcopy(fake)
+        assert fake.locales == fake2.locales
+        assert fake.locales is not fake2.locales
+
+    def test_pickle(self):
+        fake = Faker()
+        pickled = pickle.dumps(fake)
+        pickle.loads(pickled)