# Copyright (C) 2011 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.
# You may obtain a copy of the License at

# http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Generated from:
# http://en.wikipedia.org/wiki/+370 [374911910]

370310|Varėna
370313|Druskininkai
370315|Alytus
370318|Lazdijai
370319|Birštonas/Prienai
370340|Ukmergė
370342|Vilkaviškis
370343|Marijampolė
370345|Šakiai
370346|Kaišiadorys
370347|Kėdainiai
370349|Jonava
37037|Kaunas
370380|Šalčininkai
370381|Anykščiai
370382|Širvintos
370383|Molėtai
370385|Zarasai
370386|Ignalina/Visaginas
370387|Švenčionys
370389|Utena
37041|Šiauliai
370421|Pakruojis
370422|Radviliškis
370425|Akmenė
370426|Joniškis
370427|Kelmė
370428|Raseiniai
370440|Skuodas
370441|Šilutė
370443|Mažeikiai
370444|Telšiai
370445|Kretinga
370446|Tauragė
370447|Jurbarkas
370448|Plungė
370449|Šilalė
37045|Panevėžys
370450|Biržai
370451|Pasvalys
370458|Rokiškis
370459|Kupiškis
37046|Klaipėda
370460|Palanga
370469|Neringa
370520|Vilnius
370521|Vilnius
370522|Vilnius
370523|Vilnius
370524|Vilnius
370525|Vilnius
370526|Vilnius
370527|Vilnius
370528|Trakai
