Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
2dda137
Merge metadata changes from upstream 8.12.44
daviddrysdale Feb 25, 2022
81027e3
Generated files for metadata
daviddrysdale Feb 25, 2022
821454c
Prep for 8.12.44 release
daviddrysdale Feb 25, 2022
214fcb1
Merge metadata changes from upstream 8.12.45
daviddrysdale Mar 11, 2022
c3b6d23
Generated files for metadata
daviddrysdale Mar 11, 2022
6db6ffa
Prep for 8.12.45 release
daviddrysdale Mar 11, 2022
1338d6c
Merge metadata changes from upstream 8.12.46
daviddrysdale Apr 1, 2022
0e0ca00
Generated files for metadata
daviddrysdale Apr 1, 2022
f92246d
Prep for 8.12.46 release
daviddrysdale Apr 1, 2022
d84e6c1
Merge metadata changes from upstream 8.12.47
daviddrysdale Apr 21, 2022
f06ff47
Generated files for metadata
daviddrysdale Apr 21, 2022
26655fc
Add extra tests from upstream
daviddrysdale Apr 21, 2022
4da649d
Prep for 8.12.47 release
daviddrysdale Apr 21, 2022
4d017ef
Merge metadata changes from upstream 8.12.48
daviddrysdale May 6, 2022
cf45cfb
Generated files for metadata
daviddrysdale May 6, 2022
a500e29
Prep for 8.12.48 release
daviddrysdale May 6, 2022
9761786
Merge metadata changes from upstream 8.12.49
daviddrysdale May 28, 2022
0bf4931
Generated files for metadata
daviddrysdale May 28, 2022
1405136
Prep for 8.12.49 release
daviddrysdale May 28, 2022
d3209ea
ci: pin protobuf dep in coverage.yml too
daviddrysdale May 28, 2022
0271114
tests: use assertIsNone in phonenumberutiltest.py (#242)
penmetsaa Jun 10, 2022
94931e0
Merge metadata changes from upstream 8.12.50
daviddrysdale Jun 10, 2022
d86771c
Generated files for metadata
daviddrysdale Jun 10, 2022
ec339e5
Prep for 8.12.50 release
daviddrysdale Jun 10, 2022
9055710
Merge code changes from upstream 8.12.51
daviddrysdale Jul 1, 2022
dfb476f
Merge metadata changes from upstream 8.12.51
daviddrysdale Jul 1, 2022
0319ba6
Generated files for metadata
daviddrysdale Jul 1, 2022
e896b61
Prep for 8.12.51 release
daviddrysdale Jul 1, 2022
8ef0fa4
ci: pin versions of dependencies
daviddrysdale Jul 1, 2022
3981d27
Merge metadata changes from upstream 8.12.52
daviddrysdale Jul 19, 2022
11cf84c
Generated files for metadata
daviddrysdale Jul 19, 2022
fdc02ac
Prep for 8.12.52 release
daviddrysdale Jul 19, 2022
0224550
Fix new lint from pycodestyle v2.9.0
daviddrysdale Jul 31, 2022
9c98d55
docs: Fix a few typos (#246)
timgates42 Jul 31, 2022
ee2fe76
Merge metadata changes from upstream 8.12.53
daviddrysdale Aug 4, 2022
c5cf1b0
Generated files for metadata
daviddrysdale Aug 4, 2022
f12e9ac
Prep for 8.12.53 release
daviddrysdale Aug 4, 2022
cd5886b
Merge metadata changes from upstream 8.12.54
daviddrysdale Aug 19, 2022
be45325
Generated files for metadata
daviddrysdale Aug 19, 2022
c2fe6f4
Prep for 8.12.54 release
daviddrysdale Aug 19, 2022
09a7204
Merge metadata changes from upstream 8.12.55
daviddrysdale Sep 9, 2022
751ce42
Generated files for metadata
daviddrysdale Sep 9, 2022
4af9941
Prep for 8.12.55 release
daviddrysdale Sep 9, 2022
334f9d1
Merge metadata changes from upstream 8.12.56
daviddrysdale Sep 24, 2022
4002dab
Generated files for metadata
daviddrysdale Sep 24, 2022
d08079c
Prep for 8.12.56 release
daviddrysdale Sep 24, 2022
79bbe0f
Merge metadata changes from upstream 8.12.57
daviddrysdale Oct 14, 2022
679a137
Generated files for metadata
daviddrysdale Oct 14, 2022
466e4c5
Prep for 8.12.57 release
daviddrysdale Oct 14, 2022
e97c76d
tools: don’t auto-regen locale data
daviddrysdale Nov 6, 2022
e610dc9
Merge metadata changes from upstream 8.13.0
daviddrysdale Nov 6, 2022
846d48c
Generated files for metadata
daviddrysdale Nov 6, 2022
fe2f0c1
Prep for 8.13.0 release
daviddrysdale Nov 6, 2022
5963b05
tools: don't use clean target in metaclean
daviddrysdale Nov 6, 2022
6bfb588
Merge metadata changes from upstream 8.13.1
daviddrysdale Nov 28, 2022
cf0bd82
Generated files for metadata
daviddrysdale Nov 28, 2022
9983353
Prep for 8.13.1 release
daviddrysdale Nov 28, 2022
71b6326
tests: deregister fake data afterwards (#255)
daviddrysdale Nov 30, 2022
3dba77a
Merge metadata changes from upstream 8.13.2
daviddrysdale Dec 8, 2022
3c76d07
Generated files for metadata
daviddrysdale Dec 8, 2022
68ec061
Prep for 8.13.2 release
daviddrysdale Dec 8, 2022
111b3db
Merge metadata changes from upstream 8.13.3
daviddrysdale Dec 22, 2022
b129b66
Generated files for metadata
daviddrysdale Dec 22, 2022
525bc01
Prep for 8.13.3 release
daviddrysdale Dec 22, 2022
220ab0b
tests: deregister fake data afterwards
daviddrysdale Jan 3, 2023
b3e8f97
Update copyright dates to 2023 in generated files
daviddrysdale Jan 3, 2023
dfc6e82
Merge metadata changes from upstream 8.13.4
daviddrysdale Jan 9, 2023
0681fa3
Generated files for metadata
daviddrysdale Jan 9, 2023
e6c0866
Prep for 8.13.4 release
daviddrysdale Jan 9, 2023
6c19ffb
chore(tests): add Python 3.11 in CI runs/trove classifier (#265)
stegayet Jan 24, 2023
1f13816
Merge metadata changes from upstream 8.13.5
daviddrysdale Jan 29, 2023
c760aa4
Generated files for metadata
daviddrysdale Jan 29, 2023
0c34b8a
Prep for 8.13.5 release
daviddrysdale Jan 29, 2023
6915d82
Merge metadata changes from upstream 8.13.6
daviddrysdale Feb 10, 2023
c3256b4
Generated files for metadata
daviddrysdale Feb 10, 2023
056702d
Prep for 8.13.6 release
daviddrysdale Feb 10, 2023
f79a987
Merge metadata changes from upstream 8.13.7
daviddrysdale Mar 3, 2023
5abcfbf
Generated files for metadata
daviddrysdale Mar 3, 2023
4d8fa31
Prep for 8.13.7 release
daviddrysdale Mar 3, 2023
cb25526
Merge metadata changes from upstream 8.13.8
daviddrysdale Mar 27, 2023
a2bb276
Generated files for metadata
daviddrysdale Mar 27, 2023
7e6378a
Merge code changes from upstream v8.13.8
daviddrysdale Mar 27, 2023
a60408d
Prep for 8.13.8 release
daviddrysdale Mar 27, 2023
f2f5a22
Merge metadata changes from upstream 8.13.9
daviddrysdale Apr 10, 2023
216dc62
Generated files for metadata
daviddrysdale Apr 10, 2023
56f8c3a
Prep for 8.13.9 release
daviddrysdale Apr 10, 2023
0b7a399
ci: move to ubuntu-20.04
daviddrysdale Apr 11, 2023
c464a74
Fix up doc comments
daviddrysdale Apr 18, 2023
19b9e52
Add CountryCodeSource.to_string() helper
daviddrysdale Apr 18, 2023
60389e4
Add local utility to simulate Java code results
daviddrysdale Apr 18, 2023
c9ecd77
appspot.py: add command line options
daviddrysdale Apr 18, 2023
8dd9d82
Tests for CountryCodeSource.to_string
daviddrysdale Apr 18, 2023
81c117a
Merge metadata changes from upstream 8.13.10
daviddrysdale Apr 18, 2023
e1dd7e5
Generated files for metadata
daviddrysdale Apr 18, 2023
a7a9796
Prep for 8.13.10 release
daviddrysdale Apr 18, 2023
5d48593
Merge metadata changes from upstream 8.13.11
daviddrysdale Apr 27, 2023
59f0ef6
Generated files for metadata
daviddrysdale Apr 27, 2023
653a6b5
Prep for 8.13.11 release
daviddrysdale Apr 27, 2023
76934f5
Merge metadata changes from upstream 8.13.12
daviddrysdale May 30, 2023
aea7e87
Generated files for metadata
daviddrysdale May 30, 2023
e4b0573
Prep for 8.13.12 release
daviddrysdale May 30, 2023
caeb8c6
Merge metadata changes from upstream 8.13.13
daviddrysdale May 30, 2023
a75b9ca
Generated files for metadata
daviddrysdale May 30, 2023
fbe4492
Prep for 8.13.13 release
daviddrysdale May 30, 2023
19f942a
Merge metadata changes from upstream 8.13.14
daviddrysdale Jun 13, 2023
71ff9c7
Generated files for metadata
daviddrysdale Jun 13, 2023
be79521
Prep for 8.13.14 release
daviddrysdale Jun 13, 2023
da7179b
New Tests
rajpan Aug 26, 2019
0a245b3
New Tests
rajpan Aug 26, 2019
48f02c2
Add Dialpadistan region
CoreyFirespotter Jul 31, 2018
f5dedf4
TEL-10934 - Unable To Dialpad Florida Number From Desktop & Mobile App
rajpan Feb 12, 2020
abb76b9
Changes for new NPA in Canada
rajpan Jul 1, 2020
00977e0
DP-13742: Fix to Indonesia toll free numbers
danadialpad Sep 20, 2018
6c2ff54
TEL-12621 - Unable dial new Poland Police prefix +48 47 731 4848
rajpan Oct 15, 2020
90f2cd6
Rename test file
rajpan Oct 15, 2020
60fe16e
TEL-13057 - Supporting new Number format for Ivory Coast
rajpan Jan 27, 2021
38756f2
Quarterly update
rajpan Jul 13, 2021
55dd797
New Colombia format
rajpan Sep 7, 2021
4213ba6
Fixing the Unit Tests for Region Dialpadistan
rajpan Sep 14, 2021
3a85e5d
fix for https://dialpad.atlassian.net/browse/DP-60739
hassan-dialpad Nov 18, 2022
99476fa
DP-67544:Issue with phone numbers not showing in CSR, but are in FST
JerinDialpad Mar 21, 2023
97e6668
Add test
JerinDialpad Jun 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
8 changes: 4 additions & 4 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ permissions:
jobs:
build:

runs-on: ubuntu-18.04
runs-on: ubuntu-20.04
strategy:
matrix:
python-version: [2.7, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, "3.10", pypy2, pypy3]
python-version: [2.7, 3.5, 3.6, 3.7, 3.8, 3.9, "3.10", 3.11, pypy2.7, pypy3.9]

steps:
- uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@f38219332975fe8f9c04cca981d674bf22aea1d3 # v2
uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/coverage.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@ jobs:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@629c2de402a417ea7690ca6ce3f33229e27606a5 # v2
- uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c # v3
- name: Set up latest Python 3
uses: actions/setup-python@f38219332975fe8f9c04cca981d674bf22aea1d3 # v2
uses: actions/setup-python@d27e3f3d7c64b4bbf8e4abfb9b63b83e846e0435 # v4
with:
python-version: 3
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install protobuf pycodestyle coverage coveralls
pip install protobuf==3.17.3 pycodestyle coverage coveralls
- name: Test with coverage
run: |
cd python
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/typing.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install mypy==0.921 types-protobuf
pip install mypy==0.921 types-protobuf==3.19.21

- name: Execute run_stubtest.py
run: |
Expand All @@ -39,7 +39,7 @@ jobs:
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install mypy types-protobuf
pip install mypy==0.921 types-protobuf==3.19.21

- name: Run mypy
run: |
Expand Down
18 changes: 18 additions & 0 deletions python/HISTORY.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,24 @@ This file does not generally include descriptions of patch releases (vX.Y.Z
changes. (Metadata updates are best checked
[upstream](https://github.com/google/libphonenumber/blob/master/release_notes.txt).)

What's new in 8.13.8
--------------------

Merge to
[upstream commit 07cd7bbb8a2f](https://github.com/google/libphonenumber/commit/07cd7bbb8a2f);
relevant code changes:

- Added a check to phonenumberutil.py that the value of the `phone-context` parameter of the tel URI follows the correct
syntax as defined in [RFC3966](https://www.rfc-editor.org/rfc/rfc3966#section-3).

What's new in 8.13.0
--------------------

Merge to [upstream commit
185004cabd1bb4d3](https://github.com/google/libphonenumber/commit/185004cabd1bb4d3). Upstream has
removed the `leading_zero_possible` field from the `PhoneMetadata` type as part of this version;
however, this change is *not* mirrored in the Python code due to back-compatibility concerns.

What's new in 8.12.40
---------------------

Expand Down
129 changes: 129 additions & 0 deletions python/appspot.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
#!/usr/bin/env python
"""
Script for comparison with https://phonenumber.appspot.com
"""
import getopt
import phonenumbers
import phonenumbers.carrier
import phonenumbers.geocoder
import phonenumbers.timezone
from phonenumbers import PhoneNumberFormat
import sys
import urllib.parse

def interactive_query():
number = prompt("Specify a Phone Number: ")
country = prompt_or_default("Specify a Default Country: ", None)
locale = prompt_or_default("Specify a locale for phone number geocoding: ", "en")
return (number, country, locale)

def prompt(msg):
result = input(msg)
return result.strip()

def prompt_or_default(msg, default):
result = prompt(msg)
if not result:
return default
else:
return result


def blank_if_none(val):
if val is None:
return ""
else:
return val

def appspot(number, country, locale):
print("\n\nPhone Number entered: %s" % number)
print("Default country entered: %s" % country)
print("Language entered: %s" % locale)
country = "ZZ" if country is None else country

numobj = phonenumbers.parse(number, country, keep_raw_input=True)
print("\nParsing result (parse(keep_raw_input=True))")
print("country_code : %s" % blank_if_none(numobj.country_code))
print("national_number : %s" % blank_if_none(numobj.national_number))
print("extension : %s" % blank_if_none(numobj.extension))
print("country_code_source : %s" % blank_if_none(phonenumbers.CountryCodeSource.to_string(numobj.country_code_source)))
print("italian_leading_zero : %s" % blank_if_none(numobj.italian_leading_zero))
print("number_of_leading_zeros : %s" % blank_if_none(numobj.number_of_leading_zeros))
print("raw_input : %s" % blank_if_none(numobj.raw_input))
print("preferred_domestic_carrier_code: %s" % blank_if_none(numobj.preferred_domestic_carrier_code))

valid = phonenumbers.is_valid_number(numobj)
print("\nValidation Results")
print("Result from isPossibleNumber() : %s" % phonenumbers.is_possible_number(numobj))
print("Result from isValidNumber() : %s" % valid)
if valid and country != "ZZ":
print("Result from isValidNumberForRegion(): %s" % phonenumbers.is_valid_number_for_region(numobj, country))
print("Phone Number region : %s" % phonenumbers.region_code_for_number(numobj))
print("Result from getNumberType() : %s" % phonenumbers.PhoneNumberType.to_string(phonenumbers.number_type(numobj)))


print("\nFormatting Results")
print("E164 format : %s" % (phonenumbers.format_number(numobj, PhoneNumberFormat.E164) if valid else "invalid"))
print("Original format : %s" % phonenumbers.format_in_original_format(numobj, country))
print("National format : %s" % phonenumbers.format_number(numobj, PhoneNumberFormat.NATIONAL))
print("International format : %s" % (phonenumbers.format_number(numobj, PhoneNumberFormat.INTERNATIONAL) if valid else "invalid"))
print("Out-of-country format from US : %s" % (phonenumbers.format_out_of_country_calling_number(numobj, "US") if valid else "invalid"))
print("Out-of-country format from CH : %s" % (phonenumbers.format_out_of_country_calling_number(numobj, "CH") if valid else "invalid"))
print("Format number for mobile dialing (calling from US) : %s" % (phonenumbers.format_number_for_mobile_dialing(numobj, "US", True) if valid else "invalid"))
print("Format for national dialing with preferred carrier code: %s" % (phonenumbers.format_national_number_with_carrier_code(numobj, "") if valid else "invalid"))
print(" and empty fallback carrier code")


print("\nAsYouTypeFormatter Results")
formatter = phonenumbers.AsYouTypeFormatter(country)
for i in range(len(number)):
input_char = number[i]
print("Char entered '%s' Output: %s" % (input_char, formatter.input_digit(input_char)))

if valid:
print("\nPhoneNumberOfflineGeocoder Results")
print("Location: %s" % phonenumbers.geocoder.description_for_number(numobj, locale))

print("\nPhoneNumberToTimeZonesMapper Results")
print("Time zone(s): [%s]" % ", ".join(phonenumbers.timezone.time_zones_for_number(numobj)))

print("\nPhoneNumberToCarrierMapper Results")
print("Carrier: %s" % phonenumbers.carrier.name_for_number(numobj, locale))

print("\nPython library version: %s" % phonenumbers.__version__)
print("\nCompare with: https://libphonenumber.appspot.com/phonenumberparser?number=%s&country=%s" % (urllib.parse.quote_plus(number), country))


def usage():
print("./appspot.py [opts]")
print(" --number <val> / -n <val> : number to parse")
print(" --country <val> / -c <val> : default country for parsing (default None)")
print(" --locale <val> / -l <val> : language (default None)")
print(" --help / -h : show this message")


if __name__ == '__main__':
number = None
country = None
locale = None
try:
opts, args = getopt.getopt(sys.argv[1:], "hn:c:l:", ["help", "number=", "country=", "locale="])
except getopt.GetoptError as err:
print(err) # will print something like "option -a not recognized"
usage()
sys.exit(2)
for o, a in opts:
if o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-n", "--number"):
number = a
elif o in ("-c", "--country"):
country = a
elif o in ("-l", "--locale"):
locale = a
else:
assert False, "unhandled option"
if number is None:
(number, country, locale) = interactive_query()
appspot(number, country, locale)
78 changes: 78 additions & 0 deletions python/dialpad_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import phonenumbers

# Fixed by Phonenumbers Cases
valid_strings = ['+442083661177',
'+658003211137',
'+20573925008',
'+2057392500',
'+20225777444',
'+84384813220',
'+84357659677',
'+56232512653', # https://switchcomm.atlassian.net/browse/TEL-9285
'+525547808256',
'+13677395285',
'+16892226575',
'+18404440531',
'+48477314848',
'+6569786318',
'+6560115374', # https://switchcomm.atlassian.net/browse/TEL-14616
'+576015088865', # https://switchcomm.atlassian.net/browse/TEL-14616
'+16562013774', # https://dialpad.atlassian.net/browse/DP-60739
'+18352010583', # https://dialpad.atlassian.net/browse/DP-67544
'+15572003655', # https://dialpad.atlassian.net/browse/DP-67544
'+61493772332', # https://dialpad.atlassian.net/browse/DP-73324
]

print ('######### - VALID BY LIBRARY - ################')
for l in valid_strings:
x = phonenumbers.parse(l, None)
print ('%15s' % l, '%10s' % phonenumbers.is_valid_number(x), '%25s' % x)

# To be fixed by Dialpad Changes
dialpad_cases = ['+6278033212174', # https://switchcomm.atlassian.net/browse/DP-13742
'+63283168971', # Philipines
'+8031000000141', # Dialpadistan
'+2250757715034', # Ivory Coast - New Format
'+2252721214601', # Ivory Coast - New Format
]

print ('######### - VALID BY DIALPAD - ################')
for l in dialpad_cases:
try:
x = phonenumbers.parse(l, None)
print ('%15s' % l, '%10s' % phonenumbers.is_valid_number(x), '%25s' % x)
except Exception as e:
print ('%15s' % l, '%25s' % e)

# Invalid Strings
invalid_strings = ['+4916190899790', # https://switchcomm.atlassian.net/browse/TEL-8824 Not Fixed
'+2022577744',
'+205739250',
]

print ('######### - INVALID NUMBERS - ################')
for l in invalid_strings:
x = phonenumbers.parse(l, None)
print ('%15s' % l, '%10s' % phonenumbers.is_valid_number(x), '%25s' % x)

# National Format match
national_format_match = {'+525547808256': '55 4780 8256'}

print ('######### - NUMBER FORMAT VALIDITY - ################')
for l in national_format_match:
x = phonenumbers.parse(l, None)
y = phonenumbers.format_number(x, phonenumbers.PhoneNumberFormat.NATIONAL)
if national_format_match[l] == y:
status = 'Success'
else:
status = 'Failed'
print (l), '-> %10s : %s' % (y, status)

# Number validity check
number_validity_check = {'1932621160': 'BR'}
print ('######### - REGION NUMBER VALIDITY - ###############')
for l in number_validity_check:
region = number_validity_check[l]
x = phonenumbers.parse(l, region)
print ('%15s' % l, '%10s -> Region : %5s' % (phonenumbers.is_valid_number(x), region))

2 changes: 1 addition & 1 deletion python/phonenumbers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@

# Version number is taken from the upstream libphonenumber version
# together with an indication of the version of the Python-specific code.
__version__ = "8.12.43"
__version__ = "8.13.14"

__all__ = ['PhoneNumber', 'CountryCodeSource', 'FrozenPhoneNumber',
'REGION_CODE_FOR_NON_GEO_ENTITY', 'NumberFormat', 'PhoneNumberDesc', 'PhoneMetadata',
Expand Down
2 changes: 1 addition & 1 deletion python/phonenumbers/asyoutypeformatter.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ def __init__(self, region_code):
Arguments:
region_code -- The region where the phone number is being entered

Return an AsYouTypeFormatter} object, which could be used to format
Return an AsYouTypeFormatter object, which could be used to format
phone numbers in the specific region "as you type"
"""
self._clear()
Expand Down
2 changes: 1 addition & 1 deletion python/phonenumbers/carrierdata/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"""
from ..util import u

# Copyright (C) 2011-2022 The Libphonenumber Authors
# Copyright (C) 2011-2023 The Libphonenumber Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
Expand Down
Loading