summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.mailmap1
-rw-r--r--.reuse/dep516
-rw-r--r--Dockerfile4
-rw-r--r--README.md34
-rw-r--r--cpanfile8
-rw-r--r--cpanfile.snapshot1910
-rw-r--r--examples/dbf_update_zugbildungsplan2
-rw-r--r--index.pl2
-rw-r--r--lib/DBInfoscreen.pm151
-rw-r--r--lib/DBInfoscreen/Controller/Map.pm750
-rw-r--r--lib/DBInfoscreen/Controller/Static.pm41
-rw-r--r--lib/DBInfoscreen/Controller/Stationboard.pm1670
-rw-r--r--lib/DBInfoscreen/Controller/Wagenreihung.pm145
-rw-r--r--lib/DBInfoscreen/Helper/EFA.pm (renamed from lib/DBInfoscreen/Helper/Marudor.pm)61
-rw-r--r--lib/DBInfoscreen/Helper/HAFAS.pm528
-rw-r--r--lib/DBInfoscreen/Helper/Wagonorder.pm163
-rw-r--r--lib/DBInfoscreen/I18N/en.pm84
-rw-r--r--public/static/css/dark.min.css2
-rw-r--r--public/static/css/default.css2
-rw-r--r--public/static/css/light.min.css2
-rw-r--r--public/static/css/material-icons.css8
-rw-r--r--public/static/css/mobile.css2
-rw-r--r--public/static/icons/bahn-expert.svg5
-rw-r--r--public/static/js/autocomplete.js8
-rw-r--r--public/static/js/collapse.js68
-rw-r--r--public/static/js/dbf.min.js2
-rw-r--r--public/static/js/geostop.js41
-rw-r--r--public/static/js/geostop.min.js2
-rw-r--r--public/static/js/geotrain.js89
-rw-r--r--public/static/js/geotrain.min.js1
-rw-r--r--public/static/js/map-refresh.js5
-rw-r--r--public/static/js/map-refresh.min.js2
l---------public/static/v89 (renamed from public/static/v56)0
l---------public/static/v90 (renamed from public/static/v57)0
-rw-r--r--sass/app.scss128
-rw-r--r--sass/dark.scss6
-rw-r--r--sass/light.scss6
-rwxr-xr-xscripts/asset-rebuild7
-rwxr-xr-xscripts/asset-release2
-rwxr-xr-xscripts/update-autocomplete29
-rw-r--r--t/01-basic.t4
-rw-r--r--t/22-json.t2
-rw-r--r--templates/_intersection_infobox.html.ep22
-rw-r--r--templates/_map_infobox.html.ep10
-rw-r--r--templates/_train_attr.html.ep17
-rw-r--r--templates/_train_details.html.ep261
-rw-r--r--templates/about.html.ep37
-rw-r--r--templates/app.html.ep23
-rw-r--r--templates/exception.html.ep5
-rw-r--r--templates/geotrain.html.ep5
-rw-r--r--templates/landingpage.html.ep32
-rw-r--r--templates/layouts/app.html.ep157
-rw-r--r--templates/layouts/legacy.html.ep11
-rw-r--r--templates/route_map.html.ep3
-rw-r--r--templates/trainsearch.html.ep29
55 files changed, 3020 insertions, 3585 deletions
diff --git a/.mailmap b/.mailmap
new file mode 100644
index 0000000..c69b0d4
--- /dev/null
+++ b/.mailmap
@@ -0,0 +1 @@
+Birte Kristina Friesel <derf@finalrewind.org>
diff --git a/.reuse/dep5 b/.reuse/dep5
index b62f42e..46e041a 100644
--- a/.reuse/dep5
+++ b/.reuse/dep5
@@ -1,11 +1,11 @@
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Files: examples/*
-Copyright: 2020 Daniel Friesel
+Copyright: 2020 Birte Kristina Friesel
License: CC0-1.0
Files: public/static/css/dark.min.css public/static/css/light.min.css
-Copyright: 2020 Daniel Friesel
+Copyright: 2020 Birte Kristina Friesel
License: BSD-2-Clause
Files: public/static/css/material-icons.css public/static/fonts/MaterialIcons-*
@@ -14,16 +14,16 @@ License: Apache-2.0
Files: public/static/icons/* public/favicon.ico
Copyright: 2014-2019 Materialize
- 2020 Daniel Friesel
+ 2020 Birte Kristina Friesel
License: Apache-2.0
Files: public/static/js/autocomplete.*
Copyright: 2020 DB Station&Service AG, Europaplatz 1, 10557 Berlin
- 2020 Daniel Friesel
+ 2020 Birte Kristina Friesel
License: CC-BY-4.0
Files: public/static/js/dbf.min.js public/static/js/geolocation.min.js public/static/js/map-refresh.min.js
-Copyright: 2020 Daniel Friesel
+Copyright: 2020 Birte Kristina Friesel
License: AGPL-3.0-or-later
Files: public/static/js/jquery* public/static/css/jquery-ui.min.css
@@ -40,13 +40,13 @@ Copyright: 2010-2019 Vladimir Agafonkin
License: BSD-2-Clause
Files: README.md .gitignore cpanfile cpanfile.snapshot
-Copyright: 2020 Daniel Friesel
+Copyright: 2020 Birte Kristina Friesel
License: CC0-1.0
Files: share/dbdb_wagen.json
-Copyright: 2020 Daniel Friesel
+Copyright: 2020 Birte Kristina Friesel
License: CC0-1.0
Files: templates/*
-Copyright: 2020 Daniel Friesel
+Copyright: 2020 Birte Kristina Friesel
License: BSD-2-Clause
diff --git a/Dockerfile b/Dockerfile
index f8034a8..7cd702e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-# Copyright (C) 2020 Daniel Friesel
+# Copyright (C) 2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: CC0-1.0
@@ -19,7 +19,7 @@ WORKDIR /app
RUN ln -sf ../ext-templates/imprint.html.ep templates/imprint.html.ep \
&& ln -sf ../ext-templates/privacy.html.ep templates/privacy.html.ep
-RUN sed -i "s/version => \$ENV{DBFAKEDISPLAY_VERSION}/version => '${dbf_version}'/" lib/DBInfoscreen.pm
+RUN sed -i "s/version *=> *\$ENV{DBFAKEDISPLAY_VERSION}/version => '${dbf_version}'/" lib/DBInfoscreen.pm
FROM perl:5.30-slim
diff --git a/README.md b/README.md
index 6e910b1..278cce5 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,9 @@
db-infoscreen - App/Infoscreen for Railway Departures in Germany
---
-[db-infoscreen homepage](https://finalrewind.org/projects/db-fakedisplay/)
-
-db-infoscreen (formerly db-fakedisplay) shows departures at german train
-stations, serving both as infoscreen / webapp and station board look-alike.
+[db-infoscreen](https://finalrewind.org/projects/db-fakedisplay/) (formerly
+db-fakedisplay) shows departures at german train stations, serving both as
+infoscreen / webapp and station board look-alike.
It aims to aggregate departure and train data from different sources and
combine them in a useful (and user-friendly) manner. It is intended both for a
@@ -90,13 +89,12 @@ re-start the container.
Setup
---
-db-infoscreen respects the following environment variables:
+In hypnotoad mode (recommended), db-infoscreen respects the following environment variables:
| Variable | Default | Description |
| :------- | :------ | :---------- |
| DBFAKEDISPLAY\_LISTEN | `http://*:8092` | IP and Port for web service |
| DBFAKEDISPLAY\_STATS | _None_ | File in which the total count of backend API requests (excluding those answered from cache) is written |
-| DBFAKEDISPLAY\_HAFAS\_API | `https://v5.db.transport.rest` | hafas-rest-api endpoint |
| DBFAKEDISPLAY\_IRIS\_CACHE | `/tmp/dbf-iris-mian` | Directory for IRIS schedule cache |
| DBFAKEDISPLAY\_IRISRT\_CACHE | `/tmp/dbf-iris-realtime` | Directory for IRIS realtime cache |
| DBFAKEDISPLAY\_WORKERS | 2 | Number of worker processes (i.e., maximum amount of concurrent requests) |
@@ -106,10 +104,15 @@ Set these as needed, create `templates/imprint.html.ep` (imprint) and
pass requests for db-infoscreen to the appropriate port. See the
`examples` directory for imprint and privacy policy samples.
-You can run the app using a Mojo::Server of your choice, e.g. **perl
-index.pl daemon -m production** (quick&dirty, does not respect all variables)
-or **hypnotoad** (recommended). A systemd unit example is provided in
-`examples/db-infoscreen.service`.
+You can then use a service supervisor of your choice to run **hypnotoad index.pl**
+(using Mojolicious' hypnotoad server). See `examples/db-infoscreen.service`
+for a systemd unit example.
+
+For a quick&dirty setup on low-traffic sites you can also use **morbo index.pl**
+or **perl index.pl daemon -m production**. In this case, DBFAKEDISPLAY\_LISTEN
+and DBFAKEDISPLAY\_WORKERS have no effect. Morbo accepts IP and port
+configuration using the `-l`/`--listen` switch (default: `http://*:3000`);
+Daemon mode respects the MOJO\_LISTEN environment variable (default: `http://*:3000`).
For public-facing installations, you may want to enable caching in the reverse
proxy serving DBF. See `examples/nginx-cache.conf` and
@@ -122,7 +125,7 @@ see the respective files) licenses. Attribution is appreciated.
Background Data Updates
---
-db-infoscreen can use <https://lib.finalrewind.org/dbdb/db_zugbildung_v0.json>
+db-infoscreen can use <https://lib.finalrewind.org/dbdb/db_zugbildung_v1.json>
to show scheduled ICE/IC types (ICE 1/2/3/4/T, IC 1/2), wagon orders, and other
attributes. It expects the file to be provided in `share/zugbildungsplan.json`.
@@ -166,3 +169,12 @@ The easiest way of making changes available is by maintaining a public fork of
the Git repository. A tarball is also acceptable. Please change `source_url` in
`lib/DBInfoscreen.pm` to point to your Git repository / source archive if you
are using a version with custom changes.
+
+Resources
+---
+
+Mirrors of the db-infoscreen repository are available at
+
+* [Chaosdorf](https://chaosdorf.de/git/derf/db-infoscreen)
+* [git.finalrewind.org](https://git.finalrewind.org/db-fakedisplay/)
+* [GitHub](https://github.com/derf/db-fakedisplay)
diff --git a/cpanfile b/cpanfile
index e399e95..127bda2 100644
--- a/cpanfile
+++ b/cpanfile
@@ -2,13 +2,15 @@ requires 'Cache';
requires 'DateTime';
requires 'DateTime::Format::Strptime';
requires 'File::Slurp';
-requires 'Geo::Distance';
-requires 'Geo::Distance::XS';
+requires 'GIS::Distance';
+requires 'GIS::Distance::Fast';
requires 'JSON';
requires 'JSON::XS';
+requires 'List::UtilsBy';
requires 'LWP::UserAgent';
requires 'LWP::Protocol::https';
requires 'Mojolicious';
requires 'Travel::Status::DE::DBWagenreihung', '0.06';
-requires 'Travel::Status::DE::IRIS', '1.57';
+requires 'Travel::Status::DE::HAFAS', '>= 5.06';
+requires 'Travel::Status::DE::IRIS';
requires 'XML::LibXML';
diff --git a/cpanfile.snapshot b/cpanfile.snapshot
index 75bf951..c93f1c9 100644
--- a/cpanfile.snapshot
+++ b/cpanfile.snapshot
@@ -1,82 +1,87 @@
# carton snapshot format: version 1.0
DISTRIBUTIONS
- Alien-Build-2.41
- pathname: P/PL/PLICEASE/Alien-Build-2.41.tar.gz
- provides:
- Alien::Base 2.41
- Alien::Base::PkgConfig 2.41
- Alien::Base::Wrapper 2.41
- Alien::Build 2.41
- Alien::Build::CommandSequence 2.41
- Alien::Build::Helper 2.41
- Alien::Build::Interpolate 2.41
- Alien::Build::Interpolate::Default 2.41
- Alien::Build::Interpolate::Helper 2.41
- Alien::Build::Log 2.41
- Alien::Build::Log::Abbreviate 2.41
- Alien::Build::Log::Default 2.41
- Alien::Build::MM 2.41
- Alien::Build::Meta 2.41
- Alien::Build::Plugin 2.41
- Alien::Build::Plugin::Build::Autoconf 2.41
- Alien::Build::Plugin::Build::CMake 2.41
- Alien::Build::Plugin::Build::Copy 2.41
- Alien::Build::Plugin::Build::MSYS 2.41
- Alien::Build::Plugin::Build::Make 2.41
- Alien::Build::Plugin::Build::SearchDep 2.41
- Alien::Build::Plugin::Core::CleanInstall 2.41
- Alien::Build::Plugin::Core::Download 2.41
- Alien::Build::Plugin::Core::FFI 2.41
- Alien::Build::Plugin::Core::Gather 2.41
- Alien::Build::Plugin::Core::Legacy 2.41
- Alien::Build::Plugin::Core::Override 2.41
- Alien::Build::Plugin::Core::Setup 2.41
- Alien::Build::Plugin::Core::Tail 2.41
- Alien::Build::Plugin::Decode::DirListing 2.41
- Alien::Build::Plugin::Decode::DirListingFtpcopy 2.41
- Alien::Build::Plugin::Decode::HTML 2.41
- Alien::Build::Plugin::Decode::Mojo 2.41
- Alien::Build::Plugin::Download::Negotiate 2.41
- Alien::Build::Plugin::Extract::ArchiveTar 2.41
- Alien::Build::Plugin::Extract::ArchiveZip 2.41
- Alien::Build::Plugin::Extract::CommandLine 2.41
- Alien::Build::Plugin::Extract::Directory 2.41
- Alien::Build::Plugin::Extract::Negotiate 2.41
- Alien::Build::Plugin::Fetch::CurlCommand 2.41
- Alien::Build::Plugin::Fetch::HTTPTiny 2.41
- Alien::Build::Plugin::Fetch::LWP 2.41
- Alien::Build::Plugin::Fetch::Local 2.41
- Alien::Build::Plugin::Fetch::LocalDir 2.41
- Alien::Build::Plugin::Fetch::NetFTP 2.41
- Alien::Build::Plugin::Fetch::Wget 2.41
- Alien::Build::Plugin::Gather::IsolateDynamic 2.41
- Alien::Build::Plugin::PkgConfig::CommandLine 2.41
- Alien::Build::Plugin::PkgConfig::LibPkgConf 2.41
- Alien::Build::Plugin::PkgConfig::MakeStatic 2.41
- Alien::Build::Plugin::PkgConfig::Negotiate 2.41
- Alien::Build::Plugin::PkgConfig::PP 2.41
- Alien::Build::Plugin::Prefer::BadVersion 2.41
- Alien::Build::Plugin::Prefer::GoodVersion 2.41
- Alien::Build::Plugin::Prefer::SortVersions 2.41
- Alien::Build::Plugin::Probe::CBuilder 2.41
- Alien::Build::Plugin::Probe::CommandLine 2.41
- Alien::Build::Plugin::Probe::Vcpkg 2.41
- Alien::Build::Plugin::Test::Mock 2.41
- Alien::Build::PluginMeta 2.41
- Alien::Build::Temp 2.41
- Alien::Build::TempDir 2.41
- Alien::Build::Util 2.41
- Alien::Build::Version::Basic 2.41
- Alien::Build::rc 2.41
- Alien::Role 2.41
- Test::Alien 2.41
- Test::Alien::Build 2.41
- Test::Alien::CanCompile 2.41
- Test::Alien::CanPlatypus 2.41
- Test::Alien::Diag 2.41
- Test::Alien::Run 2.41
- Test::Alien::Synthetic 2.41
- alienfile 2.41
+ Alien-Build-2.80
+ pathname: P/PL/PLICEASE/Alien-Build-2.80.tar.gz
+ provides:
+ Alien::Base 2.80
+ Alien::Base::PkgConfig 2.80
+ Alien::Base::Wrapper 2.80
+ Alien::Build 2.80
+ Alien::Build::CommandSequence 2.80
+ Alien::Build::Helper 2.80
+ Alien::Build::Interpolate 2.80
+ Alien::Build::Interpolate::Default 2.80
+ Alien::Build::Interpolate::Helper 2.80
+ Alien::Build::Log 2.80
+ Alien::Build::Log::Abbreviate 2.80
+ Alien::Build::Log::Default 2.80
+ Alien::Build::MM 2.80
+ Alien::Build::Meta 2.80
+ Alien::Build::Plugin 2.80
+ Alien::Build::Plugin::Build::Autoconf 2.80
+ Alien::Build::Plugin::Build::CMake 2.80
+ Alien::Build::Plugin::Build::Copy 2.80
+ Alien::Build::Plugin::Build::MSYS 2.80
+ Alien::Build::Plugin::Build::Make 2.80
+ Alien::Build::Plugin::Build::SearchDep 2.80
+ Alien::Build::Plugin::Core::CleanInstall 2.80
+ Alien::Build::Plugin::Core::Download 2.80
+ Alien::Build::Plugin::Core::FFI 2.80
+ Alien::Build::Plugin::Core::Gather 2.80
+ Alien::Build::Plugin::Core::Legacy 2.80
+ Alien::Build::Plugin::Core::Override 2.80
+ Alien::Build::Plugin::Core::Setup 2.80
+ Alien::Build::Plugin::Core::Tail 2.80
+ Alien::Build::Plugin::Decode::DirListing 2.80
+ Alien::Build::Plugin::Decode::DirListingFtpcopy 2.80
+ Alien::Build::Plugin::Decode::HTML 2.80
+ Alien::Build::Plugin::Decode::Mojo 2.80
+ Alien::Build::Plugin::Digest::Negotiate 2.80
+ Alien::Build::Plugin::Digest::SHA 2.80
+ Alien::Build::Plugin::Digest::SHAPP 2.80
+ Alien::Build::Plugin::Download::Negotiate 2.80
+ Alien::Build::Plugin::Extract::ArchiveTar 2.80
+ Alien::Build::Plugin::Extract::ArchiveZip 2.80
+ Alien::Build::Plugin::Extract::CommandLine 2.80
+ Alien::Build::Plugin::Extract::Directory 2.80
+ Alien::Build::Plugin::Extract::File 2.80
+ Alien::Build::Plugin::Extract::Negotiate 2.80
+ Alien::Build::Plugin::Fetch::CurlCommand 2.80
+ Alien::Build::Plugin::Fetch::HTTPTiny 2.80
+ Alien::Build::Plugin::Fetch::LWP 2.80
+ Alien::Build::Plugin::Fetch::Local 2.80
+ Alien::Build::Plugin::Fetch::LocalDir 2.80
+ Alien::Build::Plugin::Fetch::NetFTP 2.80
+ Alien::Build::Plugin::Fetch::Wget 2.80
+ Alien::Build::Plugin::Gather::IsolateDynamic 2.80
+ Alien::Build::Plugin::PkgConfig::CommandLine 2.80
+ Alien::Build::Plugin::PkgConfig::LibPkgConf 2.80
+ Alien::Build::Plugin::PkgConfig::MakeStatic 2.80
+ Alien::Build::Plugin::PkgConfig::Negotiate 2.80
+ Alien::Build::Plugin::PkgConfig::PP 2.80
+ Alien::Build::Plugin::Prefer::BadVersion 2.80
+ Alien::Build::Plugin::Prefer::GoodVersion 2.80
+ Alien::Build::Plugin::Prefer::SortVersions 2.80
+ Alien::Build::Plugin::Probe::CBuilder 2.80
+ Alien::Build::Plugin::Probe::CommandLine 2.80
+ Alien::Build::Plugin::Probe::Vcpkg 2.80
+ Alien::Build::Plugin::Test::Mock 2.80
+ Alien::Build::PluginMeta 2.80
+ Alien::Build::Temp 2.80
+ Alien::Build::TempDir 2.80
+ Alien::Build::Util 2.80
+ Alien::Build::Version::Basic 2.80
+ Alien::Build::rc 2.80
+ Alien::Role 2.80
+ Alien::Util 2.80
+ Test::Alien 2.80
+ Test::Alien::Build 2.80
+ Test::Alien::CanCompile 2.80
+ Test::Alien::CanPlatypus 2.80
+ Test::Alien::Diag 2.80
+ Test::Alien::Run 2.80
+ Test::Alien::Synthetic 2.80
+ alienfile 2.80
requirements:
Capture::Tiny 0.17
Digest::SHA 0
@@ -94,26 +99,39 @@ DISTRIBUTIONS
Text::ParseWords 3.26
parent 0
perl 5.008004
- Alien-Libxml2-0.17
- pathname: P/PL/PLICEASE/Alien-Libxml2-0.17.tar.gz
+ Alien-Build-Plugin-Download-GitLab-0.01
+ pathname: P/PL/PLICEASE/Alien-Build-Plugin-Download-GitLab-0.01.tar.gz
provides:
- Alien::Libxml2 0.17
+ Alien::Build::Plugin::Download::GitLab 0.01
+ requirements:
+ Alien::Build::Plugin 0
+ ExtUtils::MakeMaker 0
+ JSON::PP 0
+ Path::Tiny 0
+ URI 0
+ URI::Escape 0
+ perl 5.008004
+ Alien-Libxml2-0.19
+ pathname: P/PL/PLICEASE/Alien-Libxml2-0.19.tar.gz
+ provides:
+ Alien::Libxml2 0.19
requirements:
Alien::Base 2.37
Alien::Build 2.37
Alien::Build::MM 2.37
Alien::Build::Plugin::Build::SearchDep 0.35
+ Alien::Build::Plugin::Download::GitLab 0
Alien::Build::Plugin::Prefer::BadVersion 1.05
Alien::Build::Plugin::Probe::Vcpkg 0
ExtUtils::CBuilder 0
ExtUtils::MakeMaker 6.52
perl 5.006
- B-Hooks-EndOfScope-0.24
- pathname: E/ET/ETHER/B-Hooks-EndOfScope-0.24.tar.gz
+ B-Hooks-EndOfScope-0.28
+ pathname: E/ET/ETHER/B-Hooks-EndOfScope-0.28.tar.gz
provides:
- B::Hooks::EndOfScope 0.24
- B::Hooks::EndOfScope::PP 0.24
- B::Hooks::EndOfScope::XS 0.24
+ B::Hooks::EndOfScope 0.28
+ B::Hooks::EndOfScope::PP 0.28
+ B::Hooks::EndOfScope::XS 0.28
requirements:
ExtUtils::MakeMaker 0
Hash::Util::FieldHash 0
@@ -205,10 +223,10 @@ DISTRIBUTIONS
requirements:
ExtUtils::MakeMaker 0
base 1.01
- Class-Data-Inheritable-0.08
- pathname: T/TM/TMTM/Class-Data-Inheritable-0.08.tar.gz
+ Class-Data-Inheritable-0.09
+ pathname: R/RS/RSHERER/Class-Data-Inheritable-0.09.tar.gz
provides:
- Class::Data::Inheritable 0.08
+ Class::Data::Inheritable 0.09
requirements:
ExtUtils::MakeMaker 0
Class-Inspector-1.36
@@ -221,11 +239,11 @@ DISTRIBUTIONS
File::Spec 0.80
base 0
perl 5.008
- Class-Measure-0.09
- pathname: B/BL/BLUEFEET/Class-Measure-0.09.tar.gz
+ Class-Measure-0.10
+ pathname: B/BL/BLUEFEET/Class-Measure-0.10.tar.gz
provides:
- Class::Measure 0.09
- Class::Measure::Length 0.09
+ Class::Measure 0.10
+ Class::Measure::Length 0.10
requirements:
Carp 0
Module::Build::Tiny 0.035
@@ -241,6 +259,12 @@ DISTRIBUTIONS
perl 5.008001
strict 0
warnings 0
+ Clone-0.46
+ pathname: G/GA/GARU/Clone-0.46.tar.gz
+ provides:
+ Clone 0.46
+ requirements:
+ ExtUtils::MakeMaker 0
Const-Fast-0.014
pathname: L/LE/LEONT/Const-Fast-0.014.tar.gz
provides:
@@ -254,30 +278,31 @@ DISTRIBUTIONS
perl 5.008
strict 0
warnings 0
- Data-OptList-0.112
- pathname: R/RJ/RJBS/Data-OptList-0.112.tar.gz
+ Data-OptList-0.114
+ pathname: R/RJ/RJBS/Data-OptList-0.114.tar.gz
provides:
- Data::OptList 0.112
+ Data::OptList 0.114
requirements:
ExtUtils::MakeMaker 6.78
List::Util 0
Params::Util 0
Sub::Install 0.921
+ perl 5.012
strict 0
warnings 0
- DateTime-1.54
- pathname: D/DR/DROLSKY/DateTime-1.54.tar.gz
- provides:
- DateTime 1.54
- DateTime::Duration 1.54
- DateTime::Helpers 1.54
- DateTime::Infinite 1.54
- DateTime::Infinite::Future 1.54
- DateTime::Infinite::Past 1.54
- DateTime::LeapSecond 1.54
- DateTime::PP 1.54
- DateTime::PPExtra 1.54
- DateTime::Types 1.54
+ DateTime-1.65
+ pathname: D/DR/DROLSKY/DateTime-1.65.tar.gz
+ provides:
+ DateTime 1.65
+ DateTime::Duration 1.65
+ DateTime::Helpers 1.65
+ DateTime::Infinite 1.65
+ DateTime::Infinite::Future 1.65
+ DateTime::Infinite::Past 1.65
+ DateTime::LeapSecond 1.65
+ DateTime::PP 1.65
+ DateTime::PPExtra 1.65
+ DateTime::Types 1.65
requirements:
Carp 0
DateTime::Locale 1.06
@@ -293,9 +318,9 @@ DISTRIBUTIONS
Specio::Library::Builtins 0
Specio::Library::Numeric 0
Specio::Library::String 0
+ Specio::Subs 0
Try::Tiny 0
XSLoader 0
- base 0
integer 0
namespace::autoclean 0.19
overload 0
@@ -329,15 +354,15 @@ DISTRIBUTIONS
parent 0
strict 0
warnings 0
- DateTime-Locale-1.32
- pathname: D/DR/DROLSKY/DateTime-Locale-1.32.tar.gz
+ DateTime-Locale-1.40
+ pathname: D/DR/DROLSKY/DateTime-Locale-1.40.tar.gz
provides:
- DateTime::Locale 1.32
- DateTime::Locale::Base 1.32
- DateTime::Locale::Catalog 1.32
- DateTime::Locale::Data 1.32
- DateTime::Locale::FromData 1.32
- DateTime::Locale::Util 1.32
+ DateTime::Locale 1.40
+ DateTime::Locale::Base 1.40
+ DateTime::Locale::Catalog 1.40
+ DateTime::Locale::Data 1.40
+ DateTime::Locale::FromData 1.40
+ DateTime::Locale::Util 1.40
requirements:
Carp 0
Dist::CheckConflicts 0.02
@@ -355,381 +380,346 @@ DISTRIBUTIONS
perl 5.008004
strict 0
warnings 0
- DateTime-TimeZone-2.47
- pathname: D/DR/DROLSKY/DateTime-TimeZone-2.47.tar.gz
- provides:
- DateTime::TimeZone 2.47
- DateTime::TimeZone::Africa::Abidjan 2.47
- DateTime::TimeZone::Africa::Accra 2.47
- DateTime::TimeZone::Africa::Algiers 2.47
- DateTime::TimeZone::Africa::Bissau 2.47
- DateTime::TimeZone::Africa::Cairo 2.47
- DateTime::TimeZone::Africa::Casablanca 2.47
- DateTime::TimeZone::Africa::Ceuta 2.47
- DateTime::TimeZone::Africa::El_Aaiun 2.47
- DateTime::TimeZone::Africa::Johannesburg 2.47
- DateTime::TimeZone::Africa::Juba 2.47
- DateTime::TimeZone::Africa::Khartoum 2.47
- DateTime::TimeZone::Africa::Lagos 2.47
- DateTime::TimeZone::Africa::Maputo 2.47
- DateTime::TimeZone::Africa::Monrovia 2.47
- DateTime::TimeZone::Africa::Nairobi 2.47
- DateTime::TimeZone::Africa::Ndjamena 2.47
- DateTime::TimeZone::Africa::Sao_Tome 2.47
- DateTime::TimeZone::Africa::Tripoli 2.47
- DateTime::TimeZone::Africa::Tunis 2.47
- DateTime::TimeZone::Africa::Windhoek 2.47
- DateTime::TimeZone::America::Adak 2.47
- DateTime::TimeZone::America::Anchorage 2.47
- DateTime::TimeZone::America::Araguaina 2.47
- DateTime::TimeZone::America::Argentina::Buenos_Aires 2.47
- DateTime::TimeZone::America::Argentina::Catamarca 2.47
- DateTime::TimeZone::America::Argentina::Cordoba 2.47
- DateTime::TimeZone::America::Argentina::Jujuy 2.47
- DateTime::TimeZone::America::Argentina::La_Rioja 2.47
- DateTime::TimeZone::America::Argentina::Mendoza 2.47
- DateTime::TimeZone::America::Argentina::Rio_Gallegos 2.47
- DateTime::TimeZone::America::Argentina::Salta 2.47
- DateTime::TimeZone::America::Argentina::San_Juan 2.47
- DateTime::TimeZone::America::Argentina::San_Luis 2.47
- DateTime::TimeZone::America::Argentina::Tucuman 2.47
- DateTime::TimeZone::America::Argentina::Ushuaia 2.47
- DateTime::TimeZone::America::Asuncion 2.47
- DateTime::TimeZone::America::Atikokan 2.47
- DateTime::TimeZone::America::Bahia 2.47
- DateTime::TimeZone::America::Bahia_Banderas 2.47
- DateTime::TimeZone::America::Barbados 2.47
- DateTime::TimeZone::America::Belem 2.47
- DateTime::TimeZone::America::Belize 2.47
- DateTime::TimeZone::America::Blanc_Sablon 2.47
- DateTime::TimeZone::America::Boa_Vista 2.47
- DateTime::TimeZone::America::Bogota 2.47
- DateTime::TimeZone::America::Boise 2.47
- DateTime::TimeZone::America::Cambridge_Bay 2.47
- DateTime::TimeZone::America::Campo_Grande 2.47
- DateTime::TimeZone::America::Cancun 2.47
- DateTime::TimeZone::America::Caracas 2.47
- DateTime::TimeZone::America::Cayenne 2.47
- DateTime::TimeZone::America::Chicago 2.47
- DateTime::TimeZone::America::Chihuahua 2.47
- DateTime::TimeZone::America::Costa_Rica 2.47
- DateTime::TimeZone::America::Creston 2.47
- DateTime::TimeZone::America::Cuiaba 2.47
- DateTime::TimeZone::America::Curacao 2.47
- DateTime::TimeZone::America::Danmarkshavn 2.47
- DateTime::TimeZone::America::Dawson 2.47
- DateTime::TimeZone::America::Dawson_Creek 2.47
- DateTime::TimeZone::America::Denver 2.47
- DateTime::TimeZone::America::Detroit 2.47
- DateTime::TimeZone::America::Edmonton 2.47
- DateTime::TimeZone::America::Eirunepe 2.47
- DateTime::TimeZone::America::El_Salvador 2.47
- DateTime::TimeZone::America::Fort_Nelson 2.47
- DateTime::TimeZone::America::Fortaleza 2.47
- DateTime::TimeZone::America::Glace_Bay 2.47
- DateTime::TimeZone::America::Goose_Bay 2.47
- DateTime::TimeZone::America::Grand_Turk 2.47
- DateTime::TimeZone::America::Guatemala 2.47
- DateTime::TimeZone::America::Guayaquil 2.47
- DateTime::TimeZone::America::Guyana 2.47
- DateTime::TimeZone::America::Halifax 2.47
- DateTime::TimeZone::America::Havana 2.47
- DateTime::TimeZone::America::Hermosillo 2.47
- DateTime::TimeZone::America::Indiana::Indianapolis 2.47
- DateTime::TimeZone::America::Indiana::Knox 2.47
- DateTime::TimeZone::America::Indiana::Marengo 2.47
- DateTime::TimeZone::America::Indiana::Petersburg 2.47
- DateTime::TimeZone::America::Indiana::Tell_City 2.47
- DateTime::TimeZone::America::Indiana::Vevay 2.47
- DateTime::TimeZone::America::Indiana::Vincennes 2.47
- DateTime::TimeZone::America::Indiana::Winamac 2.47
- DateTime::TimeZone::America::Inuvik 2.47
- DateTime::TimeZone::America::Iqaluit 2.47
- DateTime::TimeZone::America::Jamaica 2.47
- DateTime::TimeZone::America::Juneau 2.47
- DateTime::TimeZone::America::Kentucky::Louisville 2.47
- DateTime::TimeZone::America::Kentucky::Monticello 2.47
- DateTime::TimeZone::America::La_Paz 2.47
- DateTime::TimeZone::America::Lima 2.47
- DateTime::TimeZone::America::Los_Angeles 2.47
- DateTime::TimeZone::America::Maceio 2.47
- DateTime::TimeZone::America::Managua 2.47
- DateTime::TimeZone::America::Manaus 2.47
- DateTime::TimeZone::America::Martinique 2.47
- DateTime::TimeZone::America::Matamoros 2.47
- DateTime::TimeZone::America::Mazatlan 2.47
- DateTime::TimeZone::America::Menominee 2.47
- DateTime::TimeZone::America::Merida 2.47
- DateTime::TimeZone::America::Metlakatla 2.47
- DateTime::TimeZone::America::Mexico_City 2.47
- DateTime::TimeZone::America::Miquelon 2.47
- DateTime::TimeZone::America::Moncton 2.47
- DateTime::TimeZone::America::Monterrey 2.47
- DateTime::TimeZone::America::Montevideo 2.47
- DateTime::TimeZone::America::Nassau 2.47
- DateTime::TimeZone::America::New_York 2.47
- DateTime::TimeZone::America::Nipigon 2.47
- DateTime::TimeZone::America::Nome 2.47
- DateTime::TimeZone::America::Noronha 2.47
- DateTime::TimeZone::America::North_Dakota::Beulah 2.47
- DateTime::TimeZone::America::North_Dakota::Center 2.47
- DateTime::TimeZone::America::North_Dakota::New_Salem 2.47
- DateTime::TimeZone::America::Nuuk 2.47
- DateTime::TimeZone::America::Ojinaga 2.47
- DateTime::TimeZone::America::Panama 2.47
- DateTime::TimeZone::America::Pangnirtung 2.47
- DateTime::TimeZone::America::Paramaribo 2.47
- DateTime::TimeZone::America::Phoenix 2.47
- DateTime::TimeZone::America::Port_au_Prince 2.47
- DateTime::TimeZone::America::Port_of_Spain 2.47
- DateTime::TimeZone::America::Porto_Velho 2.47
- DateTime::TimeZone::America::Puerto_Rico 2.47
- DateTime::TimeZone::America::Punta_Arenas 2.47
- DateTime::TimeZone::America::Rainy_River 2.47
- DateTime::TimeZone::America::Rankin_Inlet 2.47
- DateTime::TimeZone::America::Recife 2.47
- DateTime::TimeZone::America::Regina 2.47
- DateTime::TimeZone::America::Resolute 2.47
- DateTime::TimeZone::America::Rio_Branco 2.47
- DateTime::TimeZone::America::Santarem 2.47
- DateTime::TimeZone::America::Santiago 2.47
- DateTime::TimeZone::America::Santo_Domingo 2.47
- DateTime::TimeZone::America::Sao_Paulo 2.47
- DateTime::TimeZone::America::Scoresbysund 2.47
- DateTime::TimeZone::America::Sitka 2.47
- DateTime::TimeZone::America::St_Johns 2.47
- DateTime::TimeZone::America::Swift_Current 2.47
- DateTime::TimeZone::America::Tegucigalpa 2.47
- DateTime::TimeZone::America::Thule 2.47
- DateTime::TimeZone::America::Thunder_Bay 2.47
- DateTime::TimeZone::America::Tijuana 2.47
- DateTime::TimeZone::America::Toronto 2.47
- DateTime::TimeZone::America::Vancouver 2.47
- DateTime::TimeZone::America::Whitehorse 2.47
- DateTime::TimeZone::America::Winnipeg 2.47
- DateTime::TimeZone::America::Yakutat 2.47
- DateTime::TimeZone::America::Yellowknife 2.47
- DateTime::TimeZone::Antarctica::Casey 2.47
- DateTime::TimeZone::Antarctica::Davis 2.47
- DateTime::TimeZone::Antarctica::DumontDUrville 2.47
- DateTime::TimeZone::Antarctica::Macquarie 2.47
- DateTime::TimeZone::Antarctica::Mawson 2.47
- DateTime::TimeZone::Antarctica::Palmer 2.47
- DateTime::TimeZone::Antarctica::Rothera 2.47
- DateTime::TimeZone::Antarctica::Syowa 2.47
- DateTime::TimeZone::Antarctica::Troll 2.47
- DateTime::TimeZone::Antarctica::Vostok 2.47
- DateTime::TimeZone::Asia::Almaty 2.47
- DateTime::TimeZone::Asia::Amman 2.47
- DateTime::TimeZone::Asia::Anadyr 2.47
- DateTime::TimeZone::Asia::Aqtau 2.47
- DateTime::TimeZone::Asia::Aqtobe 2.47
- DateTime::TimeZone::Asia::Ashgabat 2.47
- DateTime::TimeZone::Asia::Atyrau 2.47
- DateTime::TimeZone::Asia::Baghdad 2.47
- DateTime::TimeZone::Asia::Baku 2.47
- DateTime::TimeZone::Asia::Bangkok 2.47
- DateTime::TimeZone::Asia::Barnaul 2.47
- DateTime::TimeZone::Asia::Beirut 2.47
- DateTime::TimeZone::Asia::Bishkek 2.47
- DateTime::TimeZone::Asia::Brunei 2.47
- DateTime::TimeZone::Asia::Chita 2.47
- DateTime::TimeZone::Asia::Choibalsan 2.47
- DateTime::TimeZone::Asia::Colombo 2.47
- DateTime::TimeZone::Asia::Damascus 2.47
- DateTime::TimeZone::Asia::Dhaka 2.47
- DateTime::TimeZone::Asia::Dili 2.47
- DateTime::TimeZone::Asia::Dubai 2.47
- DateTime::TimeZone::Asia::Dushanbe 2.47
- DateTime::TimeZone::Asia::Famagusta 2.47
- DateTime::TimeZone::Asia::Gaza 2.47
- DateTime::TimeZone::Asia::Hebron 2.47
- DateTime::TimeZone::Asia::Ho_Chi_Minh 2.47
- DateTime::TimeZone::Asia::Hong_Kong 2.47
- DateTime::TimeZone::Asia::Hovd 2.47
- DateTime::TimeZone::Asia::Irkutsk 2.47
- DateTime::TimeZone::Asia::Jakarta 2.47
- DateTime::TimeZone::Asia::Jayapura 2.47
- DateTime::TimeZone::Asia::Jerusalem 2.47
- DateTime::TimeZone::Asia::Kabul 2.47
- DateTime::TimeZone::Asia::Kamchatka 2.47
- DateTime::TimeZone::Asia::Karachi 2.47
- DateTime::TimeZone::Asia::Kathmandu 2.47
- DateTime::TimeZone::Asia::Khandyga 2.47
- DateTime::TimeZone::Asia::Kolkata 2.47
- DateTime::TimeZone::Asia::Krasnoyarsk 2.47
- DateTime::TimeZone::Asia::Kuala_Lumpur 2.47
- DateTime::TimeZone::Asia::Kuching 2.47
- DateTime::TimeZone::Asia::Macau 2.47
- DateTime::TimeZone::Asia::Magadan 2.47
- DateTime::TimeZone::Asia::Makassar 2.47
- DateTime::TimeZone::Asia::Manila 2.47
- DateTime::TimeZone::Asia::Nicosia 2.47
- DateTime::TimeZone::Asia::Novokuznetsk 2.47
- DateTime::TimeZone::Asia::Novosibirsk 2.47
- DateTime::TimeZone::Asia::Omsk 2.47
- DateTime::TimeZone::Asia::Oral 2.47
- DateTime::TimeZone::Asia::Pontianak 2.47
- DateTime::TimeZone::Asia::Pyongyang 2.47
- DateTime::TimeZone::Asia::Qatar 2.47
- DateTime::TimeZone::Asia::Qostanay 2.47
- DateTime::TimeZone::Asia::Qyzylorda 2.47
- DateTime::TimeZone::Asia::Riyadh 2.47
- DateTime::TimeZone::Asia::Sakhalin 2.47
- DateTime::TimeZone::Asia::Samarkand 2.47
- DateTime::TimeZone::Asia::Seoul 2.47
- DateTime::TimeZone::Asia::Shanghai 2.47
- DateTime::TimeZone::Asia::Singapore 2.47
- DateTime::TimeZone::Asia::Srednekolymsk 2.47
- DateTime::TimeZone::Asia::Taipei 2.47
- DateTime::TimeZone::Asia::Tashkent 2.47
- DateTime::TimeZone::Asia::Tbilisi 2.47
- DateTime::TimeZone::Asia::Tehran 2.47
- DateTime::TimeZone::Asia::Thimphu 2.47
- DateTime::TimeZone::Asia::Tokyo 2.47
- DateTime::TimeZone::Asia::Tomsk 2.47
- DateTime::TimeZone::Asia::Ulaanbaatar 2.47
- DateTime::TimeZone::Asia::Urumqi 2.47
- DateTime::TimeZone::Asia::Ust_Nera 2.47
- DateTime::TimeZone::Asia::Vladivostok 2.47
- DateTime::TimeZone::Asia::Yakutsk 2.47
- DateTime::TimeZone::Asia::Yangon 2.47
- DateTime::TimeZone::Asia::Yekaterinburg 2.47
- DateTime::TimeZone::Asia::Yerevan 2.47
- DateTime::TimeZone::Atlantic::Azores 2.47
- DateTime::TimeZone::Atlantic::Bermuda 2.47
- DateTime::TimeZone::Atlantic::Canary 2.47
- DateTime::TimeZone::Atlantic::Cape_Verde 2.47
- DateTime::TimeZone::Atlantic::Faroe 2.47
- DateTime::TimeZone::Atlantic::Madeira 2.47
- DateTime::TimeZone::Atlantic::Reykjavik 2.47
- DateTime::TimeZone::Atlantic::South_Georgia 2.47
- DateTime::TimeZone::Atlantic::Stanley 2.47
- DateTime::TimeZone::Australia::Adelaide 2.47
- DateTime::TimeZone::Australia::Brisbane 2.47
- DateTime::TimeZone::Australia::Broken_Hill 2.47
- DateTime::TimeZone::Australia::Darwin 2.47
- DateTime::TimeZone::Australia::Eucla 2.47
- DateTime::TimeZone::Australia::Hobart 2.47
- DateTime::TimeZone::Australia::Lindeman 2.47
- DateTime::TimeZone::Australia::Lord_Howe 2.47
- DateTime::TimeZone::Australia::Melbourne 2.47
- DateTime::TimeZone::Australia::Perth 2.47
- DateTime::TimeZone::Australia::Sydney 2.47
- DateTime::TimeZone::CET 2.47
- DateTime::TimeZone::CST6CDT 2.47
- DateTime::TimeZone::Catalog 2.47
- DateTime::TimeZone::EET 2.47
- DateTime::TimeZone::EST 2.47
- DateTime::TimeZone::EST5EDT 2.47
- DateTime::TimeZone::Europe::Amsterdam 2.47
- DateTime::TimeZone::Europe::Andorra 2.47
- DateTime::TimeZone::Europe::Astrakhan 2.47
- DateTime::TimeZone::Europe::Athens 2.47
- DateTime::TimeZone::Europe::Belgrade 2.47
- DateTime::TimeZone::Europe::Berlin 2.47
- DateTime::TimeZone::Europe::Brussels 2.47
- DateTime::TimeZone::Europe::Bucharest 2.47
- DateTime::TimeZone::Europe::Budapest 2.47
- DateTime::TimeZone::Europe::Chisinau 2.47
- DateTime::TimeZone::Europe::Copenhagen 2.47
- DateTime::TimeZone::Europe::Dublin 2.47
- DateTime::TimeZone::Europe::Gibraltar 2.47
- DateTime::TimeZone::Europe::Helsinki 2.47
- DateTime::TimeZone::Europe::Istanbul 2.47
- DateTime::TimeZone::Europe::Kaliningrad 2.47
- DateTime::TimeZone::Europe::Kiev 2.47
- DateTime::TimeZone::Europe::Kirov 2.47
- DateTime::TimeZone::Europe::Lisbon 2.47
- DateTime::TimeZone::Europe::London 2.47
- DateTime::TimeZone::Europe::Luxembourg 2.47
- DateTime::TimeZone::Europe::Madrid 2.47
- DateTime::TimeZone::Europe::Malta 2.47
- DateTime::TimeZone::Europe::Minsk 2.47
- DateTime::TimeZone::Europe::Monaco 2.47
- DateTime::TimeZone::Europe::Moscow 2.47
- DateTime::TimeZone::Europe::Oslo 2.47
- DateTime::TimeZone::Europe::Paris 2.47
- DateTime::TimeZone::Europe::Prague 2.47
- DateTime::TimeZone::Europe::Riga 2.47
- DateTime::TimeZone::Europe::Rome 2.47
- DateTime::TimeZone::Europe::Samara 2.47
- DateTime::TimeZone::Europe::Saratov 2.47
- DateTime::TimeZone::Europe::Simferopol 2.47
- DateTime::TimeZone::Europe::Sofia 2.47
- DateTime::TimeZone::Europe::Stockholm 2.47
- DateTime::TimeZone::Europe::Tallinn 2.47
- DateTime::TimeZone::Europe::Tirane 2.47
- DateTime::TimeZone::Europe::Ulyanovsk 2.47
- DateTime::TimeZone::Europe::Uzhgorod 2.47
- DateTime::TimeZone::Europe::Vienna 2.47
- DateTime::TimeZone::Europe::Vilnius 2.47
- DateTime::TimeZone::Europe::Volgograd 2.47
- DateTime::TimeZone::Europe::Warsaw 2.47
- DateTime::TimeZone::Europe::Zaporozhye 2.47
- DateTime::TimeZone::Europe::Zurich 2.47
- DateTime::TimeZone::Floating 2.47
- DateTime::TimeZone::HST 2.47
- DateTime::TimeZone::Indian::Chagos 2.47
- DateTime::TimeZone::Indian::Christmas 2.47
- DateTime::TimeZone::Indian::Cocos 2.47
- DateTime::TimeZone::Indian::Kerguelen 2.47
- DateTime::TimeZone::Indian::Mahe 2.47
- DateTime::TimeZone::Indian::Maldives 2.47
- DateTime::TimeZone::Indian::Mauritius 2.47
- DateTime::TimeZone::Indian::Reunion 2.47
- DateTime::TimeZone::Local 2.47
- DateTime::TimeZone::Local::Android 2.47
- DateTime::TimeZone::Local::Unix 2.47
- DateTime::TimeZone::Local::VMS 2.47
- DateTime::TimeZone::MET 2.47
- DateTime::TimeZone::MST 2.47
- DateTime::TimeZone::MST7MDT 2.47
- DateTime::TimeZone::OffsetOnly 2.47
- DateTime::TimeZone::OlsonDB 2.47
- DateTime::TimeZone::OlsonDB::Change 2.47
- DateTime::TimeZone::OlsonDB::Observance 2.47
- DateTime::TimeZone::OlsonDB::Rule 2.47
- DateTime::TimeZone::OlsonDB::Zone 2.47
- DateTime::TimeZone::PST8PDT 2.47
- DateTime::TimeZone::Pacific::Apia 2.47
- DateTime::TimeZone::Pacific::Auckland 2.47
- DateTime::TimeZone::Pacific::Bougainville 2.47
- DateTime::TimeZone::Pacific::Chatham 2.47
- DateTime::TimeZone::Pacific::Chuuk 2.47
- DateTime::TimeZone::Pacific::Easter 2.47
- DateTime::TimeZone::Pacific::Efate 2.47
- DateTime::TimeZone::Pacific::Enderbury 2.47
- DateTime::TimeZone::Pacific::Fakaofo 2.47
- DateTime::TimeZone::Pacific::Fiji 2.47
- DateTime::TimeZone::Pacific::Funafuti 2.47
- DateTime::TimeZone::Pacific::Galapagos 2.47
- DateTime::TimeZone::Pacific::Gambier 2.47
- DateTime::TimeZone::Pacific::Guadalcanal 2.47
- DateTime::TimeZone::Pacific::Guam 2.47
- DateTime::TimeZone::Pacific::Honolulu 2.47
- DateTime::TimeZone::Pacific::Kiritimati 2.47
- DateTime::TimeZone::Pacific::Kosrae 2.47
- DateTime::TimeZone::Pacific::Kwajalein 2.47
- DateTime::TimeZone::Pacific::Majuro 2.47
- DateTime::TimeZone::Pacific::Marquesas 2.47
- DateTime::TimeZone::Pacific::Nauru 2.47
- DateTime::TimeZone::Pacific::Niue 2.47
- DateTime::TimeZone::Pacific::Norfolk 2.47
- DateTime::TimeZone::Pacific::Noumea 2.47
- DateTime::TimeZone::Pacific::Pago_Pago 2.47
- DateTime::TimeZone::Pacific::Palau 2.47
- DateTime::TimeZone::Pacific::Pitcairn 2.47
- DateTime::TimeZone::Pacific::Pohnpei 2.47
- DateTime::TimeZone::Pacific::Port_Moresby 2.47
- DateTime::TimeZone::Pacific::Rarotonga 2.47
- DateTime::TimeZone::Pacific::Tahiti 2.47
- DateTime::TimeZone::Pacific::Tarawa 2.47
- DateTime::TimeZone::Pacific::Tongatapu 2.47
- DateTime::TimeZone::Pacific::Wake 2.47
- DateTime::TimeZone::Pacific::Wallis 2.47
- DateTime::TimeZone::UTC 2.47
- DateTime::TimeZone::WET 2.47
+ DateTime-TimeZone-2.62
+ pathname: D/DR/DROLSKY/DateTime-TimeZone-2.62.tar.gz
+ provides:
+ DateTime::TimeZone 2.62
+ DateTime::TimeZone::Africa::Abidjan 2.62
+ DateTime::TimeZone::Africa::Algiers 2.62
+ DateTime::TimeZone::Africa::Bissau 2.62
+ DateTime::TimeZone::Africa::Cairo 2.62
+ DateTime::TimeZone::Africa::Casablanca 2.62
+ DateTime::TimeZone::Africa::Ceuta 2.62
+ DateTime::TimeZone::Africa::El_Aaiun 2.62
+ DateTime::TimeZone::Africa::Johannesburg 2.62
+ DateTime::TimeZone::Africa::Juba 2.62
+ DateTime::TimeZone::Africa::Khartoum 2.62
+ DateTime::TimeZone::Africa::Lagos 2.62
+ DateTime::TimeZone::Africa::Maputo 2.62
+ DateTime::TimeZone::Africa::Monrovia 2.62
+ DateTime::TimeZone::Africa::Nairobi 2.62
+ DateTime::TimeZone::Africa::Ndjamena 2.62
+ DateTime::TimeZone::Africa::Sao_Tome 2.62
+ DateTime::TimeZone::Africa::Tripoli 2.62
+ DateTime::TimeZone::Africa::Tunis 2.62
+ DateTime::TimeZone::Africa::Windhoek 2.62
+ DateTime::TimeZone::America::Adak 2.62
+ DateTime::TimeZone::America::Anchorage 2.62
+ DateTime::TimeZone::America::Araguaina 2.62
+ DateTime::TimeZone::America::Argentina::Buenos_Aires 2.62
+ DateTime::TimeZone::America::Argentina::Catamarca 2.62
+ DateTime::TimeZone::America::Argentina::Cordoba 2.62
+ DateTime::TimeZone::America::Argentina::Jujuy 2.62
+ DateTime::TimeZone::America::Argentina::La_Rioja 2.62
+ DateTime::TimeZone::America::Argentina::Mendoza 2.62
+ DateTime::TimeZone::America::Argentina::Rio_Gallegos 2.62
+ DateTime::TimeZone::America::Argentina::Salta 2.62
+ DateTime::TimeZone::America::Argentina::San_Juan 2.62
+ DateTime::TimeZone::America::Argentina::San_Luis 2.62
+ DateTime::TimeZone::America::Argentina::Tucuman 2.62
+ DateTime::TimeZone::America::Argentina::Ushuaia 2.62
+ DateTime::TimeZone::America::Asuncion 2.62
+ DateTime::TimeZone::America::Bahia 2.62
+ DateTime::TimeZone::America::Bahia_Banderas 2.62
+ DateTime::TimeZone::America::Barbados 2.62
+ DateTime::TimeZone::America::Belem 2.62
+ DateTime::TimeZone::America::Belize 2.62
+ DateTime::TimeZone::America::Boa_Vista 2.62
+ DateTime::TimeZone::America::Bogota 2.62
+ DateTime::TimeZone::America::Boise 2.62
+ DateTime::TimeZone::America::Cambridge_Bay 2.62
+ DateTime::TimeZone::America::Campo_Grande 2.62
+ DateTime::TimeZone::America::Cancun 2.62
+ DateTime::TimeZone::America::Caracas 2.62
+ DateTime::TimeZone::America::Cayenne 2.62
+ DateTime::TimeZone::America::Chicago 2.62
+ DateTime::TimeZone::America::Chihuahua 2.62
+ DateTime::TimeZone::America::Ciudad_Juarez 2.62
+ DateTime::TimeZone::America::Costa_Rica 2.62
+ DateTime::TimeZone::America::Cuiaba 2.62
+ DateTime::TimeZone::America::Danmarkshavn 2.62
+ DateTime::TimeZone::America::Dawson 2.62
+ DateTime::TimeZone::America::Dawson_Creek 2.62
+ DateTime::TimeZone::America::Denver 2.62
+ DateTime::TimeZone::America::Detroit 2.62
+ DateTime::TimeZone::America::Edmonton 2.62
+ DateTime::TimeZone::America::Eirunepe 2.62
+ DateTime::TimeZone::America::El_Salvador 2.62
+ DateTime::TimeZone::America::Fort_Nelson 2.62
+ DateTime::TimeZone::America::Fortaleza 2.62
+ DateTime::TimeZone::America::Glace_Bay 2.62
+ DateTime::TimeZone::America::Goose_Bay 2.62
+ DateTime::TimeZone::America::Grand_Turk 2.62
+ DateTime::TimeZone::America::Guatemala 2.62
+ DateTime::TimeZone::America::Guayaquil 2.62
+ DateTime::TimeZone::America::Guyana 2.62
+ DateTime::TimeZone::America::Halifax 2.62
+ DateTime::TimeZone::America::Havana 2.62
+ DateTime::TimeZone::America::Hermosillo 2.62
+ DateTime::TimeZone::America::Indiana::Indianapolis 2.62
+ DateTime::TimeZone::America::Indiana::Knox 2.62
+ DateTime::TimeZone::America::Indiana::Marengo 2.62
+ DateTime::TimeZone::America::Indiana::Petersburg 2.62
+ DateTime::TimeZone::America::Indiana::Tell_City 2.62
+ DateTime::TimeZone::America::Indiana::Vevay 2.62
+ DateTime::TimeZone::America::Indiana::Vincennes 2.62
+ DateTime::TimeZone::America::Indiana::Winamac 2.62
+ DateTime::TimeZone::America::Inuvik 2.62
+ DateTime::TimeZone::America::Iqaluit 2.62
+ DateTime::TimeZone::America::Jamaica 2.62
+ DateTime::TimeZone::America::Juneau 2.62
+ DateTime::TimeZone::America::Kentucky::Louisville 2.62
+ DateTime::TimeZone::America::Kentucky::Monticello 2.62
+ DateTime::TimeZone::America::La_Paz 2.62
+ DateTime::TimeZone::America::Lima 2.62
+ DateTime::TimeZone::America::Los_Angeles 2.62
+ DateTime::TimeZone::America::Maceio 2.62
+ DateTime::TimeZone::America::Managua 2.62
+ DateTime::TimeZone::America::Manaus 2.62
+ DateTime::TimeZone::America::Martinique 2.62
+ DateTime::TimeZone::America::Matamoros 2.62
+ DateTime::TimeZone::America::Mazatlan 2.62
+ DateTime::TimeZone::America::Menominee 2.62
+ DateTime::TimeZone::America::Merida 2.62
+ DateTime::TimeZone::America::Metlakatla 2.62
+ DateTime::TimeZone::America::Mexico_City 2.62
+ DateTime::TimeZone::America::Miquelon 2.62
+ DateTime::TimeZone::America::Moncton 2.62
+ DateTime::TimeZone::America::Monterrey 2.62
+ DateTime::TimeZone::America::Montevideo 2.62
+ DateTime::TimeZone::America::New_York 2.62
+ DateTime::TimeZone::America::Nome 2.62
+ DateTime::TimeZone::America::Noronha 2.62
+ DateTime::TimeZone::America::North_Dakota::Beulah 2.62
+ DateTime::TimeZone::America::North_Dakota::Center 2.62
+ DateTime::TimeZone::America::North_Dakota::New_Salem 2.62
+ DateTime::TimeZone::America::Nuuk 2.62
+ DateTime::TimeZone::America::Ojinaga 2.62
+ DateTime::TimeZone::America::Panama 2.62
+ DateTime::TimeZone::America::Paramaribo 2.62
+ DateTime::TimeZone::America::Phoenix 2.62
+ DateTime::TimeZone::America::Port_au_Prince 2.62
+ DateTime::TimeZone::America::Porto_Velho 2.62
+ DateTime::TimeZone::America::Puerto_Rico 2.62
+ DateTime::TimeZone::America::Punta_Arenas 2.62
+ DateTime::TimeZone::America::Rankin_Inlet 2.62
+ DateTime::TimeZone::America::Recife 2.62
+ DateTime::TimeZone::America::Regina 2.62
+ DateTime::TimeZone::America::Resolute 2.62
+ DateTime::TimeZone::America::Rio_Branco 2.62
+ DateTime::TimeZone::America::Santarem 2.62
+ DateTime::TimeZone::America::Santiago 2.62
+ DateTime::TimeZone::America::Santo_Domingo 2.62
+ DateTime::TimeZone::America::Sao_Paulo 2.62
+ DateTime::TimeZone::America::Scoresbysund 2.62
+ DateTime::TimeZone::America::Sitka 2.62
+ DateTime::TimeZone::America::St_Johns 2.62
+ DateTime::TimeZone::America::Swift_Current 2.62
+ DateTime::TimeZone::America::Tegucigalpa 2.62
+ DateTime::TimeZone::America::Thule 2.62
+ DateTime::TimeZone::America::Tijuana 2.62
+ DateTime::TimeZone::America::Toronto 2.62
+ DateTime::TimeZone::America::Vancouver 2.62
+ DateTime::TimeZone::America::Whitehorse 2.62
+ DateTime::TimeZone::America::Winnipeg 2.62
+ DateTime::TimeZone::America::Yakutat 2.62
+ DateTime::TimeZone::Antarctica::Casey 2.62
+ DateTime::TimeZone::Antarctica::Davis 2.62
+ DateTime::TimeZone::Antarctica::Macquarie 2.62
+ DateTime::TimeZone::Antarctica::Mawson 2.62
+ DateTime::TimeZone::Antarctica::Palmer 2.62
+ DateTime::TimeZone::Antarctica::Rothera 2.62
+ DateTime::TimeZone::Antarctica::Troll 2.62
+ DateTime::TimeZone::Antarctica::Vostok 2.62
+ DateTime::TimeZone::Asia::Almaty 2.62
+ DateTime::TimeZone::Asia::Amman 2.62
+ DateTime::TimeZone::Asia::Anadyr 2.62
+ DateTime::TimeZone::Asia::Aqtau 2.62
+ DateTime::TimeZone::Asia::Aqtobe 2.62
+ DateTime::TimeZone::Asia::Ashgabat 2.62
+ DateTime::TimeZone::Asia::Atyrau 2.62
+ DateTime::TimeZone::Asia::Baghdad 2.62
+ DateTime::TimeZone::Asia::Baku 2.62
+ DateTime::TimeZone::Asia::Bangkok 2.62
+ DateTime::TimeZone::Asia::Barnaul 2.62
+ DateTime::TimeZone::Asia::Beirut 2.62
+ DateTime::TimeZone::Asia::Bishkek 2.62
+ DateTime::TimeZone::Asia::Chita 2.62
+ DateTime::TimeZone::Asia::Choibalsan 2.62
+ DateTime::TimeZone::Asia::Colombo 2.62
+ DateTime::TimeZone::Asia::Damascus 2.62
+ DateTime::TimeZone::Asia::Dhaka 2.62
+ DateTime::TimeZone::Asia::Dili 2.62
+ DateTime::TimeZone::Asia::Dubai 2.62
+ DateTime::TimeZone::Asia::Dushanbe 2.62
+ DateTime::TimeZone::Asia::Famagusta 2.62
+ DateTime::TimeZone::Asia::Gaza 2.62
+ DateTime::TimeZone::Asia::Hebron 2.62
+ DateTime::TimeZone::Asia::Ho_Chi_Minh 2.62
+ DateTime::TimeZone::Asia::Hong_Kong 2.62
+ DateTime::TimeZone::Asia::Hovd 2.62
+ DateTime::TimeZone::Asia::Irkutsk 2.62
+ DateTime::TimeZone::Asia::Jakarta 2.62
+ DateTime::TimeZone::Asia::Jayapura 2.62
+ DateTime::TimeZone::Asia::Jerusalem 2.62
+ DateTime::TimeZone::Asia::Kabul 2.62
+ DateTime::TimeZone::Asia::Kamchatka 2.62
+ DateTime::TimeZone::Asia::Karachi 2.62
+ DateTime::TimeZone::Asia::Kathmandu 2.62
+ DateTime::TimeZone::Asia::Khandyga 2.62
+ DateTime::TimeZone::Asia::Kolkata 2.62
+ DateTime::TimeZone::Asia::Krasnoyarsk 2.62
+ DateTime::TimeZone::Asia::Kuching 2.62
+ DateTime::TimeZone::Asia::Macau 2.62
+ DateTime::TimeZone::Asia::Magadan 2.62
+ DateTime::TimeZone::Asia::Makassar 2.62
+ DateTime::TimeZone::Asia::Manila 2.62
+ DateTime::TimeZone::Asia::Nicosia 2.62
+ DateTime::TimeZone::Asia::Novokuznetsk 2.62
+ DateTime::TimeZone::Asia::Novosibirsk 2.62
+ DateTime::TimeZone::Asia::Omsk 2.62
+ DateTime::TimeZone::Asia::Oral 2.62
+ DateTime::TimeZone::Asia::Pontianak 2.62
+ DateTime::TimeZone::Asia::Pyongyang 2.62
+ DateTime::TimeZone::Asia::Qatar 2.62
+ DateTime::TimeZone::Asia::Qostanay 2.62
+ DateTime::TimeZone::Asia::Qyzylorda 2.62
+ DateTime::TimeZone::Asia::Riyadh 2.62
+ DateTime::TimeZone::Asia::Sakhalin 2.62
+ DateTime::TimeZone::Asia::Samarkand 2.62
+ DateTime::TimeZone::Asia::Seoul 2.62
+ DateTime::TimeZone::Asia::Shanghai 2.62
+ DateTime::TimeZone::Asia::Singapore 2.62
+ DateTime::TimeZone::Asia::Srednekolymsk 2.62
+ DateTime::TimeZone::Asia::Taipei 2.62
+ DateTime::TimeZone::Asia::Tashkent 2.62
+ DateTime::TimeZone::Asia::Tbilisi 2.62
+ DateTime::TimeZone::Asia::Tehran 2.62
+ DateTime::TimeZone::Asia::Thimphu 2.62
+ DateTime::TimeZone::Asia::Tokyo 2.62
+ DateTime::TimeZone::Asia::Tomsk 2.62
+ DateTime::TimeZone::Asia::Ulaanbaatar 2.62
+ DateTime::TimeZone::Asia::Urumqi 2.62
+ DateTime::TimeZone::Asia::Ust_Nera 2.62
+ DateTime::TimeZone::Asia::Vladivostok 2.62
+ DateTime::TimeZone::Asia::Yakutsk 2.62
+ DateTime::TimeZone::Asia::Yangon 2.62
+ DateTime::TimeZone::Asia::Yekaterinburg 2.62
+ DateTime::TimeZone::Asia::Yerevan 2.62
+ DateTime::TimeZone::Atlantic::Azores 2.62
+ DateTime::TimeZone::Atlantic::Bermuda 2.62
+ DateTime::TimeZone::Atlantic::Canary 2.62
+ DateTime::TimeZone::Atlantic::Cape_Verde 2.62
+ DateTime::TimeZone::Atlantic::Faroe 2.62
+ DateTime::TimeZone::Atlantic::Madeira 2.62
+ DateTime::TimeZone::Atlantic::South_Georgia 2.62
+ DateTime::TimeZone::Atlantic::Stanley 2.62
+ DateTime::TimeZone::Australia::Adelaide 2.62
+ DateTime::TimeZone::Australia::Brisbane 2.62
+ DateTime::TimeZone::Australia::Broken_Hill 2.62
+ DateTime::TimeZone::Australia::Darwin 2.62
+ DateTime::TimeZone::Australia::Eucla 2.62
+ DateTime::TimeZone::Australia::Hobart 2.62
+ DateTime::TimeZone::Australia::Lindeman 2.62
+ DateTime::TimeZone::Australia::Lord_Howe 2.62
+ DateTime::TimeZone::Australia::Melbourne 2.62
+ DateTime::TimeZone::Australia::Perth 2.62
+ DateTime::TimeZone::Australia::Sydney 2.62
+ DateTime::TimeZone::CET 2.62
+ DateTime::TimeZone::CST6CDT 2.62
+ DateTime::TimeZone::Catalog 2.62
+ DateTime::TimeZone::EET 2.62
+ DateTime::TimeZone::EST 2.62
+ DateTime::TimeZone::EST5EDT 2.62
+ DateTime::TimeZone::Europe::Andorra 2.62
+ DateTime::TimeZone::Europe::Astrakhan 2.62
+ DateTime::TimeZone::Europe::Athens 2.62
+ DateTime::TimeZone::Europe::Belgrade 2.62
+ DateTime::TimeZone::Europe::Berlin 2.62
+ DateTime::TimeZone::Europe::Brussels 2.62
+ DateTime::TimeZone::Europe::Bucharest 2.62
+ DateTime::TimeZone::Europe::Budapest 2.62
+ DateTime::TimeZone::Europe::Chisinau 2.62
+ DateTime::TimeZone::Europe::Dublin 2.62
+ DateTime::TimeZone::Europe::Gibraltar 2.62
+ DateTime::TimeZone::Europe::Helsinki 2.62
+ DateTime::TimeZone::Europe::Istanbul 2.62
+ DateTime::TimeZone::Europe::Kaliningrad 2.62
+ DateTime::TimeZone::Europe::Kirov 2.62
+ DateTime::TimeZone::Europe::Kyiv 2.62
+ DateTime::TimeZone::Europe::Lisbon 2.62
+ DateTime::TimeZone::Europe::London 2.62
+ DateTime::TimeZone::Europe::Madrid 2.62
+ DateTime::TimeZone::Europe::Malta 2.62
+ DateTime::TimeZone::Europe::Minsk 2.62
+ DateTime::TimeZone::Europe::Moscow 2.62
+ DateTime::TimeZone::Europe::Paris 2.62
+ DateTime::TimeZone::Europe::Prague 2.62
+ DateTime::TimeZone::Europe::Riga 2.62
+ DateTime::TimeZone::Europe::Rome 2.62
+ DateTime::TimeZone::Europe::Samara 2.62
+ DateTime::TimeZone::Europe::Saratov 2.62
+ DateTime::TimeZone::Europe::Simferopol 2.62
+ DateTime::TimeZone::Europe::Sofia 2.62
+ DateTime::TimeZone::Europe::Tallinn 2.62
+ DateTime::TimeZone::Europe::Tirane 2.62
+ DateTime::TimeZone::Europe::Ulyanovsk 2.62
+ DateTime::TimeZone::Europe::Vienna 2.62
+ DateTime::TimeZone::Europe::Vilnius 2.62
+ DateTime::TimeZone::Europe::Volgograd 2.62
+ DateTime::TimeZone::Europe::Warsaw 2.62
+ DateTime::TimeZone::Europe::Zurich 2.62
+ DateTime::TimeZone::Floating 2.62
+ DateTime::TimeZone::HST 2.62
+ DateTime::TimeZone::Indian::Chagos 2.62
+ DateTime::TimeZone::Indian::Maldives 2.62
+ DateTime::TimeZone::Indian::Mauritius 2.62
+ DateTime::TimeZone::Local 2.62
+ DateTime::TimeZone::Local::Android 2.62
+ DateTime::TimeZone::Local::Unix 2.62
+ DateTime::TimeZone::Local::VMS 2.62
+ DateTime::TimeZone::MET 2.62
+ DateTime::TimeZone::MST 2.62
+ DateTime::TimeZone::MST7MDT 2.62
+ DateTime::TimeZone::OffsetOnly 2.62
+ DateTime::TimeZone::OlsonDB 2.62
+ DateTime::TimeZone::OlsonDB::Change 2.62
+ DateTime::TimeZone::OlsonDB::Observance 2.62
+ DateTime::TimeZone::OlsonDB::Rule 2.62
+ DateTime::TimeZone::OlsonDB::Zone 2.62
+ DateTime::TimeZone::PST8PDT 2.62
+ DateTime::TimeZone::Pacific::Apia 2.62
+ DateTime::TimeZone::Pacific::Auckland 2.62
+ DateTime::TimeZone::Pacific::Bougainville 2.62
+ DateTime::TimeZone::Pacific::Chatham 2.62
+ DateTime::TimeZone::Pacific::Easter 2.62
+ DateTime::TimeZone::Pacific::Efate 2.62
+ DateTime::TimeZone::Pacific::Fakaofo 2.62
+ DateTime::TimeZone::Pacific::Fiji 2.62
+ DateTime::TimeZone::Pacific::Galapagos 2.62
+ DateTime::TimeZone::Pacific::Gambier 2.62
+ DateTime::TimeZone::Pacific::Guadalcanal 2.62
+ DateTime::TimeZone::Pacific::Guam 2.62
+ DateTime::TimeZone::Pacific::Honolulu 2.62
+ DateTime::TimeZone::Pacific::Kanton 2.62
+ DateTime::TimeZone::Pacific::Kiritimati 2.62
+ DateTime::TimeZone::Pacific::Kosrae 2.62
+ DateTime::TimeZone::Pacific::Kwajalein 2.62
+ DateTime::TimeZone::Pacific::Marquesas 2.62
+ DateTime::TimeZone::Pacific::Nauru 2.62
+ DateTime::TimeZone::Pacific::Niue 2.62
+ DateTime::TimeZone::Pacific::Norfolk 2.62
+ DateTime::TimeZone::Pacific::Noumea 2.62
+ DateTime::TimeZone::Pacific::Pago_Pago 2.62
+ DateTime::TimeZone::Pacific::Palau 2.62
+ DateTime::TimeZone::Pacific::Pitcairn 2.62
+ DateTime::TimeZone::Pacific::Port_Moresby 2.62
+ DateTime::TimeZone::Pacific::Rarotonga 2.62
+ DateTime::TimeZone::Pacific::Tahiti 2.62
+ DateTime::TimeZone::Pacific::Tarawa 2.62
+ DateTime::TimeZone::Pacific::Tongatapu 2.62
+ DateTime::TimeZone::UTC 2.62
+ DateTime::TimeZone::WET 2.62
requirements:
Class::Singleton 1.03
Cwd 3
@@ -750,11 +740,11 @@ DISTRIBUTIONS
perl 5.008004
strict 0
warnings 0
- Devel-StackTrace-2.04
- pathname: D/DR/DROLSKY/Devel-StackTrace-2.04.tar.gz
+ Devel-StackTrace-2.05
+ pathname: D/DR/DROLSKY/Devel-StackTrace-2.05.tar.gz
provides:
- Devel::StackTrace 2.04
- Devel::StackTrace::Frame 2.04
+ Devel::StackTrace 2.05
+ Devel::StackTrace::Frame 2.05
requirements:
ExtUtils::MakeMaker 0
File::Spec 0
@@ -775,42 +765,6 @@ DISTRIBUTIONS
base 0
strict 0
warnings 0
- Encode-3.10
- pathname: D/DA/DANKOGAI/Encode-3.10.tar.gz
- provides:
- Encode 3.10
- Encode::Alias 2.24
- Encode::Byte 2.04
- Encode::CJKConstants 2.02
- Encode::CN 2.03
- Encode::CN::HZ 2.10
- Encode::Config 2.05
- Encode::EBCDIC 2.02
- Encode::Encoder 2.03
- Encode::Encoding 2.08
- Encode::GSM0338 2.09
- Encode::Guess 2.08
- Encode::JP 2.05
- Encode::JP::H2Z 2.02
- Encode::JP::JIS7 2.08
- Encode::KR 2.03
- Encode::KR::2022_KR 2.04
- Encode::MIME::Header 2.28
- Encode::MIME::Header::ISO_2022_JP 1.09
- Encode::MIME::Name 1.03
- Encode::Symbol 2.02
- Encode::TW 2.03
- Encode::UTF_EBCDIC 3.10
- Encode::Unicode 2.18
- Encode::Unicode::UTF7 2.10
- Encode::XS 3.10
- Encode::utf8 3.10
- encoding 3.00
- requirements:
- Exporter 5.57
- ExtUtils::MakeMaker 0
- Storable 0
- parent 0.221
Encode-Locale-1.05
pathname: G/GA/GAAS/Encode-Locale-1.05.tar.gz
provides:
@@ -849,11 +803,11 @@ DISTRIBUTIONS
perl 5.008001
strict 0
warnings 0
- Exporter-Tiny-1.002002
- pathname: T/TO/TOBYINK/Exporter-Tiny-1.002002.tar.gz
+ Exporter-Tiny-1.006002
+ pathname: T/TO/TOBYINK/Exporter-Tiny-1.006002.tar.gz
provides:
- Exporter::Shiny 1.002002
- Exporter::Tiny 1.002002
+ Exporter::Shiny 1.006002
+ Exporter::Tiny 1.006002
requirements:
ExtUtils::MakeMaker 6.17
perl 5.006001
@@ -906,76 +860,28 @@ DISTRIBUTIONS
perl 5.006
strict 0
warnings 0
- ExtUtils-MakeMaker-7.62
- pathname: B/BI/BINGOS/ExtUtils-MakeMaker-7.62.tar.gz
- provides:
- ExtUtils::Command 7.62
- ExtUtils::Command::MM 7.62
- ExtUtils::Liblist 7.62
- ExtUtils::Liblist::Kid 7.62
- ExtUtils::MM 7.62
- ExtUtils::MM_AIX 7.62
- ExtUtils::MM_Any 7.62
- ExtUtils::MM_BeOS 7.62
- ExtUtils::MM_Cygwin 7.62
- ExtUtils::MM_DOS 7.62
- ExtUtils::MM_Darwin 7.62
- ExtUtils::MM_MacOS 7.62
- ExtUtils::MM_NW5 7.62
- ExtUtils::MM_OS2 7.62
- ExtUtils::MM_OS390 7.62
- ExtUtils::MM_QNX 7.62
- ExtUtils::MM_UWIN 7.62
- ExtUtils::MM_Unix 7.62
- ExtUtils::MM_VMS 7.62
- ExtUtils::MM_VOS 7.62
- ExtUtils::MM_Win32 7.62
- ExtUtils::MM_Win95 7.62
- ExtUtils::MY 7.62
- ExtUtils::MakeMaker 7.62
- ExtUtils::MakeMaker::Config 7.62
- ExtUtils::MakeMaker::Locale 7.62
- ExtUtils::MakeMaker::_version 7.62
- ExtUtils::MakeMaker::charstar 7.62
- ExtUtils::MakeMaker::version 7.62
- ExtUtils::MakeMaker::version::regex 7.62
- ExtUtils::MakeMaker::version::vpp 7.62
- ExtUtils::Mkbootstrap 7.62
- ExtUtils::Mksymlists 7.62
- ExtUtils::testlib 7.62
- MM 7.62
- MY 7.62
- requirements:
- Data::Dumper 0
- Encode 0
- File::Basename 0
- File::Spec 0.8
- Pod::Man 0
- perl 5.006
- FFI-CheckLib-0.28
- pathname: P/PL/PLICEASE/FFI-CheckLib-0.28.tar.gz
+ FFI-CheckLib-0.31
+ pathname: P/PL/PLICEASE/FFI-CheckLib-0.31.tar.gz
provides:
- FFI::CheckLib 0.28
+ FFI::CheckLib 0.31
requirements:
ExtUtils::MakeMaker 0
+ File::Which 0
List::Util 1.33
perl 5.006
- File-Listing-6.14
- pathname: P/PL/PLICEASE/File-Listing-6.14.tar.gz
+ File-Listing-6.16
+ pathname: P/PL/PLICEASE/File-Listing-6.16.tar.gz
provides:
- File::Listing 6.14
- File::Listing::apache 6.14
- File::Listing::dosftp 6.14
- File::Listing::netware 6.14
- File::Listing::unix 6.14
- File::Listing::vms 6.14
+ File::Listing 6.16
+ File::Listing::apache 6.16
+ File::Listing::dosftp 6.16
+ File::Listing::netware 6.16
+ File::Listing::unix 6.16
+ File::Listing::vms 6.16
requirements:
- Carp 0
- Exporter 0
+ Exporter 5.57
ExtUtils::MakeMaker 0
HTTP::Date 0
- Time::Local 0
- base 0
perl 5.006
File-NFSLock-1.29
pathname: B/BB/BBB/File-NFSLock-1.29.tar.gz
@@ -995,10 +901,10 @@ DISTRIBUTIONS
File::Spec 0.80
perl 5.008001
warnings 0
- File-ShareDir-Install-0.13
- pathname: E/ET/ETHER/File-ShareDir-Install-0.13.tar.gz
+ File-ShareDir-Install-0.14
+ pathname: E/ET/ETHER/File-ShareDir-Install-0.14.tar.gz
provides:
- File::ShareDir::Install 0.13
+ File::ShareDir::Install 0.14
requirements:
Carp 0
Exporter 0
@@ -1034,12 +940,12 @@ DISTRIBUTIONS
ExtUtils::MakeMaker 0
base 0
perl 5.006
- File-chdir-0.1010
- pathname: D/DA/DAGOLDEN/File-chdir-0.1010.tar.gz
+ File-chdir-0.1011
+ pathname: D/DA/DAGOLDEN/File-chdir-0.1011.tar.gz
provides:
- File::chdir 0.1010
- File::chdir::ARRAY 0.1010
- File::chdir::SCALAR 0.1010
+ File::chdir 0.1011
+ File::chdir::ARRAY 0.1011
+ File::chdir::SCALAR 0.1011
requirements:
Carp 0
Cwd 3.16
@@ -1049,20 +955,20 @@ DISTRIBUTIONS
perl 5.006
strict 0
vars 0
- GIS-Distance-0.19
- pathname: B/BL/BLUEFEET/GIS-Distance-0.19.tar.gz
- provides:
- GIS::Distance 0.19
- GIS::Distance::ALT 0.19
- GIS::Distance::Constants 0.19
- GIS::Distance::Cosine 0.19
- GIS::Distance::Formula 0.19
- GIS::Distance::GreatCircle 0.19
- GIS::Distance::Haversine 0.19
- GIS::Distance::MathTrig 0.19
- GIS::Distance::Null 0.19
- GIS::Distance::Polar 0.19
- GIS::Distance::Vincenty 0.19
+ GIS-Distance-0.20
+ pathname: B/BL/BLUEFEET/GIS-Distance-0.20.tar.gz
+ provides:
+ GIS::Distance 0.20
+ GIS::Distance::ALT 0.20
+ GIS::Distance::Constants 0.20
+ GIS::Distance::Cosine 0.20
+ GIS::Distance::Formula 0.20
+ GIS::Distance::GreatCircle 0.20
+ GIS::Distance::Haversine 0.20
+ GIS::Distance::MathTrig 0.20
+ GIS::Distance::Null 0.20
+ GIS::Distance::Polar 0.20
+ GIS::Distance::Vincenty 0.20
requirements:
Carp 0
Class::Measure::Length 0
@@ -1074,36 +980,34 @@ DISTRIBUTIONS
parent 0
perl 5.008001
strictures 2.000000
- Geo-Distance-0.25
- pathname: B/BL/BLUEFEET/Geo-Distance-0.25.tar.gz
- provides:
- Geo::Distance 0.25
- requirements:
- Carp 0
- Const::Fast 0.014
- GIS::Distance 0.14
- GIS::Distance::Constants 0.14
+ GIS-Distance-Fast-0.16
+ pathname: B/BL/BLUEFEET/GIS-Distance-Fast-0.16.tar.gz
+ provides:
+ GIS::Distance::Fast 0.16
+ GIS::Distance::Fast::ALT 0.16
+ GIS::Distance::Fast::Cosine 0.16
+ GIS::Distance::Fast::GreatCircle 0.16
+ GIS::Distance::Fast::Haversine 0.16
+ GIS::Distance::Fast::Null 0.16
+ GIS::Distance::Fast::Polar 0.16
+ GIS::Distance::Fast::Vincenty 0.16
+ requirements:
+ GIS::Distance::Formula 0.17
Module::Build::Tiny 0.035
+ namespace::clean 0.24
+ parent 0
perl 5.008001
- Geo-Distance-XS-0.13
- pathname: G/GR/GRAY/Geo-Distance-XS-0.13.tar.gz
- provides:
- Geo::Distance::XS 0.13
- requirements:
- ExtUtils::MakeMaker 0
- Geo::Distance 0.16
- Test::More 0.82
- XSLoader 0
- HTML-Parser-3.76
- pathname: O/OA/OALDERS/HTML-Parser-3.76.tar.gz
+ strictures 2.000000
+ HTML-Parser-3.82
+ pathname: O/OA/OALDERS/HTML-Parser-3.82.tar.gz
provides:
- HTML::Entities 3.76
- HTML::Filter 3.76
- HTML::HeadParser 3.76
- HTML::LinkExtor 3.76
- HTML::Parser 3.76
- HTML::PullParser 3.76
- HTML::TokeParser 3.76
+ HTML::Entities 3.82
+ HTML::Filter 3.82
+ HTML::HeadParser 3.82
+ HTML::LinkExtor 3.82
+ HTML::Parser 3.82
+ HTML::PullParser 3.82
+ HTML::TokeParser 3.82
requirements:
Carp 0
Exporter 0
@@ -1115,18 +1019,19 @@ DISTRIBUTIONS
URI::URL 0
XSLoader 0
strict 0
- HTML-Tagset-3.20
- pathname: P/PE/PETDANCE/HTML-Tagset-3.20.tar.gz
+ HTML-Tagset-3.24
+ pathname: P/PE/PETDANCE/HTML-Tagset-3.24.tar.gz
provides:
- HTML::Tagset 3.20
+ HTML::Tagset 3.24
requirements:
- ExtUtils::MakeMaker 0
- HTTP-Cookies-6.10
- pathname: O/OA/OALDERS/HTTP-Cookies-6.10.tar.gz
+ ExtUtils::MakeMaker 6.46
+ perl 5.010001
+ HTTP-Cookies-6.11
+ pathname: O/OA/OALDERS/HTTP-Cookies-6.11.tar.gz
provides:
- HTTP::Cookies 6.10
- HTTP::Cookies::Microsoft 6.10
- HTTP::Cookies::Netscape 6.10
+ HTTP::Cookies 6.11
+ HTTP::Cookies::Microsoft 6.11
+ HTTP::Cookies::Netscape 6.11
requirements:
Carp 0
ExtUtils::MakeMaker 0
@@ -1136,10 +1041,10 @@ DISTRIBUTIONS
locale 0
perl 5.008001
strict 0
- HTTP-Date-6.05
- pathname: O/OA/OALDERS/HTTP-Date-6.05.tar.gz
+ HTTP-Date-6.06
+ pathname: O/OA/OALDERS/HTTP-Date-6.06.tar.gz
provides:
- HTTP::Date 6.05
+ HTTP::Date 6.06
requirements:
Exporter 0
ExtUtils::MakeMaker 0
@@ -1147,22 +1052,24 @@ DISTRIBUTIONS
Time::Zone 0
perl 5.006002
strict 0
- HTTP-Message-6.33
- pathname: O/OA/OALDERS/HTTP-Message-6.33.tar.gz
- provides:
- HTTP::Config 6.33
- HTTP::Headers 6.33
- HTTP::Headers::Auth 6.33
- HTTP::Headers::ETag 6.33
- HTTP::Headers::Util 6.33
- HTTP::Message 6.33
- HTTP::Request 6.33
- HTTP::Request::Common 6.33
- HTTP::Response 6.33
- HTTP::Status 6.33
+ HTTP-Message-6.45
+ pathname: O/OA/OALDERS/HTTP-Message-6.45.tar.gz
+ provides:
+ HTTP::Config 6.45
+ HTTP::Headers 6.45
+ HTTP::Headers::Auth 6.45
+ HTTP::Headers::ETag 6.45
+ HTTP::Headers::Util 6.45
+ HTTP::Message 6.45
+ HTTP::Request 6.45
+ HTTP::Request::Common 6.45
+ HTTP::Response 6.45
+ HTTP::Status 6.45
requirements:
Carp 0
- Compress::Raw::Zlib 0
+ Clone 0.46
+ Compress::Raw::Bzip2 0
+ Compress::Raw::Zlib 2.062
Encode 3.01
Encode::Locale 1
Exporter 5.57
@@ -1173,15 +1080,13 @@ DISTRIBUTIONS
IO::Compress::Deflate 0
IO::Compress::Gzip 0
IO::HTML 0
- IO::Uncompress::Bunzip2 2.021
- IO::Uncompress::Gunzip 0
IO::Uncompress::Inflate 0
IO::Uncompress::RawInflate 0
LWP::MediaTypes 6
MIME::Base64 2.1
MIME::QuotedPrint 0
URI 1.10
- base 0
+ parent 0
perl 5.008001
strict 0
warnings 0
@@ -1220,18 +1125,19 @@ DISTRIBUTIONS
Exporter 5.57
ExtUtils::MakeMaker 0
perl 5.008
- IO-Socket-SSL-2.071
- pathname: S/SU/SULLR/IO-Socket-SSL-2.071.tar.gz
+ IO-Socket-SSL-2.085
+ pathname: S/SU/SULLR/IO-Socket-SSL-2.085.tar.gz
provides:
- IO::Socket::SSL 2.071
+ IO::Socket::SSL 2.085
IO::Socket::SSL::Intercept 2.056
- IO::Socket::SSL::OCSP_Cache 2.071
- IO::Socket::SSL::OCSP_Resolver 2.071
+ IO::Socket::SSL::OCSP_Cache 2.085
+ IO::Socket::SSL::OCSP_Resolver 2.085
IO::Socket::SSL::PublicSuffix undef
- IO::Socket::SSL::SSL_Context 2.071
- IO::Socket::SSL::SSL_HANDLE 2.071
- IO::Socket::SSL::Session_Cache 2.071
- IO::Socket::SSL::Utils 2.014
+ IO::Socket::SSL::SSL_Context 2.085
+ IO::Socket::SSL::SSL_HANDLE 2.085
+ IO::Socket::SSL::Session_Cache 2.085
+ IO::Socket::SSL::Trace 2.085
+ IO::Socket::SSL::Utils 2.015
requirements:
ExtUtils::MakeMaker 0
Mozilla::CA 0
@@ -1243,11 +1149,11 @@ DISTRIBUTIONS
IO::String 1.08
requirements:
ExtUtils::MakeMaker 0
- JSON-4.03
- pathname: I/IS/ISHIGAKI/JSON-4.03.tar.gz
+ JSON-4.10
+ pathname: I/IS/ISHIGAKI/JSON-4.10.tar.gz
provides:
- JSON 4.03
- JSON::Backend::PP 4.03
+ JSON 4.10
+ JSON::Backend::PP 4.10
requirements:
ExtUtils::MakeMaker 0
Test::More 0
@@ -1272,17 +1178,16 @@ DISTRIBUTIONS
Scalar::Util 0
perl 5.006002
strict 0
- LWP-Protocol-https-6.10
- pathname: O/OA/OALDERS/LWP-Protocol-https-6.10.tar.gz
+ LWP-Protocol-https-6.14
+ pathname: O/OA/OALDERS/LWP-Protocol-https-6.14.tar.gz
provides:
- LWP::Protocol::https 6.10
- LWP::Protocol::https::Socket 6.10
+ LWP::Protocol::https 6.14
+ LWP::Protocol::https::Socket 6.14
requirements:
ExtUtils::MakeMaker 0
- IO::Socket::SSL 1.54
+ IO::Socket::SSL 1.970
LWP::Protocol::http 0
LWP::UserAgent 6.06
- Mozilla::CA 20180117
Net::HTTPS 6
base 0
perl 5.008001
@@ -1322,42 +1227,42 @@ DISTRIBUTIONS
IPC::Cmd 0
XSLoader 0.22
base 0
- List-UtilsBy-0.11
- pathname: P/PE/PEVANS/List-UtilsBy-0.11.tar.gz
+ List-UtilsBy-0.12
+ pathname: P/PE/PEVANS/List-UtilsBy-0.12.tar.gz
provides:
- List::UtilsBy 0.11
+ List::UtilsBy 0.12
requirements:
Exporter 5.57
Module::Build 0.4004
- MRO-Compat-0.13
- pathname: H/HA/HAARG/MRO-Compat-0.13.tar.gz
+ MRO-Compat-0.15
+ pathname: H/HA/HAARG/MRO-Compat-0.15.tar.gz
provides:
- MRO::Compat 0.13
+ MRO::Compat 0.15
requirements:
ExtUtils::MakeMaker 0
perl 5.006
- Module-Build-0.4231
- pathname: L/LE/LEONT/Module-Build-0.4231.tar.gz
- provides:
- Module::Build 0.4231
- Module::Build::Base 0.4231
- Module::Build::Compat 0.4231
- Module::Build::Config 0.4231
- Module::Build::Cookbook 0.4231
- Module::Build::Dumper 0.4231
- Module::Build::Notes 0.4231
- Module::Build::PPMMaker 0.4231
- Module::Build::Platform::Default 0.4231
- Module::Build::Platform::MacOS 0.4231
- Module::Build::Platform::Unix 0.4231
- Module::Build::Platform::VMS 0.4231
- Module::Build::Platform::VOS 0.4231
- Module::Build::Platform::Windows 0.4231
- Module::Build::Platform::aix 0.4231
- Module::Build::Platform::cygwin 0.4231
- Module::Build::Platform::darwin 0.4231
- Module::Build::Platform::os2 0.4231
- Module::Build::PodParser 0.4231
+ Module-Build-0.4234
+ pathname: L/LE/LEONT/Module-Build-0.4234.tar.gz
+ provides:
+ Module::Build 0.4234
+ Module::Build::Base 0.4234
+ Module::Build::Compat 0.4234
+ Module::Build::Config 0.4234
+ Module::Build::Cookbook 0.4234
+ Module::Build::Dumper 0.4234
+ Module::Build::Notes 0.4234
+ Module::Build::PPMMaker 0.4234
+ Module::Build::Platform::Default 0.4234
+ Module::Build::Platform::MacOS 0.4234
+ Module::Build::Platform::Unix 0.4234
+ Module::Build::Platform::VMS 0.4234
+ Module::Build::Platform::VOS 0.4234
+ Module::Build::Platform::Windows 0.4234
+ Module::Build::Platform::aix 0.4234
+ Module::Build::Platform::cygwin 0.4234
+ Module::Build::Platform::darwin 0.4234
+ Module::Build::Platform::os2 0.4234
+ Module::Build::PodParser 0.4234
requirements:
CPAN::Meta 2.142060
Cwd 0
@@ -1376,16 +1281,15 @@ DISTRIBUTIONS
Getopt::Long 0
Module::Metadata 1.000002
Perl::OSType 1
- Pod::Man 2.17
TAP::Harness 3.29
Text::Abbrev 0
Text::ParseWords 0
perl 5.006001
version 0.87
- Module-Build-Tiny-0.039
- pathname: L/LE/LEONT/Module-Build-Tiny-0.039.tar.gz
+ Module-Build-Tiny-0.047
+ pathname: L/LE/LEONT/Module-Build-Tiny-0.047.tar.gz
provides:
- Module::Build::Tiny 0.039
+ Module::Build::Tiny 0.047
requirements:
CPAN::Meta 0
DynaLoader 0
@@ -1428,8 +1332,8 @@ DISTRIBUTIONS
perl 5.006
strict 0
warnings 0
- Mojolicious-9.19
- pathname: S/SR/SRI/Mojolicious-9.19.tar.gz
+ Mojolicious-9.36
+ pathname: S/SR/SRI/Mojolicious-9.36.tar.gz
provides:
Mojo undef
Mojo::Asset undef
@@ -1497,7 +1401,7 @@ DISTRIBUTIONS
Mojo::UserAgent::Transactor undef
Mojo::Util undef
Mojo::WebSocket undef
- Mojolicious 9.19
+ Mojolicious 9.36
Mojolicious::Command undef
Mojolicious::Command::Author::cpanify undef
Mojolicious::Command::Author::generate undef
@@ -1546,21 +1450,29 @@ DISTRIBUTIONS
IO::Socket::IP 0.37
Sub::Util 1.41
perl 5.016
- Mozilla-CA-20200520
- pathname: A/AB/ABH/Mozilla-CA-20200520.tar.gz
+ Mojolicious-Plugin-I18N-1.6
+ pathname: S/SH/SHARIFULN/Mojolicious-Plugin-I18N-1.6.tar.gz
+ provides:
+ Mojolicious::Plugin::I18N 1.6
+ requirements:
+ I18N::LangTags 0.35
+ Module::Build 0.42
+ Mojolicious 5
+ Test::More 0
+ perl 5.010001
+ Mozilla-CA-20240313
+ pathname: L/LW/LWP/Mozilla-CA-20240313.tar.gz
provides:
- Mozilla::CA 20200520
+ Mozilla::CA 20240313
requirements:
ExtUtils::MakeMaker 0
- Test 0
- perl 5.006
- Net-HTTP-6.21
- pathname: O/OA/OALDERS/Net-HTTP-6.21.tar.gz
+ Net-HTTP-6.23
+ pathname: O/OA/OALDERS/Net-HTTP-6.23.tar.gz
provides:
- Net::HTTP 6.21
- Net::HTTP::Methods 6.21
- Net::HTTP::NB 6.21
- Net::HTTPS 6.21
+ Net::HTTP 6.23
+ Net::HTTP::Methods 6.23
+ Net::HTTP::NB 6.23
+ Net::HTTPS 6.23
requirements:
Carp 0
Compress::Raw::Zlib 0
@@ -1572,20 +1484,24 @@ DISTRIBUTIONS
perl 5.006002
strict 0
warnings 0
- Net-SSLeay-1.90
- pathname: C/CH/CHRISN/Net-SSLeay-1.90.tar.gz
+ Net-SSLeay-1.94
+ pathname: C/CH/CHRISN/Net-SSLeay-1.94.tar.gz
provides:
- Net::SSLeay 1.90
- Net::SSLeay::Handle 1.90
+ Net::SSLeay 1.94
+ Net::SSLeay::Handle 1.94
requirements:
+ English 0
ExtUtils::MakeMaker 0
+ File::Spec::Functions 0
MIME::Base64 0
+ Text::Wrap 0
+ constant 0
perl 5.008001
- Package-Stash-0.39
- pathname: E/ET/ETHER/Package-Stash-0.39.tar.gz
+ Package-Stash-0.40
+ pathname: E/ET/ETHER/Package-Stash-0.40.tar.gz
provides:
- Package::Stash 0.39
- Package::Stash::PP 0.39
+ Package::Stash 0.40
+ Package::Stash::PP 0.40
requirements:
B 0
Carp 0
@@ -1601,10 +1517,10 @@ DISTRIBUTIONS
perl 5.008001
strict 0
warnings 0
- Package-Stash-XS-0.29
- pathname: E/ET/ETHER/Package-Stash-XS-0.29.tar.gz
+ Package-Stash-XS-0.30
+ pathname: E/ET/ETHER/Package-Stash-XS-0.30.tar.gz
provides:
- Package::Stash::XS 0.29
+ Package::Stash::XS 0.30
requirements:
ExtUtils::MakeMaker 0
XSLoader 0
@@ -1627,12 +1543,12 @@ DISTRIBUTIONS
Scalar::Util 1.18
XSLoader 0.22
parent 0
- Params-ValidationCompiler-0.30
- pathname: D/DR/DROLSKY/Params-ValidationCompiler-0.30.tar.gz
+ Params-ValidationCompiler-0.31
+ pathname: D/DR/DROLSKY/Params-ValidationCompiler-0.31.tar.gz
provides:
- Params::ValidationCompiler 0.30
- Params::ValidationCompiler::Compiler 0.30
- Params::ValidationCompiler::Exceptions 0.30
+ Params::ValidationCompiler 0.31
+ Params::ValidationCompiler::Compiler 0.31
+ Params::ValidationCompiler::Exceptions 0.31
requirements:
B 0
Carp 0
@@ -1645,11 +1561,11 @@ DISTRIBUTIONS
overload 0
strict 0
warnings 0
- Path-Tiny-0.118
- pathname: D/DA/DAGOLDEN/Path-Tiny-0.118.tar.gz
+ Path-Tiny-0.144
+ pathname: D/DA/DAGOLDEN/Path-Tiny-0.144.tar.gz
provides:
- Path::Tiny 0.118
- Path::Tiny::Error 0.118
+ Path::Tiny 0.144
+ Path::Tiny::Error 0.144
requirements:
Carp 0
Cwd 0
@@ -1659,6 +1575,7 @@ DISTRIBUTIONS
Exporter 5.57
ExtUtils::MakeMaker 6.17
Fcntl 0
+ File::Compare 0
File::Copy 0
File::Glob 0
File::Path 2.07
@@ -1687,49 +1604,49 @@ DISTRIBUTIONS
requirements:
Exporter 5.57
perl 5.006
- Specio-0.47
- pathname: D/DR/DROLSKY/Specio-0.47.tar.gz
- provides:
- Specio 0.47
- Specio::Coercion 0.47
- Specio::Constraint::AnyCan 0.47
- Specio::Constraint::AnyDoes 0.47
- Specio::Constraint::AnyIsa 0.47
- Specio::Constraint::Enum 0.47
- Specio::Constraint::Intersection 0.47
- Specio::Constraint::ObjectCan 0.47
- Specio::Constraint::ObjectDoes 0.47
- Specio::Constraint::ObjectIsa 0.47
- Specio::Constraint::Parameterizable 0.47
- Specio::Constraint::Parameterized 0.47
- Specio::Constraint::Role::CanType 0.47
- Specio::Constraint::Role::DoesType 0.47
- Specio::Constraint::Role::Interface 0.47
- Specio::Constraint::Role::IsaType 0.47
- Specio::Constraint::Simple 0.47
- Specio::Constraint::Structurable 0.47
- Specio::Constraint::Structured 0.47
- Specio::Constraint::Union 0.47
- Specio::Declare 0.47
- Specio::DeclaredAt 0.47
- Specio::Exception 0.47
- Specio::Exporter 0.47
- Specio::Helpers 0.47
- Specio::Library::Builtins 0.47
- Specio::Library::Numeric 0.47
- Specio::Library::Perl 0.47
- Specio::Library::String 0.47
- Specio::Library::Structured 0.47
- Specio::Library::Structured::Dict 0.47
- Specio::Library::Structured::Map 0.47
- Specio::Library::Structured::Tuple 0.47
- Specio::OO 0.47
- Specio::PartialDump 0.47
- Specio::Registry 0.47
- Specio::Role::Inlinable 0.47
- Specio::Subs 0.47
- Specio::TypeChecks 0.47
- Test::Specio 0.47
+ Specio-0.48
+ pathname: D/DR/DROLSKY/Specio-0.48.tar.gz
+ provides:
+ Specio 0.48
+ Specio::Coercion 0.48
+ Specio::Constraint::AnyCan 0.48
+ Specio::Constraint::AnyDoes 0.48
+ Specio::Constraint::AnyIsa 0.48
+ Specio::Constraint::Enum 0.48
+ Specio::Constraint::Intersection 0.48
+ Specio::Constraint::ObjectCan 0.48
+ Specio::Constraint::ObjectDoes 0.48
+ Specio::Constraint::ObjectIsa 0.48
+ Specio::Constraint::Parameterizable 0.48
+ Specio::Constraint::Parameterized 0.48
+ Specio::Constraint::Role::CanType 0.48
+ Specio::Constraint::Role::DoesType 0.48
+ Specio::Constraint::Role::Interface 0.48
+ Specio::Constraint::Role::IsaType 0.48
+ Specio::Constraint::Simple 0.48
+ Specio::Constraint::Structurable 0.48
+ Specio::Constraint::Structured 0.48
+ Specio::Constraint::Union 0.48
+ Specio::Declare 0.48
+ Specio::DeclaredAt 0.48
+ Specio::Exception 0.48
+ Specio::Exporter 0.48
+ Specio::Helpers 0.48
+ Specio::Library::Builtins 0.48
+ Specio::Library::Numeric 0.48
+ Specio::Library::Perl 0.48
+ Specio::Library::String 0.48
+ Specio::Library::Structured 0.48
+ Specio::Library::Structured::Dict 0.48
+ Specio::Library::Structured::Map 0.48
+ Specio::Library::Structured::Tuple 0.48
+ Specio::OO 0.48
+ Specio::PartialDump 0.48
+ Specio::Registry 0.48
+ Specio::Role::Inlinable 0.48
+ Specio::Subs 0.48
+ Specio::TypeChecks 0.48
+ Test::Specio 0.48
requirements:
B 0
Carp 0
@@ -1757,18 +1674,18 @@ DISTRIBUTIONS
strict 0
version 0.83
warnings 0
- Sub-Exporter-0.988
- pathname: R/RJ/RJBS/Sub-Exporter-0.988.tar.gz
+ Sub-Exporter-0.991
+ pathname: R/RJ/RJBS/Sub-Exporter-0.991.tar.gz
provides:
- Sub::Exporter 0.988
- Sub::Exporter::Util 0.988
+ Sub::Exporter 0.991
+ Sub::Exporter::Util 0.991
requirements:
Carp 0
Data::OptList 0.100
ExtUtils::MakeMaker 6.78
Params::Util 0.14
Sub::Install 0.92
- perl 5.008000
+ perl 5.012
strict 0
warnings 0
Sub-Exporter-Progressive-0.001013
@@ -1784,46 +1701,46 @@ DISTRIBUTIONS
requirements:
ExtUtils::MakeMaker 0
Test::More 0
- Sub-Install-0.928
- pathname: R/RJ/RJBS/Sub-Install-0.928.tar.gz
+ Sub-Install-0.929
+ pathname: R/RJ/RJBS/Sub-Install-0.929.tar.gz
provides:
- Sub::Install 0.928
+ Sub::Install 0.929
requirements:
B 0
Carp 0
- ExtUtils::MakeMaker 6.30
+ ExtUtils::MakeMaker 6.78
Scalar::Util 0
+ perl 5.008000
strict 0
warnings 0
- Sub-Quote-2.006006
- pathname: H/HA/HAARG/Sub-Quote-2.006006.tar.gz
+ Sub-Quote-2.006008
+ pathname: H/HA/HAARG/Sub-Quote-2.006008.tar.gz
provides:
- Sub::Defer 2.006006
- Sub::Quote 2.006006
+ Sub::Defer 2.006008
+ Sub::Quote 2.006008
requirements:
ExtUtils::MakeMaker 0
Scalar::Util 0
perl 5.006
- Test-Compile-v2.4.2
- pathname: E/EG/EGILES/Test-Compile-v2.4.2.tar.gz
+ Test-Compile-v3.3.1
+ pathname: E/EG/EGILES/Test-Compile-v3.3.1.tar.gz
provides:
- Test::Compile v2.4.2
- Test::Compile::Internal v2.4.2
+ Test::Compile v3.3.1
+ Test::Compile::Internal v3.3.1
requirements:
Exporter 5.68
Module::Build 0.38
- UNIVERSAL::require 0
parent 0.225
perl v5.10.0
- version 0
- Test-Fatal-0.016
- pathname: R/RJ/RJBS/Test-Fatal-0.016.tar.gz
+ version 0.77
+ Test-Fatal-0.017
+ pathname: R/RJ/RJBS/Test-Fatal-0.017.tar.gz
provides:
- Test::Fatal 0.016
+ Test::Fatal 0.017
requirements:
Carp 0
Exporter 5.57
- ExtUtils::MakeMaker 0
+ ExtUtils::MakeMaker 6.78
Test::Builder 0
Try::Tiny 0.07
strict 0
@@ -1852,17 +1769,17 @@ DISTRIBUTIONS
Test::Builder::Tester 1.02
Test::More 0.62
perl 5.008
- Text-CSV-2.01
- pathname: I/IS/ISHIGAKI/Text-CSV-2.01.tar.gz
+ Text-CSV-2.04
+ pathname: I/IS/ISHIGAKI/Text-CSV-2.04.tar.gz
provides:
- Text::CSV 2.01
- Text::CSV::ErrorDiag 2.01
- Text::CSV_PP 2.01
+ Text::CSV 2.04
+ Text::CSV::ErrorDiag 2.04
+ Text::CSV_PP 2.04
requirements:
ExtUtils::MakeMaker 0
IO::Handle 0
Test::Harness 0
- Test::More 0.71
+ Test::More 0.92
perl 5.006001
Text-LevenshteinXS-0.03
pathname: J/JG/JGOLDBERG/Text-LevenshteinXS-0.03.tar.gz
@@ -1871,17 +1788,6 @@ DISTRIBUTIONS
requirements:
ExtUtils::MakeMaker 0
Test 0
- Time-Local-1.30
- pathname: D/DR/DROLSKY/Time-Local-1.30.tar.gz
- provides:
- Time::Local 1.30
- requirements:
- Carp 0
- Exporter 0
- ExtUtils::MakeMaker 0
- constant 0
- parent 0
- strict 0
TimeDate-2.33
pathname: A/AT/ATOOMIC/TimeDate-2.33.tar.gz
provides:
@@ -1927,12 +1833,12 @@ DISTRIBUTIONS
TimeDate 1.21
requirements:
ExtUtils::MakeMaker 0
- Travel-Status-DE-DBWagenreihung-0.06
- pathname: D/DE/DERF/Travel-Status-DE-DBWagenreihung-0.06.tar.gz
+ Travel-Status-DE-DBWagenreihung-0.11
+ pathname: D/DE/DERF/Travel-Status-DE-DBWagenreihung-0.11.tar.gz
provides:
- Travel::Status::DE::DBWagenreihung 0.06
- Travel::Status::DE::DBWagenreihung::Section 0.06
- Travel::Status::DE::DBWagenreihung::Wagon 0.06
+ Travel::Status::DE::DBWagenreihung 0.11
+ Travel::Status::DE::DBWagenreihung::Section 0.11
+ Travel::Status::DE::DBWagenreihung::Wagon 0.11
requirements:
Carp 0
Class::Accessor 0
@@ -1946,12 +1852,41 @@ DISTRIBUTIONS
Test::Pod 0
Travel::Status::DE::IRIS 1.2
perl v5.20.0
- Travel-Status-DE-IRIS-1.57
- pathname: D/DE/DERF/Travel-Status-DE-IRIS-1.57.tar.gz
+ Travel-Status-DE-DeutscheBahn-5.06
+ pathname: D/DE/DERF/Travel-Status-DE-DeutscheBahn-5.06.tar.gz
+ provides:
+ Travel::Status::DE::DeutscheBahn 5.06
+ Travel::Status::DE::HAFAS 5.06
+ Travel::Status::DE::HAFAS::Journey 5.06
+ Travel::Status::DE::HAFAS::Location 5.06
+ Travel::Status::DE::HAFAS::Message 5.06
+ Travel::Status::DE::HAFAS::Polyline 5.06
+ Travel::Status::DE::HAFAS::Product 5.06
+ Travel::Status::DE::HAFAS::Stop 5.06
+ Travel::Status::DE::HAFAS::StopFinder 5.06
+ requirements:
+ Carp 0
+ Class::Accessor 0.16
+ DateTime 0
+ DateTime::Format::Strptime 0
+ Digest::MD5 0
+ Getopt::Long 0
+ JSON 0
+ LWP::Protocol::https 0
+ LWP::UserAgent 0
+ List::MoreUtils 0
+ List::Util 0
+ Module::Build 0.4
+ Test::Compile 0
+ Test::More 0
+ Test::Pod 0
+ perl v5.14.0
+ Travel-Status-DE-IRIS-1.96
+ pathname: D/DE/DERF/Travel-Status-DE-IRIS-1.96.tar.gz
provides:
- Travel::Status::DE::IRIS 1.57
- Travel::Status::DE::IRIS::Result 1.57
- Travel::Status::DE::IRIS::Stations 1.57
+ Travel::Status::DE::IRIS 1.96
+ Travel::Status::DE::IRIS::Result 1.96
+ Travel::Status::DE::IRIS::Stations 1.96
requirements:
Carp 0
Class::Accessor 0
@@ -1959,7 +1894,7 @@ DISTRIBUTIONS
DateTime::Format::Strptime 0
Encode 0
File::Slurp 9999.19
- Geo::Distance != 0.21
+ GIS::Distance 0
Getopt::Long 0
JSON 0
LWP::Protocol::https 0
@@ -1978,10 +1913,10 @@ DISTRIBUTIONS
Text::LevenshteinXS 0
XML::LibXML 0
perl v5.14.2
- Try-Tiny-0.30
- pathname: E/ET/ETHER/Try-Tiny-0.30.tar.gz
+ Try-Tiny-0.31
+ pathname: E/ET/ETHER/Try-Tiny-0.31.tar.gz
provides:
- Try::Tiny 0.30
+ Try::Tiny 0.31
requirements:
Carp 0
Exporter 5.57
@@ -2000,64 +1935,56 @@ DISTRIBUTIONS
requirements:
ExtUtils::MakeMaker 0
common::sense 0
- UNIVERSAL-require-0.19
- pathname: N/NE/NEILB/UNIVERSAL-require-0.19.tar.gz
- provides:
- UNIVERSAL::require 0.19
- requirements:
- Carp 0
- ExtUtils::MakeMaker 0
- Test::More 0.47
- perl 5.006
- strict 0
- warnings 0
- URI-5.09
- pathname: O/OA/OALDERS/URI-5.09.tar.gz
- provides:
- URI 5.09
- URI::Escape 5.09
- URI::Heuristic 5.09
- URI::IRI 5.09
- URI::QueryParam 5.09
- URI::Split 5.09
- URI::URL 5.09
- URI::WithBase 5.09
- URI::data 5.09
- URI::file 5.09
- URI::file::Base 5.09
- URI::file::FAT 5.09
- URI::file::Mac 5.09
- URI::file::OS2 5.09
- URI::file::QNX 5.09
- URI::file::Unix 5.09
- URI::file::Win32 5.09
- URI::ftp 5.09
- URI::gopher 5.09
- URI::http 5.09
- URI::https 5.09
- URI::ldap 5.09
- URI::ldapi 5.09
- URI::ldaps 5.09
- URI::mailto 5.09
- URI::mms 5.09
- URI::news 5.09
- URI::nntp 5.09
- URI::nntps 5.09
- URI::pop 5.09
- URI::rlogin 5.09
- URI::rsync 5.09
- URI::rtsp 5.09
- URI::rtspu 5.09
- URI::sftp 5.09
- URI::sip 5.09
- URI::sips 5.09
- URI::snews 5.09
- URI::ssh 5.09
- URI::telnet 5.09
- URI::tn3270 5.09
- URI::urn 5.09
- URI::urn::isbn 5.09
- URI::urn::oid 5.09
+ URI-5.28
+ pathname: O/OA/OALDERS/URI-5.28.tar.gz
+ provides:
+ URI 5.28
+ URI::Escape 5.28
+ URI::Heuristic 5.28
+ URI::IRI 5.28
+ URI::QueryParam 5.28
+ URI::Split 5.28
+ URI::URL 5.28
+ URI::WithBase 5.28
+ URI::data 5.28
+ URI::file 5.28
+ URI::file::Base 5.28
+ URI::file::FAT 5.28
+ URI::file::Mac 5.28
+ URI::file::OS2 5.28
+ URI::file::QNX 5.28
+ URI::file::Unix 5.28
+ URI::file::Win32 5.28
+ URI::ftp 5.28
+ URI::geo 5.28
+ URI::gopher 5.28
+ URI::http 5.28
+ URI::https 5.28
+ URI::icap 5.28
+ URI::icaps 5.28
+ URI::ldap 5.28
+ URI::ldapi 5.28
+ URI::ldaps 5.28
+ URI::mailto 5.28
+ URI::mms 5.28
+ URI::news 5.28
+ URI::nntp 5.28
+ URI::nntps 5.28
+ URI::pop 5.28
+ URI::rlogin 5.28
+ URI::rsync 5.28
+ URI::rtsp 5.28
+ URI::rtspu 5.28
+ URI::sftp 5.28
+ URI::sip 5.28
+ URI::sips 5.28
+ URI::snews 5.28
+ URI::ssh 5.28
+ URI::telnet 5.28
+ URI::tn3270 5.28
+ URI::urn 5.28
+ URI::urn::isbn 5.28
+ URI::urn::oid 5.28
requirements:
Carp 0
Cwd 0
@@ -2076,10 +2003,10 @@ DISTRIBUTIONS
strict 0
utf8 0
warnings 0
- Variable-Magic-0.62
- pathname: V/VP/VPIT/Variable-Magic-0.62.tar.gz
+ Variable-Magic-0.64
+ pathname: V/VP/VPIT/Variable-Magic-0.64.tar.gz
provides:
- Variable::Magic 0.62
+ Variable::Magic 0.64
requirements:
Carp 0
Config 0
@@ -2107,45 +2034,45 @@ DISTRIBUTIONS
Fcntl 0
URI 1.10
perl 5.008001
- XML-LibXML-2.0207
- pathname: S/SH/SHLOMIF/XML-LibXML-2.0207.tar.gz
- provides:
- XML::LibXML 2.0207
- XML::LibXML::Attr 2.0207
- XML::LibXML::AttributeHash 2.0207
- XML::LibXML::Boolean 2.0207
- XML::LibXML::CDATASection 2.0207
- XML::LibXML::Comment 2.0207
- XML::LibXML::Common 2.0207
- XML::LibXML::Devel 2.0207
- XML::LibXML::Document 2.0207
- XML::LibXML::DocumentFragment 2.0207
- XML::LibXML::Dtd 2.0207
- XML::LibXML::Element 2.0207
- XML::LibXML::ErrNo 2.0207
- XML::LibXML::Error 2.0207
- XML::LibXML::InputCallback 2.0207
- XML::LibXML::Literal 2.0207
- XML::LibXML::NamedNodeMap 2.0207
- XML::LibXML::Namespace 2.0207
- XML::LibXML::Node 2.0207
- XML::LibXML::NodeList 2.0207
- XML::LibXML::Number 2.0207
- XML::LibXML::PI 2.0207
- XML::LibXML::Pattern 2.0207
- XML::LibXML::Reader 2.0207
- XML::LibXML::RegExp 2.0207
- XML::LibXML::RelaxNG 2.0207
- XML::LibXML::SAX 2.0207
- XML::LibXML::SAX::AttributeNode 2.0207
- XML::LibXML::SAX::Builder 2.0207
- XML::LibXML::SAX::Generator 2.0207
- XML::LibXML::SAX::Parser 2.0207
- XML::LibXML::Schema 2.0207
- XML::LibXML::Text 2.0207
- XML::LibXML::XPathContext 2.0207
- XML::LibXML::XPathExpression 2.0207
- XML::LibXML::_SAXParser 2.0207
+ XML-LibXML-2.0210
+ pathname: S/SH/SHLOMIF/XML-LibXML-2.0210.tar.gz
+ provides:
+ XML::LibXML 2.0210
+ XML::LibXML::Attr 2.0210
+ XML::LibXML::AttributeHash 2.0210
+ XML::LibXML::Boolean 2.0210
+ XML::LibXML::CDATASection 2.0210
+ XML::LibXML::Comment 2.0210
+ XML::LibXML::Common 2.0210
+ XML::LibXML::Devel 2.0210
+ XML::LibXML::Document 2.0210
+ XML::LibXML::DocumentFragment 2.0210
+ XML::LibXML::Dtd 2.0210
+ XML::LibXML::Element 2.0210
+ XML::LibXML::ErrNo 2.0210
+ XML::LibXML::Error 2.0210
+ XML::LibXML::InputCallback 2.0210
+ XML::LibXML::Literal 2.0210
+ XML::LibXML::NamedNodeMap 2.0210
+ XML::LibXML::Namespace 2.0210
+ XML::LibXML::Node 2.0210
+ XML::LibXML::NodeList 2.0210
+ XML::LibXML::Number 2.0210
+ XML::LibXML::PI 2.0210
+ XML::LibXML::Pattern 2.0210
+ XML::LibXML::Reader 2.0210
+ XML::LibXML::RegExp 2.0210
+ XML::LibXML::RelaxNG 2.0210
+ XML::LibXML::SAX 2.0210
+ XML::LibXML::SAX::AttributeNode 2.0210
+ XML::LibXML::SAX::Builder 2.0210
+ XML::LibXML::SAX::Generator 2.0210
+ XML::LibXML::SAX::Parser 2.0210
+ XML::LibXML::Schema 2.0210
+ XML::LibXML::Text 2.0210
+ XML::LibXML::XPathContext 2.0210
+ XML::LibXML::XPathExpression 2.0210
+ XML::LibXML::_SAXParser 2.0210
requirements:
Alien::Base::Wrapper 0
Alien::Libxml2 0.14
@@ -2255,56 +2182,55 @@ DISTRIBUTIONS
XSLoader 0
lib 0
perl 5.008001
- libwww-perl-6.55
- pathname: O/OA/OALDERS/libwww-perl-6.55.tar.gz
- provides:
- LWP 6.55
- LWP::Authen::Basic 6.55
- LWP::Authen::Digest 6.55
- LWP::Authen::Ntlm 6.55
- LWP::ConnCache 6.55
- LWP::Debug 6.55
- LWP::Debug::TraceHTTP 6.55
- LWP::DebugFile 6.55
- LWP::MemberMixin 6.55
- LWP::Protocol 6.55
- LWP::Protocol::cpan 6.55
- LWP::Protocol::data 6.55
- LWP::Protocol::file 6.55
- LWP::Protocol::ftp 6.55
- LWP::Protocol::gopher 6.55
- LWP::Protocol::http 6.55
- LWP::Protocol::loopback 6.55
- LWP::Protocol::mailto 6.55
- LWP::Protocol::nntp 6.55
- LWP::Protocol::nogo 6.55
- LWP::RobotUA 6.55
- LWP::Simple 6.55
- LWP::UserAgent 6.55
- libwww::perl undef
- requirements:
- CPAN::Meta::Requirements 2.120620
+ libwww-perl-6.77
+ pathname: O/OA/OALDERS/libwww-perl-6.77.tar.gz
+ provides:
+ LWP 6.77
+ LWP::Authen::Basic 6.77
+ LWP::Authen::Digest 6.77
+ LWP::Authen::Ntlm 6.77
+ LWP::ConnCache 6.77
+ LWP::Debug 6.77
+ LWP::Debug::TraceHTTP 6.77
+ LWP::DebugFile 6.77
+ LWP::MemberMixin 6.77
+ LWP::Protocol 6.77
+ LWP::Protocol::cpan 6.77
+ LWP::Protocol::data 6.77
+ LWP::Protocol::file 6.77
+ LWP::Protocol::ftp 6.77
+ LWP::Protocol::gopher 6.77
+ LWP::Protocol::http 6.77
+ LWP::Protocol::loopback 6.77
+ LWP::Protocol::mailto 6.77
+ LWP::Protocol::nntp 6.77
+ LWP::Protocol::nogo 6.77
+ LWP::RobotUA 6.77
+ LWP::Simple 6.77
+ LWP::UserAgent 6.77
+ requirements:
Digest::MD5 0
Encode 2.12
Encode::Locale 0
ExtUtils::MakeMaker 0
File::Copy 0
File::Listing 6
+ File::Temp 0
Getopt::Long 0
HTML::Entities 0
- HTML::HeadParser 0
+ HTML::HeadParser 3.71
HTTP::Cookies 6
HTTP::Date 6
HTTP::Negotiate 6
- HTTP::Request 6
- HTTP::Request::Common 6
- HTTP::Response 6
+ HTTP::Request 6.18
+ HTTP::Request::Common 6.18
+ HTTP::Response 6.18
HTTP::Status 6.18
IO::Select 0
IO::Socket 0
LWP::MediaTypes 6
MIME::Base64 2.1
- Module::Metadata 0
+ Module::Load 0
Net::FTP 2.58
Net::HTTP 6.18
Scalar::Util 0
@@ -2312,7 +2238,7 @@ DISTRIBUTIONS
URI 1.10
URI::Escape 0
WWW::RobotRules 6
- base 0
+ parent 0.217
perl 5.008001
strict 0
warnings 0
diff --git a/examples/dbf_update_zugbildungsplan b/examples/dbf_update_zugbildungsplan
index 816495e..1cd82e7 100644
--- a/examples/dbf_update_zugbildungsplan
+++ b/examples/dbf_update_zugbildungsplan
@@ -2,7 +2,7 @@
set -eu
-wget -qO share/zugbildungsplan.json.new https://lib.finalrewind.org/dbdb/db_zugbildung_v0.json
+wget -qO share/zugbildungsplan.json.new https://lib.finalrewind.org/dbdb/db_zugbildung_v1.json
chmod 644 share/zugbildungsplan.json.new
diff --git a/index.pl b/index.pl
index b983734..467e0b2 100644
--- a/index.pl
+++ b/index.pl
@@ -1,5 +1,5 @@
#!/usr/bin/env perl
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
diff --git a/lib/DBInfoscreen.pm b/lib/DBInfoscreen.pm
index 12da336..c33a703 100644
--- a/lib/DBInfoscreen.pm
+++ b/lib/DBInfoscreen.pm
@@ -1,32 +1,27 @@
package DBInfoscreen;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
use Mojo::Base 'Mojolicious';
use Cache::File;
+use DBInfoscreen::Helper::EFA;
use DBInfoscreen::Helper::HAFAS;
-use DBInfoscreen::Helper::Marudor;
use DBInfoscreen::Helper::Wagonorder;
use File::Slurp qw(read_file);
use JSON;
-use Travel::Status::DE::IRIS::Stations;
use utf8;
-no if $] >= 5.018, warnings => 'experimental::smartmatch';
-
sub startup {
my ($self) = @_;
$self->config(
- hafas_rest_api => $ENV{DBFAKEDISPLAY_HAFAS_API}
- // 'https://v5.db.transport.rest',
hypnotoad => {
- accepts => $ENV{DBFAKEDISPLAY_ACCEPTS} // 100,
- clients => $ENV{DBFAKEDISPLAY_CLIENTS} // 10,
+ accepts => $ENV{DBFAKEDISPLAY_ACCEPTS} // 100,
+ clients => $ENV{DBFAKEDISPLAY_CLIENTS} // 10,
listen => [ $ENV{DBFAKEDISPLAY_LISTEN} // 'http://*:8092' ],
pid_file => $ENV{DBFAKEDISPLAY_PID_FILE}
// '/tmp/db-fakedisplay.pid',
@@ -41,20 +36,25 @@ sub startup {
);
chomp $self->config->{version};
+ $self->defaults( version => $self->config->{version} // 'UNKNOWN' );
+
+ # Generally, the reverse proxy handles compression.
+ # Also, Mojolicious compression breaks legacy callback-based JSON endpoints
+ # for some clients.
+ $self->renderer->compress(0);
$self->hook(
before_dispatch => sub {
my ($self) = @_;
- # The "theme" cookie is set client-side if the theme we delivered was
- # changed by dark mode detection or by using the theme switcher. It's
- # not part of Mojolicious' session data (and can't be, due to
- # signing and HTTPOnly), so we need to add it here.
+ # The "theme" cookie is set client-side if the theme we delivered was
+ # changed by dark mode detection or by using the theme switcher. It's
+ # not part of Mojolicious' session data (and can't be, due to
+ # signing and HTTPOnly), so we need to add it here.
for my $cookie ( @{ $self->req->cookies } ) {
if ( $cookie->name eq 'theme' ) {
$self->session( theme => $cookie->value );
- return;
}
}
}
@@ -85,36 +85,6 @@ sub startup {
);
$self->attr(
- ice_type_map => sub {
- if ( -r 'share/zugbildungsplan.json' ) {
- my $ice_type_map = JSON->new->utf8->decode(
- scalar read_file('share/zugbildungsplan.json') );
- my $ret;
- while ( my ( $k, $v ) = each %{ $ice_type_map->{train} } ) {
- if ( $v->{type} ) {
- $ret->{$k} = [
- $v->{type}, $v->{shortType},
- exists $v->{wagons} ? 1 : 0
- ];
- }
- }
- return $ret;
- }
- return {};
- }
- );
-
- $self->attr(
- train_details_db => sub {
- if ( -r 'share/zugbildungsplan.json' ) {
- return JSON->new->utf8->decode(
- scalar read_file('share/zugbildungsplan.json') )->{train};
- }
- return {};
- }
- );
-
- $self->attr(
dbdb_wagon => sub {
return JSON->new->utf8->decode(
scalar read_file('share/dbdb_wagen.json') );
@@ -122,10 +92,9 @@ sub startup {
);
$self->helper(
- hafas => sub {
+ efa => sub {
my ($self) = @_;
- state $hafas = DBInfoscreen::Helper::HAFAS->new(
- api => $self->config->{hafas_rest_api},
+ state $efa = DBInfoscreen::Helper::EFA->new(
log => $self->app->log,
main_cache => $self->app->cache_iris_main,
realtime_cache => $self->app->cache_iris_rt,
@@ -137,9 +106,9 @@ sub startup {
);
$self->helper(
- marudor => sub {
+ hafas => sub {
my ($self) = @_;
- state $hafas = DBInfoscreen::Helper::Marudor->new(
+ state $hafas = DBInfoscreen::Helper::HAFAS->new(
log => $self->app->log,
main_cache => $self->app->cache_iris_main,
realtime_cache => $self->app->cache_iris_rt,
@@ -214,71 +183,6 @@ sub startup {
);
$self->helper(
- 'json_route_diff' => sub {
- my ( $self, $route, $sched_route ) = @_;
- my @json_route;
- my @route = @{$route};
- my @sched_route = @{$sched_route};
-
- my $route_idx = 0;
- my $sched_idx = 0;
-
- while ( $route_idx <= $#route and $sched_idx <= $#sched_route ) {
- if ( $route[$route_idx] eq $sched_route[$sched_idx] ) {
- push( @json_route, { name => $route[$route_idx] } );
- $route_idx++;
- $sched_idx++;
- }
-
- # this branch is inefficient, but won't be taken frequently
- elsif ( not( $route[$route_idx] ~~ \@sched_route ) ) {
- push(
- @json_route,
- {
- name => $route[$route_idx],
- isAdditional => 1
- }
- );
- $route_idx++;
- }
- else {
- push(
- @json_route,
- {
- name => $sched_route[$sched_idx],
- isCancelled => 1
- }
- );
- $sched_idx++;
- }
- }
- while ( $route_idx <= $#route ) {
- push(
- @json_route,
- {
- name => $route[$route_idx],
- isAdditional => 1,
- isCancelled => 0
- }
- );
- $route_idx++;
- }
- while ( $sched_idx <= $#sched_route ) {
- push(
- @json_route,
- {
- name => $sched_route[$sched_idx],
- isAdditional => 0,
- isCancelled => 1
- }
- );
- $sched_idx++;
- }
- return @json_route;
- }
- );
-
- $self->helper(
'occupancy_icon' => sub {
my ( $self, $occupancy ) = @_;
@@ -303,7 +207,9 @@ sub startup {
$self->helper(
'utilization_icon' => sub {
my ( $self, $utilization ) = @_;
- my ( $first, $second ) = @{ $utilization // [ 0, 0 ] };
+ my ( $first, $second ) = @{ $utilization // [] };
+ $first //= 0;
+ $second //= 0;
my $sum = ( $first + $second ) / 2;
my @symbols
@@ -351,13 +257,12 @@ sub startup {
my $r = $self->routes;
- $r->get('/_redirect')->to('static#redirect');
+ $r->get('/_redirect')->to('stationboard#redirect_to_station');
# legacy entry point
$r->get('/_auto')->to('static#geostop');
$r->get('/_autostop')->to('static#geostop');
- $r->get('/_autotrain')->to('static#geotrain');
$r->get('/_datenschutz')->to('static#privacy');
@@ -367,18 +272,16 @@ sub startup {
$r->get('/_impressum')->to('static#imprint');
+ $r->get('/dyn/:av/autocomplete.js')->to('stationboard#autocomplete');
+
$r->get('/_wr/:train/:departure')->to('wagenreihung#wagenreihung');
- $r->get('/wr/:train')->to('wagenreihung#zugbildung_db');
$r->get('/w/*wagon')->to('wagenreihung#wagen');
$r->get('/_ajax_mapinfo/:tripid/:lineno')->to('map#ajax_route');
$r->get('/map/:tripid/:lineno')->to('map#route');
- $r->get('/intersection/:trips')->to('map#intersection');
- $r->get('/z/:train/*station')->to('stationboard#station_train_details');
- $r->get('/z/:train')->to('stationboard#train_details');
-
- $r->get('/map')->to('map#search_form');
- $r->get('/_trainsearch')->to('map#search');
+ $r->get( '/z/:train/*station' => 'train_at_station' )
+ ->to('stationboard#station_train_details');
+ $r->get( '/z/:train' => 'train' )->to('stationboard#train_details');
$self->defaults( layout => 'app' );
diff --git a/lib/DBInfoscreen/Controller/Map.pm b/lib/DBInfoscreen/Controller/Map.pm
index cea5155..bced612 100644
--- a/lib/DBInfoscreen/Controller/Map.pm
+++ b/lib/DBInfoscreen/Controller/Map.pm
@@ -1,6 +1,6 @@
package DBInfoscreen::Controller::Map;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -10,7 +10,7 @@ use Mojo::Promise;
use DateTime;
use DateTime::Format::Strptime;
-use Geo::Distance;
+use GIS::Distance;
use List::Util qw();
my $strp = DateTime::Format::Strptime->new(
@@ -18,22 +18,27 @@ my $strp = DateTime::Format::Strptime->new(
time_zone => 'Europe/Berlin',
);
+# Input:
+# - polyline: Travel::Status::DE::HAFAS::Journey->polyline
+# - from_name: station name
+# - to_name: station name
+# Ouptut:
+# - from_index: polyline index that corresponds to from_name
+# - to_index: polyline index that corresponds to to_name
sub get_route_indexes {
- my ( $features, $from_name, $to_name ) = @_;
+ my ( $polyline, $from_name, $to_name ) = @_;
my ( $from_index, $to_index );
- for my $i ( 0 .. $#{$features} ) {
- my $this_point = $features->[$i];
+ for my $i ( 0 .. $#{$polyline} ) {
+ my $this_point = $polyline->[$i];
if ( not defined $from_index
- and $this_point->{properties}{type}
- and $this_point->{properties}{type} eq 'stop'
- and $this_point->{properties}{name} eq $from_name )
+ and $this_point->{name}
+ and $this_point->{name} eq $from_name )
{
$from_index = $i;
}
- elsif ( $this_point->{properties}{type}
- and $this_point->{properties}{type} eq 'stop'
- and $this_point->{properties}{name} eq $to_name )
+ elsif ( $this_point->{name}
+ and $this_point->{name} eq $to_name )
{
$to_index = $i;
last;
@@ -42,108 +47,30 @@ sub get_route_indexes {
return ( $from_index, $to_index );
}
-# Returns timestamped train positions between stop1 and stop2 (must not have
-# intermittent stops) in 10-second steps.
-sub estimate_timestamped_positions {
- my (%opt) = @_;
-
- my $from_dt = $opt{from}{dep};
- my $to_dt = $opt{to}{arr};
- my $from_name = $opt{from}{name};
- my $to_name = $opt{to}{name};
- my $features = $opt{features};
-
- my $duration = $to_dt->epoch - $from_dt->epoch;
-
- my @train_positions;
-
- my @completion_ratios
- = map { ( $_ * 10 / $duration ) } ( 0 .. $duration / 10 );
-
- my ( $from_index, $to_index )
- = get_route_indexes( $features, $from_name, $to_name );
-
- my $location_epoch = $from_dt->epoch;
- my $geo = Geo::Distance->new;
-
- if ( defined $from_index and defined $to_index ) {
- my $total_distance = 0;
- for my $j ( $from_index + 1 .. $to_index ) {
- my $prev = $features->[ $j - 1 ]{geometry}{coordinates};
- my $this = $features->[$j]{geometry}{coordinates};
- if ( $prev and $this ) {
- $total_distance += $geo->distance(
- 'kilometer', $prev->[0], $prev->[1],
- $this->[0], $this->[1]
- );
- }
- }
- my @marker_distances = map { $total_distance * $_ } @completion_ratios;
- $total_distance = 0;
- for my $j ( $from_index + 1 .. $to_index ) {
- my $prev = $features->[ $j - 1 ]{geometry}{coordinates};
- my $this = $features->[$j]{geometry}{coordinates};
- if ( $prev and $this ) {
- my $prev_distance = $total_distance;
- $total_distance += $geo->distance(
- 'kilometer', $prev->[0], $prev->[1],
- $this->[0], $this->[1]
- );
- for my $i ( @train_positions .. $#marker_distances ) {
- my $marker_distance = $marker_distances[$i];
- if ( $total_distance > $marker_distance ) {
-
- # completion ratio for the line between (prev, this)
- my $sub_ratio = 1;
- if ( $total_distance != $prev_distance ) {
- $sub_ratio = ( $marker_distance - $prev_distance )
- / ( $total_distance - $prev_distance );
- }
-
- my $lat = $prev->[1]
- + ( $this->[1] - $prev->[1] ) * $sub_ratio;
- my $lon = $prev->[0]
- + ( $this->[0] - $prev->[0] ) * $sub_ratio;
-
- push( @train_positions,
- [ $location_epoch, $lat, $lon ] );
- $location_epoch += 10;
- }
- }
- if ( @train_positions == @completion_ratios ) {
- return @train_positions;
- }
- }
- }
- if (@train_positions) {
- return @train_positions;
- }
- }
- return;
-}
-
# Input:
# now: DateTime
# from: current/previous stop
# {dep => DateTime, name => str, lat => float, lon => float}
# to: next stop
# {arr => DateTime, name => str, lat => float, lon => float}
-# features: https://github.com/public-transport/hafas-client/blob/4/docs/trip.md features array
+# route: Travel::Status::DE::HAFAS::Journey->route
+# polyline: Travel::Status::DE::HAFAS::Journey->polyline (list of lon/lat hashes)
# Output: list of estimated train positions in [lat, lon] format.
# - current position
# - position 2 seconds from now
# - position 4 seconds from now
# - ...
sub estimate_train_positions {
- my (%opt) = @_;
+ my ( $self, %opt ) = @_;
my $now = $opt{now};
- my $from_dt = $opt{from}{dep} // $opt{from}{arr};
- my $to_dt = $opt{to}{arr} // $opt{to}{dep};
- my $from_name = $opt{from}{name};
- my $to_name = $opt{to}{name};
- my $features = $opt{features};
+ my $from_dt = $opt{from}->dep // $opt{from}->arr;
+ my $to_dt = $opt{to}->arr // $opt{to}->dep;
+ my $from_name = $opt{from}->loc->name;
+ my $to_name = $opt{to}->loc->name;
+ my $route = $opt{route};
+ my $polyline = $opt{polyline};
my @train_positions;
@@ -153,34 +80,32 @@ sub estimate_train_positions {
my @completion_ratios
= map { ( $time_complete + ( $_ * 2 ) ) / $time_total } ( 0 .. 45 );
- my $geo = Geo::Distance->new;
+ my $distance = GIS::Distance->new;
my ( $from_index, $to_index )
- = get_route_indexes( $features, $from_name, $to_name );
+ = get_route_indexes( $polyline, $from_name, $to_name );
if ( defined $from_index and defined $to_index ) {
my $total_distance = 0;
for my $j ( $from_index + 1 .. $to_index ) {
- my $prev = $features->[ $j - 1 ]{geometry}{coordinates};
- my $this = $features->[$j]{geometry}{coordinates};
+ my $prev = $polyline->[ $j - 1 ];
+ my $this = $polyline->[$j];
if ( $prev and $this ) {
- $total_distance += $geo->distance(
- 'kilometer', $prev->[0], $prev->[1],
- $this->[0], $this->[1]
- );
+ $total_distance
+ += $distance->distance_metal( $prev->{lat}, $prev->{lon},
+ $this->{lat}, $this->{lon} );
}
}
my @marker_distances = map { $total_distance * $_ } @completion_ratios;
$total_distance = 0;
for my $j ( $from_index + 1 .. $to_index ) {
- my $prev = $features->[ $j - 1 ]{geometry}{coordinates};
- my $this = $features->[$j]{geometry}{coordinates};
+ my $prev = $polyline->[ $j - 1 ];
+ my $this = $polyline->[$j];
if ( $prev and $this ) {
my $prev_distance = $total_distance;
- $total_distance += $geo->distance(
- 'kilometer', $prev->[0], $prev->[1],
- $this->[0], $this->[1]
- );
+ $total_distance
+ += $distance->distance_metal( $prev->{lat}, $prev->{lon},
+ $this->{lat}, $this->{lon} );
for my $i ( @train_positions .. $#marker_distances ) {
my $marker_distance = $marker_distances[$i];
if ( $total_distance > $marker_distance ) {
@@ -192,10 +117,10 @@ sub estimate_train_positions {
/ ( $total_distance - $prev_distance );
}
- my $lat = $prev->[1]
- + ( $this->[1] - $prev->[1] ) * $sub_ratio;
- my $lon = $prev->[0]
- + ( $this->[0] - $prev->[0] ) * $sub_ratio;
+ my $lat = $prev->{lat}
+ + ( $this->{lat} - $prev->{lat} ) * $sub_ratio;
+ my $lon = $prev->{lon}
+ + ( $this->{lon} - $prev->{lon} ) * $sub_ratio;
push( @train_positions, [ $lat, $lon ] );
}
@@ -210,16 +135,23 @@ sub estimate_train_positions {
}
}
else {
+ $self->log->debug(
+ "Did not find route indexes for $from_name → $to_name");
+ $self->log->debug(
+"Falling back to $opt{from}{lat} $opt{from}{lon} → $opt{to}{lat} $opt{to}{lon}"
+ );
for my $ratio (@completion_ratios) {
my $lat
- = $opt{from}{lat} + ( $opt{to}{lat} - $opt{from}{lat} ) * $ratio;
+ = $opt{from}->loc->lat
+ + ( $opt{to}->loc->lat - $opt{from}->loc->lat ) * $ratio;
my $lon
- = $opt{from}{lon} + ( $opt{to}{lon} - $opt{from}{lon} ) * $ratio;
+ = $opt{from}->loc->lon
+ + ( $opt{to}->loc->lon - $opt{from}->loc->lon ) * $ratio;
push( @train_positions, [ $lat, $lon ] );
}
return @train_positions;
}
- return [ $opt{to}{lat}, $opt{to}{lon} ];
+ return [ $opt{to}->loc->lat, $opt{to}->loc->lon ];
}
# Input:
@@ -230,7 +162,7 @@ sub estimate_train_positions {
# name: str
# arr: DateTime
# dep: DateTime
-# features: ref to transport.rest features list
+# polyline: ref to Travel::Status::DE::HAFAS::Journey polyline list
# Output:
# next_stop: {type, station}
# positions: [current position [lat, lon], 2s from now, 4s from now, ...]
@@ -241,27 +173,28 @@ sub estimate_train_positions2 {
my @train_positions;
my $next_stop;
- my $geo = Geo::Distance->new;
+ my $distance = GIS::Distance->new;
my $stop_distance_sum = 0;
my $avg_inter_stop_beeline = 0;
for my $i ( 1 .. $#route ) {
if ( not $next_stop
- and ( $route[$i]{arr} // $route[$i]{dep} )
- and ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} )
- and $now > ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} )
- and $now < ( $route[$i]{arr} // $route[$i]{dep} ) )
+ and ( $route[$i]->arr // $route[$i]->dep )
+ and ( $route[ $i - 1 ]->dep // $route[ $i - 1 ]->arr )
+ and $now > ( $route[ $i - 1 ]->dep // $route[ $i - 1 ]->arr )
+ and $now < ( $route[$i]->arr // $route[$i]->dep ) )
{
# HAFAS does not provide delays for past stops
$self->backpropagate_delay( $route[ $i - 1 ], $route[$i] );
# (current position, future positons...) in 2 second steps
- @train_positions = estimate_train_positions(
+ @train_positions = $self->estimate_train_positions(
from => $route[ $i - 1 ],
to => $route[$i],
now => $now,
- features => $opt{features},
+ route => $opt{route},
+ polyline => $opt{polyline},
);
$next_stop = {
@@ -274,18 +207,16 @@ sub estimate_train_positions2 {
and $now <= ( $route[ $i - 1 ]{dep} // $route[ $i - 1 ]{arr} ) )
{
@train_positions
- = ( [ $route[ $i - 1 ]{lat}, $route[ $i - 1 ]{lon} ] );
+ = ( [ $route[ $i - 1 ]->loc->lat, $route[ $i - 1 ]->loc->lon ] );
$next_stop = {
type => 'present',
station => $route[ $i - 1 ],
};
}
- $stop_distance_sum += $geo->distance(
- 'meter',
- $route[ $i - 1 ]{lon},
- $route[ $i - 1 ]{lat},
- $route[$i]{lon}, $route[$i]{lat}
- );
+ $stop_distance_sum += $distance->distance_metal(
+ $route[ $i - 1 ]->loc->lat, $route[ $i - 1 ]->loc->lon,
+ $route[$i]->loc->lat, $route[$i]->loc->lon
+ ) / 1000;
}
if ($#route) {
@@ -293,7 +224,7 @@ sub estimate_train_positions2 {
}
if ( @route and not $next_stop ) {
- @train_positions = ( [ $route[-1]{lat}, $route[-1]{lon} ] );
+ @train_positions = ( [ $route[-1]->loc->lat, $route[-1]->loc->lon ] );
$next_stop = {
type => 'present',
station => $route[-1]
@@ -310,161 +241,18 @@ sub estimate_train_positions2 {
};
}
-sub estimate_train_intersection {
- my (%opt) = @_;
- my @route1 = @{ $opt{routes}[0] // [] };
- my @route2 = @{ $opt{routes}[1] // [] };
-
- my $ret;
-
- my $i1 = 0;
- my $i2 = 0;
-
- my @pairs;
- my @meeting_points;
- my $geo = Geo::Distance->new;
-
- # skip last route element as we compare route[i] with route[i+1]
- while ( $i1 < $#route1 and $i2 < $#route2 ) {
- my $dep1 = $route1[$i1]{dep};
- my $arr1 = $route1[ $i1 + 1 ]{arr};
- my $dep2 = $route2[$i2]{dep};
- my $arr2 = $route2[ $i2 + 1 ]{arr};
-
- if ( not( $dep1 and $arr1 ) ) {
-
- #say "skip 1 $route1[$i1]{name}";
- $i1++;
- next;
- }
-
- if ( not( $dep2 and $arr2 ) ) {
-
- #say "skip 2 $route2[$i2]{name}";
- $i2++;
- next;
- }
-
- if ( $arr1 <= $dep2 ) {
- $i1++;
- }
- elsif ( $arr2 <= $dep1 ) {
- $i2++;
- }
- elsif ( $arr2 <= $arr1 ) {
- push( @pairs, [ $i1, $i2 ] );
- if ( $route1[$i1]{name} eq $route2[ $i2 + 1 ]{name}
- and $route2[$i2]{name} eq $route1[ $i1 + 1 ]{name} )
- {
- # both i1 name == i2+1 name and i1 name == i2 name are valid cases
- # (trains don't just intersect when they travel in opposing
- # directions -- they may also travel in the same direction
- # with different speed and overtake each other).
- # We need both stop pairs later on, so we save both.
- $ret->{stop_pair} = [
- [ $route1[$i1]{name}, $route1[ $i1 + 1 ]{name} ],
- [ $route2[$i2]{name}, $route2[ $i2 + 1 ]{name} ]
- ];
- }
- $i2++;
- }
- elsif ( $arr1 <= $arr2 ) {
- push( @pairs, [ $i1, $i2 ] );
- if ( $route1[$i1]{name} eq $route2[ $i2 + 1 ]{name}
- and $route2[$i2]{name} eq $route1[ $i1 + 1 ]{name} )
- {
- $ret->{stop_pair} = [
- [ $route1[$i1]{name}, $route1[ $i1 + 1 ]{name} ],
- [ $route2[$i2]{name}, $route2[ $i2 + 1 ]{name} ]
- ];
- }
- $i1++;
- }
- else {
- $i1++;
- }
- }
-
- for my $pair (@pairs) {
- my ( $i1, $i2 ) = @{$pair};
- my @train1_positions = estimate_timestamped_positions(
- from => $route1[$i1],
- to => $route1[ $i1 + 1 ],
- features => $opt{features}[0],
- );
- my @train2_positions = estimate_timestamped_positions(
- from => $route2[$i2],
- to => $route2[ $i2 + 1 ],
- features => $opt{features}[1],
- );
- $i1 = 0;
- $i2 = 0;
- while ( $i1 <= $#train1_positions and $i2 <= $#train2_positions ) {
- if ( $train1_positions[$i1][0] < $train2_positions[$i2][0] ) {
- $i1++;
- }
- elsif ( $train1_positions[$i2][0] < $train2_positions[$i2][0] ) {
- $i2++;
- }
- else {
- if (
- (
- my $distance = $geo->distance(
- 'kilometer',
- $train1_positions[$i1][2],
- $train1_positions[$i1][1],
- $train2_positions[$i2][2],
- $train2_positions[$i2][1]
- )
- ) < 1
- )
- {
- my $ts = DateTime->from_epoch(
- epoch => $train1_positions[$i1][0],
- time_zone => 'Europe/Berlin'
- );
- $ret->{first_meeting_time} //= $ts;
- push(
- @meeting_points,
- {
- timestamp => $ts,
- lat => (
- $train1_positions[$i1][1]
- + $train2_positions[$i2][1]
- ) / 2,
- lon => (
- $train1_positions[$i1][2]
- + $train2_positions[$i2][2]
- ) / 2,
- distance => $distance,
- }
- );
- }
- $i1++;
- $i2++;
- }
- }
- }
-
- $ret->{meeting_points} = \@meeting_points;
-
- return $ret;
-}
-
sub route_to_ajax {
my (@stopovers) = @_;
my @route_entries;
for my $stop (@stopovers) {
- my @stop_entries = ( $stop->{stop}{name} );
+ my @stop_entries = ( $stop->loc->name );
my $platform;
- if ( $stop->{arrival}
- and my $arr = $strp->parse_datetime( $stop->{arrival} ) )
- {
- my $delay = ( $stop->{arrivalDelay} // 0 ) / 60;
- $platform = $stop->{arrivalPlatform};
+ if ( my $arr = $stop->arr and not $stop->arr_cancelled ) {
+ my $delay = $stop->arr_delay // 0;
+ $platform = $stop->platform;
push( @stop_entries, $arr->epoch, $delay );
}
@@ -472,11 +260,9 @@ sub route_to_ajax {
push( @stop_entries, q{}, q{} );
}
- if ( $stop->{departure}
- and my $dep = $strp->parse_datetime( $stop->{departure} ) )
- {
- my $delay = ( $stop->{departureDelay} // 0 ) / 60;
- $platform //= $stop->{departurePlatform} // q{};
+ if ( my $dep = $stop->dep and not $stop->dep_cancelled ) {
+ my $delay = $stop->dep_delay // 0;
+ $platform //= $stop->platform // q{};
push( @stop_entries, $dep->epoch, $delay, $platform );
}
@@ -490,56 +276,6 @@ sub route_to_ajax {
return join( '|', @route_entries );
}
-# Input: List of transport.rest stopovers
-# Output: List of preprocessed stops. Each is a hash with the following keys:
-# lat: float
-# lon: float
-# name: str
-# arr: DateTime
-# dep: DateTime
-# arr_delay: int
-# dep_delay: int
-# platform: str
-sub stopovers_to_route {
- my (@stopovers) = @_;
- my @route;
-
- for my $stop (@stopovers) {
- my @stop_lines = ( $stop->{stop}{name} );
- my ( $platform, $arr, $dep, $arr_delay, $dep_delay );
-
- if ( $stop->{arrival}
- and $arr = $strp->parse_datetime( $stop->{arrival} ) )
- {
- $arr_delay = ( $stop->{arrivalDelay} // 0 ) / 60;
- $platform //= $stop->{arrivalPlatform};
- }
-
- if ( $stop->{departure}
- and $dep = $strp->parse_datetime( $stop->{departure} ) )
- {
- $dep_delay = ( $stop->{departureDelay} // 0 ) / 60;
- $platform //= $stop->{departurePlatform};
- }
-
- push(
- @route,
- {
- lat => $stop->{stop}{location}{latitude},
- lon => $stop->{stop}{location}{longitude},
- name => $stop->{stop}{name},
- arr => $arr,
- dep => $dep,
- arr_delay => $arr_delay,
- dep_delay => $dep_delay,
- platform => $platform,
- }
- );
-
- }
- return @route;
-}
-
sub polyline_to_line_pairs {
my (@polyline) = @_;
my @line_pairs;
@@ -547,138 +283,14 @@ sub polyline_to_line_pairs {
push(
@line_pairs,
[
- [ $polyline[ $i - 1 ][1], $polyline[ $i - 1 ][0] ],
- [ $polyline[$i][1], $polyline[$i][0] ]
+ [ $polyline[ $i - 1 ]{lat}, $polyline[ $i - 1 ]{lon} ],
+ [ $polyline[$i]{lat}, $polyline[$i]{lon} ]
]
);
}
return @line_pairs;
}
-sub intersection {
- my ($self) = @_;
-
- my @trips = split( qr{;}, $self->stash('trips') );
- my @trip_ids = map { [ split( qr{,}, $_ ) ] } @trips;
-
- $self->render_later;
-
- my @polyline_requests
- = map { $self->hafas->get_polyline_p( @{$_} ) } @trip_ids;
- Mojo::Promise->all(@polyline_requests)->then(
- sub {
- my ( $pl1, $pl2 ) = map { $_->[0] } @_;
- my @polyline1 = @{ $pl1->{polyline} };
- my @polyline2 = @{ $pl2->{polyline} };
- my @station_coordinates;
-
- my @markers;
- my $next_stop;
-
- my $now = DateTime->now( time_zone => 'Europe/Berlin' );
-
- my @line1_pairs = polyline_to_line_pairs(@polyline1);
- my @line2_pairs = polyline_to_line_pairs(@polyline2);
-
- my @route1
- = stopovers_to_route( @{ $pl1->{raw}{stopovers} // [] } );
- my @route2
- = stopovers_to_route( @{ $pl2->{raw}{stopovers} // [] } );
-
- my $train1_pos = $self->estimate_train_positions2(
- now => $now,
- route => \@route1,
- features => $pl1->{raw}{polyline}{features},
- );
-
- my $train2_pos = $self->estimate_train_positions2(
- now => $now,
- route => \@route2,
- features => $pl2->{raw}{polyline}{features},
- );
-
- my $intersection = estimate_train_intersection(
- routes => [ \@route1, \@route2 ],
- features => [
- $pl1->{raw}{polyline}{features},
- $pl2->{raw}{polyline}{features}
- ],
- );
-
- for my $meeting_point ( @{ $intersection->{meeting_points} } ) {
- push(
- @station_coordinates,
- [
- [ $meeting_point->{lat}, $meeting_point->{lon} ],
- [ $meeting_point->{timestamp}->strftime('%H:%M') ]
- ]
- );
- }
-
- push(
- @markers,
- {
- lat => $train1_pos->{position_now}[0],
- lon => $train1_pos->{position_now}[1],
- title => $pl1->{name}
- },
- {
- lat => $train2_pos->{position_now}[0],
- lon => $train2_pos->{position_now}[1],
- title => $pl2->{name}
- },
- );
-
- $self->render(
- 'route_map',
- title => "DBF",
- hide_opts => 1,
- with_map => 1,
- intersection => 1,
- train1_no =>
- scalar( $pl1->{raw}{line}{additionalName} // $pl1->{name} ),
- train2_no =>
- scalar( $pl2->{raw}{line}{additionalName} // $pl2->{name} ),
- likely_pair => $intersection->{stop_pair}
- ? $intersection->{stop_pair}[0]
- : undef,
- time => scalar $intersection->{first_meeting_time},
- polyline_groups => [
- {
- polylines => [ @line1_pairs, @line2_pairs ],
- color => '#ffffff',
- opacity => 0,
- fit_bounds => 1,
- },
- {
- polylines => [@line1_pairs],
- color => '#005080',
- opacity => 0.6,
- },
- {
- polylines => [@line2_pairs],
- color => '#800050',
- opacity => 0.6,
- }
- ],
- markers => [@markers],
- station_coordinates => [@station_coordinates],
- );
- }
- )->catch(
- sub {
- my ($err) = @_;
- $self->render(
- 'route_map',
- title => "DBF",
- hide_opts => 1,
- with_map => 1,
- error => $err,
- );
- }
- )->wait;
-}
-
sub backpropagate_delay {
my ( $self, $prev_stop, $next_stop ) = @_;
@@ -702,17 +314,30 @@ sub route {
my ($self) = @_;
my $trip_id = $self->stash('tripid');
my $line_no = $self->stash('lineno');
+ my $hafas = $self->param('hafas');
my $from_name = $self->param('from');
my $to_name = $self->param('to');
$self->render_later;
- $self->hafas->get_polyline_p( $trip_id, $line_no )->then(
+ my $service = 'DB';
+ if ( $hafas
+ and $hafas ne '1'
+ and Travel::Status::DE::HAFAS::get_service($hafas) )
+ {
+ $service = $hafas;
+ }
+
+ $self->hafas->get_polyline_p(
+ id => $trip_id,
+ line => $line_no,
+ service => $service
+ )->then(
sub {
- my ($pl) = @_;
+ my ($journey) = @_;
- my @polyline = @{ $pl->{polyline} };
+ my @polyline = $journey->polyline;
my @station_coordinates;
my @markers;
@@ -723,61 +348,61 @@ sub route {
# used to draw the train's journey on the map
my @line_pairs = polyline_to_line_pairs(@polyline);
- my @route = stopovers_to_route( @{ $pl->{raw}{stopovers} // [] } );
+ my @route = $journey->route;
my $train_pos = $self->estimate_train_positions2(
now => $now,
route => \@route,
- features => $pl->{raw}{polyline}{features},
+ polyline => \@polyline,
);
# Prepare from/to markers and name/time/delay overlays for stations
for my $stop (@route) {
- my @stop_lines = ( $stop->{name} );
+ my @stop_lines = ( $stop->loc->name );
- if ( $from_name and $stop->{name} eq $from_name ) {
+ if ( $from_name and $stop->loc->name eq $from_name ) {
push(
@markers,
{
- lon => $stop->{lon},
- lat => $stop->{lat},
- title => $stop->{name},
+ lon => $stop->loc->lon,
+ lat => $stop->loc->lat,
+ title => $stop->loc->name,
icon => 'goldIcon',
}
);
}
- if ( $to_name and $stop->{name} eq $to_name ) {
+ if ( $to_name and $stop->loc->name eq $to_name ) {
push(
@markers,
{
- lon => $stop->{lon},
- lat => $stop->{lat},
- title => $stop->{name},
+ lon => $stop->loc->lon,
+ lat => $stop->loc->lat,
+ title => $stop->loc->name,
icon => 'greenIcon',
}
);
}
- if ( $stop->{platform} ) {
- push( @stop_lines, 'Gleis ' . $stop->{platform} );
+ if ( $stop->platform ) {
+ push( @stop_lines, 'Gleis ' . $stop->platform );
}
- if ( $stop->{arr} ) {
- my $arr_line = $stop->{arr}->strftime('Ankunft: %H:%M');
- if ( $stop->{arr_delay} ) {
- $arr_line .= sprintf( ' (%+d)', $stop->{arr_delay} );
+ if ( $stop->arr ) {
+ my $arr_line = $stop->arr->strftime('Ankunft: %H:%M');
+ if ( $stop->arr_delay ) {
+ $arr_line .= sprintf( ' (%+d)', $stop->arr_delay );
}
push( @stop_lines, $arr_line );
}
- if ( $stop->{dep} ) {
- my $dep_line = $stop->{dep}->strftime('Abfahrt: %H:%M');
- if ( $stop->{dep_delay} ) {
- $dep_line .= sprintf( ' (%+d)', $stop->{dep_delay} );
+ if ( $stop->dep ) {
+ my $dep_line = $stop->dep->strftime('Abfahrt: %H:%M');
+ if ( $stop->dep_delay ) {
+ $dep_line .= sprintf( ' (%+d)', $stop->dep_delay );
}
push( @stop_lines, $dep_line );
}
push( @station_coordinates,
- [ [ $stop->{lat}, $stop->{lon} ], [@stop_lines], ] );
+ [ [ $stop->loc->lat, $stop->loc->lon ], [@stop_lines], ] );
}
push(
@@ -785,34 +410,33 @@ sub route {
{
lat => $train_pos->{position_now}[0],
lon => $train_pos->{position_now}[1],
- title => $pl->{name}
+ title => $journey->name
}
);
$next_stop = $train_pos->{next_stop};
$self->render(
'route_map',
- title => $pl->{name},
- hide_opts => 1,
- with_map => 1,
- ajax_req => "${trip_id}/${line_no}",
- ajax_route => route_to_ajax( @{ $pl->{raw}{stopovers} // [] } ),
+ description => "Karte für " . $journey->name,
+ title => $journey->name,
+ hide_opts => 1,
+ with_map => 1,
+ ajax_req => "${trip_id}/${line_no}",
+ ajax_route => route_to_ajax( $journey->route ),
ajax_polyline => join( '|',
map { join( ';', @{$_} ) } @{ $train_pos->{positions} } ),
origin => {
- name => $pl->{raw}{origin}{name},
- ts => $pl->{raw}{departure}
- ? scalar $strp->parse_datetime( $pl->{raw}{departure} )
- : undef,
+ name => ( $journey->route )[0]->loc->name,
+ ts => ( $journey->route )[0]->dep,
},
destination => {
- name => $pl->{raw}{destination}{name},
- ts => $pl->{raw}{arrival}
- ? scalar $strp->parse_datetime( $pl->{raw}{arrival} )
- : undef,
+ name => $journey->route_end,
+ ts => ( $journey->route )[-1]->arr,
},
- train_no => scalar $pl->{raw}{line}{additionalName},
- operator => scalar $pl->{raw}{line}{operator}{name},
+ train_no => $journey->number
+ ? ( $journey->type . ' ' . $journey->number )
+ : undef,
+ operator => $journey->operator,
next_stop => $next_stop,
polyline_groups => [
{
@@ -823,7 +447,7 @@ sub route {
}
],
station_coordinates => [@station_coordinates],
- station_radius =>
+ station_radius =>
( $train_pos->{avg_inter_stop_beeline} > 500 ? 250 : 100 ),
markers => [@markers],
);
@@ -847,44 +471,56 @@ sub ajax_route {
my ($self) = @_;
my $trip_id = $self->stash('tripid');
my $line_no = $self->stash('lineno');
+ my $hafas = $self->param('hafas');
delete $self->stash->{layout};
$self->render_later;
- $self->hafas->get_polyline_p( $trip_id, $line_no )->then(
+ my $service = 'DB';
+ if ( $hafas
+ and $hafas ne '1'
+ and Travel::Status::DE::HAFAS::get_service($hafas) )
+ {
+ $service = $hafas;
+ }
+
+ $self->hafas->get_polyline_p(
+ id => $trip_id,
+ line => $line_no,
+ service => $service
+ )->then(
sub {
- my ($pl) = @_;
+ my ($journey) = @_;
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
- my @route = stopovers_to_route( @{ $pl->{raw}{stopovers} // [] } );
+ my @route = $journey->route;
+ my @polyline = $journey->polyline;
my $train_pos = $self->estimate_train_positions2(
now => $now,
route => \@route,
- features => $pl->{raw}{polyline}{features},
+ polyline => \@polyline,
);
- my @polyline = @{ $pl->{polyline} };
$self->render(
'_map_infobox',
- ajax_req => "${trip_id}/${line_no}",
- ajax_route => route_to_ajax( @{ $pl->{raw}{stopovers} // [] } ),
+ ajax_req => "${trip_id}/${line_no}",
+ ajax_route => route_to_ajax(@route),
ajax_polyline => join( '|',
map { join( ';', @{$_} ) } @{ $train_pos->{positions} } ),
origin => {
- name => $pl->{raw}{origin}{name},
- ts => $pl->{raw}{departure}
- ? scalar $strp->parse_datetime( $pl->{raw}{departure} )
- : undef,
+ name => ( $journey->route )[0]->loc->name,
+ ts => ( $journey->route )[0]->dep,
},
destination => {
- name => $pl->{raw}{destination}{name},
- ts => $pl->{raw}{arrival}
- ? scalar $strp->parse_datetime( $pl->{raw}{arrival} )
- : undef,
+ name => $journey->route_end,
+ ts => ( $journey->route )[-1]->arr,
},
+ train_no => $journey->number
+ ? ( $journey->type . ' ' . $journey->number )
+ : undef,
next_stop => $train_pos->{next_stop},
);
}
@@ -899,78 +535,4 @@ sub ajax_route {
)->wait;
}
-sub search {
- my ($self) = @_;
-
- my $t1 = $self->param('train1');
- my $t2 = $self->param('train2');
-
- my $t1_data;
- my $t2_data;
-
- my @requests;
-
- if ( not( $t1 and $t1 =~ m{^\S+\s+\d+$} )
- or ( $t2 and not $t2 =~ m{^\S+\s+\d+$} ) )
- {
- $self->render(
- 'trainsearch',
- title => 'Fahrtverlauf',
- hide_opts => 1,
- error => $t1
- ? "Züge müssen im Format 'Zugtyp Nummer' angegeben werden, z.B. 'RE 1234'"
- : undef,
- );
- return;
- }
-
- $self->render_later;
-
- push( @requests, $self->hafas->trainsearch_p( train_no => $t1 ) );
-
- if ($t2) {
- push( @requests, $self->hafas->trainsearch_p( train_no => $t2 ) );
- }
-
- Mojo::Promise->all(@requests)->then(
- sub {
- my ( $t1_data, $t2_data ) = @_;
-
- if ($t2_data) {
- $self->redirect_to(
- sprintf(
- "/intersection/%s,0;%s,0",
- $t1_data->[0]{trip_id},
- $t2_data->[0]{trip_id},
- )
- );
- }
- else {
- $self->redirect_to(
- sprintf( "/map/%s/0", $t1_data->[0]{trip_id}, ) );
- }
- }
- )->catch(
- sub {
- my ($err) = @_;
- $self->render(
- 'trainsearch',
- title => 'Fahrtverlauf',
- hide_opts => 1,
- error => $err
- );
- }
- )->wait;
-}
-
-sub search_form {
- my ($self) = @_;
-
- $self->render(
- 'trainsearch',
- title => 'Fahrtverlauf',
- hide_opts => 1,
- );
-}
-
1;
diff --git a/lib/DBInfoscreen/Controller/Static.pm b/lib/DBInfoscreen/Controller/Static.pm
index 16eeb9a..927bf6e 100644
--- a/lib/DBInfoscreen/Controller/Static.pm
+++ b/lib/DBInfoscreen/Controller/Static.pm
@@ -1,6 +1,6 @@
package DBInfoscreen::Controller::Static;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -11,34 +11,6 @@ my %default = (
admode => 'deparr',
);
-sub redirect {
- my ($self) = @_;
- my $input = $self->param('input');
- my $params = $self->req->params;
-
- $params->remove('input');
-
- for my $param (qw(platforms mode admode via)) {
- if (
- not $params->param($param)
- or ( exists $default{$param}
- and $params->param($param) eq $default{$param} )
- )
- {
- $params->remove($param);
- }
- }
-
- $params = $params->to_string;
-
- if ( $input =~ m{ ^ [a-zA-Z]{1,5} \s+ \d+ $ }x ) {
- $self->redirect_to("/z/${input}?${params}");
- }
- else {
- $self->redirect_to("/${input}?${params}");
- }
-}
-
sub geostop {
my ($self) = @_;
@@ -49,23 +21,12 @@ sub geostop {
);
}
-sub geotrain {
- my ($self) = @_;
-
- $self->render(
- 'geotrain',
- with_geotrain => 1,
- hide_opts => 1
- );
-}
-
sub about {
my ($self) = @_;
$self->render(
'about',
hide_opts => 1,
- version => $self->config->{version}
);
}
diff --git a/lib/DBInfoscreen/Controller/Stationboard.pm b/lib/DBInfoscreen/Controller/Stationboard.pm
index 77f3a7d..6006a15 100644
--- a/lib/DBInfoscreen/Controller/Stationboard.pm
+++ b/lib/DBInfoscreen/Controller/Stationboard.pm
@@ -1,6 +1,6 @@
package DBInfoscreen::Controller::Stationboard;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -8,30 +8,101 @@ use Mojo::Base 'Mojolicious::Controller';
use DateTime;
use DateTime::Format::Strptime;
-use Encode qw(decode encode);
-use File::Slurp qw(read_file write_file);
-use List::Util qw(max uniq);
+use Encode qw(decode encode);
+use File::Slurp qw(read_file write_file);
+use List::Util qw(max uniq);
+use List::UtilsBy qw(uniq_by);
use List::MoreUtils qw();
-use Mojo::JSON qw(decode_json);
+use Mojo::JSON qw(decode_json encode_json);
use Mojo::Promise;
+use Mojo::UserAgent;
+use Travel::Status::DE::DBWagenreihung;
+use Travel::Status::DE::HAFAS;
use Travel::Status::DE::IRIS;
use Travel::Status::DE::IRIS::Stations;
use XML::LibXML;
use utf8;
-no if $] >= 5.018, warnings => 'experimental::smartmatch';
-
my %default = (
mode => 'app',
admode => 'deparr',
);
+sub class_to_product {
+ my ( $self, $hafas ) = @_;
+
+ my $bits = $hafas->get_active_service->{productbits};
+ my $ret;
+
+ for my $i ( 0 .. $#{$bits} ) {
+ $ret->{ 2**$i }
+ = ref( $bits->[$i] ) eq 'ARRAY' ? $bits->[$i][0] : $bits->[$i];
+ }
+
+ return $ret;
+}
+
sub handle_no_results {
- my ( $self, $station, $data ) = @_;
+ my ( $self, $station, $data, $hafas ) = @_;
my $errstr = $data->{errstr};
+ if ($hafas) {
+ $self->render_later;
+ my $service = 'DB';
+ if ( $hafas ne '1' and Travel::Status::DE::HAFAS::get_service($hafas) )
+ {
+ $service = $hafas;
+ }
+ Travel::Status::DE::HAFAS->new_p(
+ locationSearch => $station,
+ service => $service,
+ promise => 'Mojo::Promise',
+ user_agent => $self->ua,
+ )->then(
+ sub {
+ my ($status) = @_;
+ my @candidates = $status->results;
+ @candidates = map { [ $_->name, $_->eva ] } @candidates;
+ if ( @candidates == 1 and $candidates[0][0] ne $station ) {
+ my $s = $candidates[0][0];
+ my $params = $self->req->params->to_string;
+ $self->redirect_to("/${s}?${params}");
+ return;
+ }
+ for my $candidate (@candidates) {
+ $candidate->[0] =~ s{[&]#x0028;}{(}g;
+ $candidate->[0] =~ s{[&]#x0029;}{)}g;
+ }
+ my $err;
+ if ( not $errstr =~ m{LOCATION} ) {
+ $err = $errstr;
+ }
+ $self->render(
+ 'landingpage',
+ error => $err,
+ stationlist => \@candidates,
+ hide_opts => 0,
+ status => $data->{status} // 300,
+ );
+ return;
+ }
+ )->catch(
+ sub {
+ my ($err) = @_;
+ $self->render(
+ 'landingpage',
+ error => ( $err // "Keine Abfahrten an '$station'" ),
+ hide_opts => 0,
+ status => $data->{status} // 500,
+ );
+ return;
+ }
+ )->wait;
+ return;
+ }
+
my @candidates = map { [ $_->[1], $_->[0] ] }
Travel::Status::DE::IRIS::Stations::get_station($station);
if (
@@ -45,7 +116,7 @@ sub handle_no_results {
'landingpage',
stationlist => \@candidates,
hide_opts => 0,
- status => 300,
+ status => $data->{status} // 300,
);
return;
}
@@ -55,14 +126,16 @@ sub handle_no_results {
'landingpage',
error => ( $errstr // "Keine Abfahrten an '$station'" )
. '. Das von DBF genutzte IRIS-Backend unterstützt im Regelfall nur innerdeutsche Zugfahrten.',
- hide_opts => 0
+ hide_opts => 0,
+ status => $data->{status} // 200,
);
return;
}
$self->render(
'landingpage',
error => ( $errstr // "Keine Abfahrten an '$station'" ),
- hide_opts => 0
+ hide_opts => 0,
+ status => $data->{status} // 404,
);
return;
}
@@ -76,13 +149,10 @@ sub handle_no_results_json {
$self->res->headers->access_control_allow_origin(q{*});
my $json;
if ($errstr) {
- $json = $self->render_to_string(
- json => {
- api_version => $api_version,
- version => $self->config->{version},
- error => $errstr,
- }
- );
+ $json = {
+ api_version => $api_version,
+ error => $errstr,
+ };
}
else {
my @candidates = map { { code => $_->[0], name => $_->[1] } }
@@ -90,35 +160,30 @@ sub handle_no_results_json {
if ( @candidates > 1
or ( @candidates == 1 and $candidates[0]{code} ne $station ) )
{
- $json = $self->render_to_string(
- json => {
- api_version => $api_version,
- version => $self->config->{version},
- error => 'ambiguous station code/name',
- candidates => \@candidates,
- }
- );
+ $json = {
+ api_version => $api_version,
+ error => 'ambiguous station code/name',
+ candidates => \@candidates,
+ };
}
else {
- $json = $self->render_to_string(
- json => {
- api_version => $api_version,
- version => $self->config->{version},
- error => ( $errstr // "Got no results for '$station'" )
- }
- );
+ $json = {
+ api_version => $api_version,
+ error => ( $errstr // "Got no results for '$station'" )
+ };
}
}
if ($callback) {
+ $json = $self->render_to_string( json => $json );
$self->render(
data => "$callback($json);",
- format => 'json'
+ format => 'json',
);
}
else {
$self->render(
- data => $json,
- format => 'json'
+ json => $json,
+ status => $data->{status} // 300,
);
}
return;
@@ -166,7 +231,9 @@ sub result_has_train_type {
sub result_has_via {
my ( $result, $via ) = @_;
- my @route = $result->route_post;
+ my @route
+ = $result->can('route_post') ? $result->route_post : map { $_->loc->name }
+ $result->route;
my $eq_result = List::MoreUtils::any { lc eq lc($via) } @route;
@@ -191,22 +258,111 @@ sub result_has_via {
}
sub log_api_access {
+ my ($suffix) = @_;
+ $suffix //= q{};
+
+ my $file = "$ENV{DBFAKEDISPLAY_STATS}${suffix}";
my $counter = 1;
- if ( -r $ENV{DBFAKEDISPLAY_STATS} ) {
- $counter = read_file( $ENV{DBFAKEDISPLAY_STATS} ) + 1;
+ if ( -r $file ) {
+ $counter = read_file($file) + 1;
}
- write_file( $ENV{DBFAKEDISPLAY_STATS}, $counter );
+ write_file( $file, $counter );
return;
}
-sub get_results_for {
- my ( $station, %opt ) = @_;
+sub json_route_diff {
+ my ( $self, $route, $sched_route ) = @_;
+ my @json_route;
+ my @route = @{$route};
+ my @sched_route = @{$sched_route};
+
+ my $route_idx = 0;
+ my $sched_idx = 0;
+
+ while ( $route_idx <= $#route and $sched_idx <= $#sched_route ) {
+ if ( $route[$route_idx] eq $sched_route[$sched_idx] ) {
+ push( @json_route, { name => $route[$route_idx] } );
+ $route_idx++;
+ $sched_idx++;
+ }
+
+ # this branch is inefficient, but won't be taken frequently
+ elsif (
+ not(
+ List::MoreUtils::any { $route[$route_idx] eq $_ }
+ @sched_route
+ )
+ )
+ {
+ push(
+ @json_route,
+ {
+ name => $route[$route_idx],
+ isAdditional => 1
+ }
+ );
+ $route_idx++;
+ }
+ else {
+ push(
+ @json_route,
+ {
+ name => $sched_route[$sched_idx],
+ isCancelled => 1
+ }
+ );
+ $sched_idx++;
+ }
+ }
+ while ( $route_idx <= $#route ) {
+ push(
+ @json_route,
+ {
+ name => $route[$route_idx],
+ isAdditional => 1,
+ isCancelled => 0
+ }
+ );
+ $route_idx++;
+ }
+ while ( $sched_idx <= $#sched_route ) {
+ push(
+ @json_route,
+ {
+ name => $sched_route[$sched_idx],
+ isAdditional => 0,
+ isCancelled => 1
+ }
+ );
+ $sched_idx++;
+ }
+ return @json_route;
+}
+
+sub get_results_p {
+ my ( $self, $station, %opt ) = @_;
my $data;
- # Cache::File has UTF-8 problems, so strip it (and any other potentially
- # problematic chars).
- my $cache_str = $station;
- $cache_str =~ tr{[0-9a-zA-Z -]}{}cd;
+ if ( $opt{hafas} ) {
+ my $service = 'DB';
+ if ( $opt{hafas} ne '1'
+ and Travel::Status::DE::HAFAS::get_service( $opt{hafas} ) )
+ {
+ $service = $opt{hafas};
+ }
+ return Travel::Status::DE::HAFAS->new_p(
+ service => $service,
+ station => $station,
+ arrivals => $opt{arrivals},
+ cache => $opt{cache_iris_rt},
+ lwp_options => {
+ timeout => 10,
+ agent => 'dbf.finalrewind.org/2'
+ },
+ promise => 'Mojo::Promise',
+ user_agent => $self->ua,
+ );
+ }
if ( $ENV{DBFAKEDISPLAY_STATS} ) {
log_api_access();
@@ -217,9 +373,16 @@ sub get_results_for {
# if we have an exact match. Ask the backend otherwise.
my @station_matches
= Travel::Status::DE::IRIS::Stations::get_station($station);
+
+ # Requests with EVA codes can be handled even if we do not know about them.
+ if ( @station_matches != 1 and $station =~ m{^\d+$} ) {
+ @station_matches = ( [ undef, undef, $station ] );
+ }
+
if ( @station_matches == 1 ) {
- $station = $station_matches[0][0];
- my $status = Travel::Status::DE::IRIS->new(
+ $station = $station_matches[0][2];
+ return Travel::Status::DE::IRIS->new_p(
+ iris_base => $ENV{DBFAKEDISPLAY_IRIS_BASE},
station => $station,
main_cache => $opt{cache_iris_main},
realtime_cache => $opt{cache_iris_rt},
@@ -229,31 +392,19 @@ sub get_results_for {
timeout => 10,
agent => 'dbf.finalrewind.org/2'
},
+ promise => 'Mojo::Promise',
+ user_agent => Mojo::UserAgent->new,
+ get_station => \&Travel::Status::DE::IRIS::Stations::get_station,
+ meta => Travel::Status::DE::IRIS::Stations::get_meta(),
%opt
);
- $data = {
- results => [ $status->results ],
- errstr => $status->errstr,
- station_ds100 =>
- ( $status->station ? $status->station->{ds100} : undef ),
- station_name =>
- ( $status->station ? $status->station->{name} : $station ),
- };
}
elsif ( @station_matches > 1 ) {
- $data = {
- results => [],
- errstr => 'Ambiguous station name',
- };
+ return Mojo::Promise->reject('Ambiguous station name');
}
else {
- $data = {
- results => [],
- errstr => 'Unknown station name',
- };
+ return Mojo::Promise->reject('Unknown station name');
}
-
- return $data;
}
sub handle_request {
@@ -261,11 +412,13 @@ sub handle_request {
my $station = $self->stash('station');
my $template = $self->param('mode') // 'app';
+ my $hafas = $self->param('hafas');
my $with_related = !$self->param('no_related');
my %opt = (
cache_iris_main => $self->app->cache_iris_main,
cache_iris_rt => $self->app->cache_iris_rt,
- lookahead => $self->config->{lookahead}
+ lookahead => $self->config->{lookahead},
+ hafas => $hafas,
);
if ( $self->param('past') ) {
@@ -274,13 +427,22 @@ sub handle_request {
$opt{lookahead} += 60;
}
+ if ( $self->param('admode') and $self->param('admode') eq 'arr' ) {
+ $opt{arrivals} = 1;
+ }
+
my $api_version = $Travel::Status::DE::IRIS::VERSION;
$self->stash( departures => [] );
$self->stash( title => 'DBF' );
- $self->stash( version => $self->config->{version} );
- if ( not( $template ~~ [qw[app infoscreen json multi single text]] ) ) {
+ if (
+ not(
+ List::MoreUtils::any { $template eq $_ }
+ (qw(app infoscreen json multi single text))
+ )
+ )
+ {
$template = 'app';
}
@@ -328,26 +490,75 @@ sub handle_request {
if ( $self->param('train') and not $opt{datetime} ) {
- # request results from twenty minutes ago to avoid train details suddenly
- # becoming unavailable when its scheduled departure is reached.
+ # request results from twenty minutes ago to avoid train details suddenly
+ # becoming unavailable when its scheduled departure is reached.
$opt{datetime} = DateTime->now( time_zone => 'Europe/Berlin' )
->subtract( minutes => 20 );
$opt{lookahead} = $self->config->{lookahead} + 20;
}
- my $data = get_results_for( $station, %opt );
-
- if ( not @{ $data->{results} } and $template eq 'json' ) {
- $self->handle_no_results_json( $station, $data, $api_version );
- return;
- }
+ $self->render_later;
- if ( not @{ $data->{results} } ) {
- $self->handle_no_results( $station, $data );
- return;
- }
+ $self->get_results_p( $station, %opt )->then(
+ sub {
+ my ($status) = @_;
+ my $data = {
+ results => [ $status->results ],
+ hafas => $hafas ? $status : undef,
+ station_ds100 =>
+ ( $status->station ? $status->station->{ds100} : undef ),
+ station_eva => (
+ $status->station
+ ? ( $status->station->{uic} // $status->station->{eva} )
+ : undef
+ ),
+ station_evas =>
+ ( $status->station ? $status->station->{evas} : [] ),
+ station_name =>
+ ( $status->station ? $status->station->{name} : $station ),
+ };
+
+ if ( $status->station and $status->station->{names} ) {
+ $data->{station_name}
+ = List::Util::reduce { length($a) < length($b) ? $a : $b }
+ @{ $status->station->{names} };
+ }
- $self->handle_result($data);
+ if ( not @{ $data->{results} } and $template eq 'json' ) {
+ $self->handle_no_results_json( $station, $data, $api_version );
+ return;
+ }
+ if ( not @{ $data->{results} } ) {
+ $self->handle_no_results( $station, $data, $hafas );
+ return;
+ }
+ $self->handle_result($data);
+ }
+ )->catch(
+ sub {
+ my ($err) = @_;
+ if ( $template eq 'json' ) {
+ $self->handle_no_results_json(
+ $station,
+ {
+ errstr => $err,
+ status => ( $err =~ m{Ambiguous|LOCATION} ? 300 : 500 ),
+ },
+ $api_version
+ );
+ return;
+ }
+ $self->handle_no_results(
+ $station,
+ {
+ errstr => $err,
+ status => ( $err =~ m{Ambiguous|LOCATION} ? 300 : 500 ),
+ },
+ $hafas
+ );
+ return;
+ }
+ )->wait;
}
sub filter_results {
@@ -418,7 +629,7 @@ sub format_iris_result_info {
for my $rep ( $result->replacement_for ) {
$info = sprintf(
'Ersatzzug für %s %s %s%s',
- $rep->type, $rep->train_no,
+ $rep->type, $rep->train_no,
$info ? '+++ ' : q{}, $info // q{}
);
}
@@ -438,7 +649,7 @@ sub format_iris_result_info {
if ( $template ne 'json' ) {
push(
@{$moreinfo},
- [ 'Außerplanmäßiger Halt in', $additional_line ]
+ [ 'Außerplanmäßiger Halt in', { text => $additional_line } ]
);
}
}
@@ -448,7 +659,7 @@ sub format_iris_result_info {
$info
= 'Ohne Halt in: ' . $cancel_line . ( $info ? ' +++ ' : q{} ) . $info;
if ( $template ne 'json' ) {
- push( @{$moreinfo}, [ 'Ohne Halt in', $cancel_line ] );
+ push( @{$moreinfo}, [ 'Ohne Halt in', { text => $cancel_line } ] );
}
}
@@ -460,19 +671,21 @@ sub format_iris_result_info {
sub render_train {
my ( $self, $result, $departure, $station_name, $template ) = @_;
- $departure->{links} = [];
- $departure->{route_pre_diff} = [
- $self->json_route_diff(
- [ $result->route_pre ],
- [ $result->sched_route_pre ]
- )
- ];
- $departure->{route_post_diff} = [
- $self->json_route_diff(
- [ $result->route_post ],
- [ $result->sched_route_post ]
- )
- ];
+ $departure->{links} = [];
+ if ( $result->can('route_pre') ) {
+ $departure->{route_pre_diff} = [
+ $self->json_route_diff(
+ [ $result->route_pre ],
+ [ $result->sched_route_pre ]
+ )
+ ];
+ $departure->{route_post_diff} = [
+ $self->json_route_diff(
+ [ $result->route_post ],
+ [ $result->sched_route_post ]
+ )
+ ];
+ }
if ( not $result->has_realtime ) {
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
@@ -485,35 +698,62 @@ sub render_train {
}
my $linetype = 'bahn';
- my @classes = $result->classes;
- if ( @classes == 0 ) {
- $linetype = 'ext';
- }
- elsif ( grep { $_ eq 'S' } @classes ) {
- $linetype = 'sbahn';
+
+ if ( $result->can('classes') ) {
+ my @classes = $result->classes;
+ if ( @classes == 0 ) {
+ $linetype = 'ext';
+ }
+ elsif ( grep { $_ eq 'S' } @classes ) {
+ $linetype = 'sbahn';
+ }
+ elsif ( grep { $_ eq 'F' } @classes ) {
+ $linetype = 'fern';
+ }
}
- elsif ( grep { $_ eq 'F' } @classes ) {
- $linetype = 'fern';
+ elsif ( $result->can('class') ) {
+ if ( $result->class <= 2 ) {
+ $linetype = 'fern';
+ }
+ elsif ( $result->class == 16 ) {
+ $linetype = 'sbahn';
+ }
+ elsif ( $result->class == 32 ) {
+ $linetype = 'bus';
+ }
+ elsif ( $result->class == 128 ) {
+ $linetype = 'ubahn';
+ }
+ elsif ( $result->class == 256 ) {
+ $linetype = 'tram';
+ }
}
$self->render_later;
my $wagonorder_req = Mojo::Promise->new;
- my $utilization_req = Mojo::Promise->new;
my $occupancy_req = Mojo::Promise->new;
my $stationinfo_req = Mojo::Promise->new;
my $route_req = Mojo::Promise->new;
- my @requests = (
- $wagonorder_req, $utilization_req, $occupancy_req,
- $stationinfo_req, $route_req
- );
+ my @requests
+ = ( $wagonorder_req, $occupancy_req, $stationinfo_req, $route_req );
if ( $departure->{wr_link} ) {
- $self->wagonorder->is_available_p( $result, $departure->{wr_link} )
+ $self->wagonorder->get_p( $result->train_no, $departure->{wr_link} )
->then(
sub {
- # great!
+ my ($wr_json) = @_;
+ eval {
+ my $wr
+ = Travel::Status::DE::DBWagenreihung->new(
+ from_json => $wr_json );
+ $departure->{wr} = $wr;
+ $departure->{wr_text} = join( q{ • },
+ map { $_->{short} }
+ grep { $_->{short} } $wr->train_descriptions );
+ };
+ $departure->{wr_text} ||= 'Wagen';
return;
},
sub {
@@ -526,33 +766,12 @@ sub render_train {
return;
}
)->wait;
-
- # Looks like utilization data is only available for long-distance trains
- # – and the few regional trains which also have wagon order data (e.g.
- # around Stuttgart). Funky.
- $self->marudor->get_train_utilization( train => $result )->then(
- sub {
- my ( $first, $second ) = @_;
- $departure->{utilization} = [ $first, $second ];
- return;
- },
- sub {
- $departure->{utilization} = undef;
- return;
- }
- )->finally(
- sub {
- $utilization_req->resolve;
- return;
- }
- )->wait;
}
else {
$wagonorder_req->resolve;
- $utilization_req->resolve;
}
- $self->marudor->get_efa_occupancy(
+ $self->efa->get_efa_occupancy(
eva => $result->station_uic,
train_no => $result->train_no
)->then(
@@ -627,112 +846,78 @@ sub render_train {
}
)->wait;
- $self->hafas->get_route_timestamps_p( train => $result )->then(
- sub {
- my ( $route_ts, $route_info, $trainsearch ) = @_;
+ my %opt = ( train => $result );
- $departure->{trip_id} = $trainsearch->{trip_id};
+ #if ( $self->languages =~ m{^en} ) {
+ # $opt{language} = 'en';
+ #}
- # If a train number changes on the way, IRIS routes are incomplete,
- # whereas HAFAS data has all stops -> merge HAFAS stops into IRIS
- # stops. This is a rare case, one point where it can be observed is
- # the TGV service at Frankfurt/Karlsruhe/Mannheim.
- if ( $route_info
- and my @hafas_stations = @{ $route_info->{stations} // [] } )
- {
- if ( my @iris_stations = @{ $departure->{route_pre_diff} } ) {
- my @missing_pre;
- for my $station (@hafas_stations) {
- if (
- List::MoreUtils::any { $_->{name} eq $station }
- @iris_stations
- )
- {
- unshift(
- @{ $departure->{route_pre_diff} },
- @missing_pre
- );
- last;
+ $self->hafas->get_route_p(%opt)->then(
+ sub {
+ my ( $route, $journey ) = @_;
+
+ $departure->{trip_id} = $journey->id;
+ $departure->{operator} = $journey->operator;
+ $departure->{date} = $route->[0]{sched_dep} // $route->[0]{dep};
+
+ # Use HAFAS route as source of truth; ignore IRIS data
+ $departure->{route_pre_diff} = [];
+ $departure->{route_post_diff} = $route;
+ my $split;
+ for my $i ( 0 .. $#{ $departure->{route_post_diff} } ) {
+ if ( $departure->{route_post_diff}[$i]{name} eq $station_name )
+ {
+ $split = $i;
+ if ( my $load = $route->[$i]{load} ) {
+ if ( %{$load} ) {
+ $departure->{utilization}
+ = [ $load->{FIRST}, $load->{SECOND} ];
}
- push(
- @missing_pre,
- {
- name => $station,
- hafas => 1
- }
- );
}
+ last;
}
- if ( my @iris_stations = @{ $departure->{route_post_diff} } ) {
- my @missing_post;
- for my $station ( reverse @hafas_stations ) {
- if (
- List::MoreUtils::any { $_->{name} eq $station }
- @iris_stations
- )
- {
- push(
- @{ $departure->{route_post_diff} },
- @missing_post
- );
- last;
- }
- unshift(
- @missing_post,
- {
- name => $station,
- hafas => 1
- }
- );
- }
+ }
+
+ if ( defined $split ) {
+ for my $i ( 0 .. $split - 1 ) {
+ push(
+ @{ $departure->{route_pre_diff} },
+ shift( @{ $departure->{route_post_diff} } )
+ );
}
+
+ # remove entry for $station_name
+ shift( @{ $departure->{route_post_diff} } );
}
- if ($route_ts) {
- if ( $route_ts->{ $result->station }{rt_bogus} ) {
- #$departure->{missing_realtime} = 1;
+ my @him_messages;
+ my @him_details;
+ for my $message ( $journey->messages ) {
+ if ( $message->code ) {
+ push( @him_details,
+ [ $message->short // q{}, { text => $message->text } ]
+ );
}
- for my $elem (
- @{ $departure->{route_pre_diff} },
- @{ $departure->{route_post_diff} }
- )
- {
- for my $key ( keys %{ $route_ts->{ $elem->{name} } // {} } )
- {
- $elem->{$key} = $route_ts->{ $elem->{name} }{$key};
- }
- if ( $elem->{rt_bogus} ) {
- $departure->{partially_missing_realtime} = 1;
- }
+ else {
+ push( @him_messages,
+ [ $message->short // q{}, { text => $message->text } ]
+ );
}
}
- if ( $route_info and @{ $route_info->{messages} // [] } ) {
- my $him = $route_info->{messages};
- my @him_messages;
- $departure->{messages}{him} = $him;
- for my $message ( @{$him} ) {
- if ( $message->{display} ) {
- push( @him_messages,
- [ $message->{header}, $message->{lead} ] );
- if ( $message->{lead} =~ m{zuginfo.nrw/?\?msg=(\d+)} ) {
- push(
- @{ $departure->{links} },
- [
- "Großstörung",
- "https://zuginfo.nrw/?msg=$1"
- ]
- );
- }
- }
+ for my $m (@him_messages) {
+ if ( $m->[0] =~ s{: Information.}{:} ) {
+ $m->[1]{icon} = 'info_outline';
}
- for my $message ( @{ $departure->{moreinfo} // [] } ) {
- my $m = $message->[1];
- @him_messages
- = grep { $_->[0] !~ m{Information\. $m\.$} }
- @him_messages;
+ elsif ( $m->[0] =~ s{: Störung.}{: } ) {
+ $m->[1]{icon} = 'warning';
}
- unshift( @{ $departure->{moreinfo} }, @him_messages );
+ elsif ( $m->[0] =~ s{: Bauarbeiten.}{: } ) {
+ $m->[1]{icon} = 'build';
+ }
+ $m->[0] =~ s{(?!<)->}{ → };
}
+ unshift( @{ $departure->{moreinfo} }, @him_messages );
+ unshift( @{ $departure->{details} }, @him_details );
}
)->catch(
sub {
@@ -745,58 +930,36 @@ sub render_train {
}
)->wait;
- if ( $self->param('detailed') ) {
- my $cycle_req = Mojo::Promise->new;
- push( @requests, $cycle_req );
- $self->wagonorder->has_cycle_p( $result->train_no )->then(
- sub {
- $departure->{has_cycle} = 1;
- }
- )->catch(
- sub {
- # nop
- }
- )->finally(
- sub {
- $cycle_req->resolve;
- return;
- }
- )->wait;
- $departure->{composition}
- = $self->app->train_details_db->{ $departure->{train_no} };
- my @cycle_from;
- my @cycle_to;
- for my $cycle ( values %{ $departure->{composition}->{cycle} // {} } ) {
- push( @cycle_from, @{ $cycle->{from} // [] } );
- push( @cycle_to, @{ $cycle->{to} // [] } );
- }
- @cycle_from = sort { $a <=> $b } uniq @cycle_from;
- @cycle_to = sort { $a <=> $b } uniq @cycle_to;
- $departure->{cycle_from}
- = [ map { [ $_, $self->app->train_details_db->{$_} ] } @cycle_from ];
- $departure->{cycle_to}
- = [ map { [ $_, $self->app->train_details_db->{$_} ] } @cycle_to ];
- }
-
# Defer rendering until all requests have completed
Mojo::Promise->all(@requests)->then(
sub {
$self->render(
$template // '_train_details',
- departure => $departure,
- linetype => $linetype,
- icetype => $self->app->ice_type_map->{ $departure->{train_no} },
- details => $departure->{composition} // {},
- dt_now => DateTime->now( time_zone => 'Europe/Berlin' ),
+ description => sprintf(
+ '%s %s%s%s nach %s',
+ $departure->{train_type},
+ $departure->{train_line} // $departure->{train_no},
+ $departure->{origin} ? ' von ' : q{},
+ $departure->{origin} // q{},
+ $departure->{destination} // 'unbekannt'
+ ),
+ departure => $departure,
+ linetype => $linetype,
+ dt_now => DateTime->now( time_zone => 'Europe/Berlin' ),
station_name => $station_name,
- nav_link =>
- $self->url_for( 'station', station => $station_name )
- ->query( { detailed => $self->param('detailed') } ),
+ nav_link =>
+ $self->url_for( 'station', station => $station_name )->query(
+ {
+ detailed => $self->param('detailed'),
+ hafas => $self->param('hafas')
+ }
+ ),
);
}
)->wait;
}
+# /z/:train/*station
sub station_train_details {
my ($self) = @_;
my $train_no = $self->stash('train');
@@ -828,81 +991,105 @@ sub station_train_details {
$opt{lookahead} = $self->config->{lookahead} + 20;
}
- my $data = get_results_for( $station, %opt );
- my $errstr = $data->{errstr};
-
- if ( not @{ $data->{results} } ) {
- $self->render(
- 'landingpage',
- error => "Keine Abfahrt von $train_no in $station gefunden",
- status => 404,
- );
- return;
+ # Berlin Hbf exists twice:
+ # - BLS / 8011160
+ # - BL / 8098160 (formerly "Berlin Hbf (tief)")
+ # Right now DBF assumes that station name -> EVA / DS100 is a unique map.
+ # This is not the case. Work around it here until dbf has been adjusted
+ # properly.
+ if ( $station eq 'Berlin Hbf' ) {
+ $opt{with_related} = 1;
}
- my ($result)
- = grep { result_is_train( $_, $train_no ) } @{ $data->{results} };
-
- if ( not $result ) {
- $self->render(
- 'landingpage',
- error => "Keine Abfahrt von $train_no in $station gefunden",
- status => 404,
- );
- return;
- }
+ $self->render_later;
- my ( $info, $moreinfo ) = $self->format_iris_result_info( 'app', $result );
-
- my $result_info = {
- sched_arrival => $result->sched_arrival
- ? $result->sched_arrival->strftime('%H:%M')
- : undef,
- sched_departure => $result->sched_departure
- ? $result->sched_departure->strftime('%H:%M')
- : undef,
- arrival => $result->arrival ? $result->arrival->strftime('%H:%M')
- : undef,
- departure => $result->departure ? $result->departure->strftime('%H:%M')
- : undef,
- train_type => $result->type // '',
- train_line => $result->line_no,
- train_no => $result->train_no,
- destination => $result->destination,
- origin => $result->origin,
- platform => $result->platform,
- scheduled_platform => $result->sched_platform,
- is_cancelled => $result->is_cancelled,
- departure_is_cancelled => $result->departure_is_cancelled,
- arrival_is_cancelled => $result->arrival_is_cancelled,
- moreinfo => $moreinfo,
- delay => $result->delay,
- route_pre => [ $result->route_pre ],
- route_post => [ $result->route_post ],
- replaced_by =>
- [ map { $_->type . q{ } . $_->train_no } $result->replaced_by ],
- replacement_for =>
- [ map { $_->type . q{ } . $_->train_no } $result->replacement_for ],
- wr_link => $result->sched_departure
- ? $result->sched_departure->strftime('%Y%m%d%H%M')
- : undef,
- };
+ # Always performs an IRIS request
+ $self->get_results_p( $station, %opt )->then(
+ sub {
+ my ($status) = @_;
+ my ($result)
+ = grep { result_is_train( $_, $train_no ) } $status->results;
- $self->stash( title => $data->{station_name} // $self->stash('station') );
- $self->stash( hide_opts => 1 );
+ if ( not $result ) {
+ die("Train not found\n");
+ }
- $self->render_train(
- $result, $result_info,
- $data->{station_name} // $self->stash('station'),
- $self->param('ajax') ? '_train_details' : 'train_details'
- );
+ my ( $info, $moreinfo )
+ = $self->format_iris_result_info( 'app', $result );
+
+ my $result_info = {
+ sched_arrival => $result->sched_arrival
+ ? $result->sched_arrival->strftime('%H:%M')
+ : undef,
+ sched_departure => $result->sched_departure
+ ? $result->sched_departure->strftime('%H:%M')
+ : undef,
+ arrival => $result->arrival
+ ? $result->arrival->strftime('%H:%M')
+ : undef,
+ departure => $result->departure
+ ? $result->departure->strftime('%H:%M')
+ : undef,
+ arrival_hidden => $result->arrival_hidden,
+ departure_hidden => $result->departure_hidden,
+ train_type => $result->type // '',
+ train_line => $result->line_no,
+ train_no => $result->train_no,
+ destination => $result->destination,
+ origin => $result->origin,
+ platform => $result->platform,
+ scheduled_platform => $result->sched_platform,
+ is_cancelled => $result->is_cancelled,
+ departure_is_cancelled => $result->departure_is_cancelled,
+ arrival_is_cancelled => $result->arrival_is_cancelled,
+ moreinfo => $moreinfo,
+ delay => $result->delay,
+ route_pre => [ $result->route_pre ],
+ route_post => [ $result->route_post ],
+ replaced_by => [
+ map { $_->type . q{ } . $_->train_no } $result->replaced_by
+ ],
+ replacement_for => [
+ map { $_->type . q{ } . $_->train_no }
+ $result->replacement_for
+ ],
+ wr_link => $result->sched_departure
+ ? $result->sched_departure->strftime('%Y%m%d%H%M')
+ : undef,
+ eva => $result->station_uic,
+ start => $result->start,
+ };
+
+ $self->stash( title => $status->station->{name}
+ // $self->stash('station') );
+ $self->stash( hide_opts => 1 );
+
+ $self->render_train(
+ $result,
+ $result_info,
+ $status->station->{name} // $self->stash('station'),
+ $self->param('ajax') ? '_train_details' : 'train_details'
+ );
+ }
+ )->catch(
+ sub {
+ my ($errstr) = @_;
+ $self->render(
+ 'landingpage',
+ error =>
+ "Keine Abfahrt von $train_no in $station gefunden: $errstr",
+ status => 404,
+ );
+ return;
+ }
+ )->wait;
}
+# /z/:train
sub train_details {
my ($self) = @_;
- my $train = $self->stash('train');
-
- my ( $train_type, $train_no ) = ( $train =~ m{ ^ (\S+) \s+ (.*) $ }x );
+ my $train = $self->stash('train');
+ my $hafas = $self->param('hafas');
# TODO error handling
@@ -914,12 +1101,11 @@ sub train_details {
$self->stash( departures => [] );
$self->stash( title => 'DBF' );
- $self->stash( version => $self->config->{version} );
my $res = {
- train_type => $train_type,
+ train_type => undef,
train_line => undef,
- train_no => $train_no,
+ train_no => undef,
route_pre_diff => [],
route_post_diff => [],
moreinfo => [],
@@ -927,78 +1113,185 @@ sub train_details {
replacement_for => [],
};
- $self->stash( title => "${train_type} ${train_no}" );
- $self->stash( hide_opts => 1 );
+ my %opt;
+
+ if ( $train =~ m{[|]} ) {
+ $opt{trip_id} = $train;
+ }
+ else {
+ my ( $train_type, $train_no ) = ( $train =~ m{ ^ (\S+) \s+ (.*) $ }x );
+ $res->{train_type} = $train_type;
+ $res->{train_no} = $train_no;
+ $self->stash( title => "${train_type} ${train_no}" );
+ $opt{train_type} = $train_type;
+ $opt{train_no} = $train_no;
+ }
+ my $service = 'DB';
+ if ( $hafas ne '1' and Travel::Status::DE::HAFAS::get_service($hafas) ) {
+ $opt{service} = $hafas;
+ }
+
+ #if ( $self->languages =~ m{^en} ) {
+ # $opt{language} = 'en';
+ #}
+
+ if ( my $date = $self->param('date') ) {
+ if ( $date
+ =~ m{ ^ (?<day> \d{1,2} ) [.] (?<month> \d{1,2} ) [.] (?<year> \d{4})? $ }x
+ )
+ {
+ $opt{datetime} = DateTime->now( time_zone => 'Europe/Berlin' );
+ $opt{datetime}->set(
+ day => $+{day},
+ month => $+{month}
+ );
+ if ( $+{year} ) {
+ $opt{datetime}->set( year => $+{year} );
+ }
+ }
+ }
+
+ $self->stash( hide_opts => 1 );
$self->render_later;
my $linetype = 'bahn';
- $self->hafas->get_route_timestamps_p(
- train_req => "${train_type} $train_no" )->then(
+ $self->hafas->get_route_p(%opt)->then(
sub {
- my ( $route_ts, $route_info, $trainsearch ) = @_;
+ my ( $route, $journey, $hafas_obj ) = @_;
- $res->{trip_id} = $trainsearch->{trip_id};
+ $res->{trip_id} = $journey->id;
+ $res->{date} = $route->[0]{sched_dep} // $route->[0]{dep};
- if ( not defined $trainsearch->{trainClass} ) {
- $linetype = 'ext';
+ if ( not $res->{train_type} ) {
+ my $train_type = $res->{train_type} = $journey->type // q{};
+ my $train_no = $res->{train_no} = $journey->number // q{};
+ $res->{train_line} = $journey->line_no // q{};
+ $self->stash( title => "${train_type} ${train_no}" );
}
- elsif ( $trainsearch->{trainClass} <= 2 ) {
- $linetype = 'fern';
- }
- elsif ( $trainsearch->{trainClass} <= 8 ) {
- $linetype = 'bahn';
+
+ if ( not defined $journey->class ) {
+ $linetype = 'ext';
}
- elsif ( $trainsearch->{trainClass} <= 16 ) {
- $linetype = 'sbahn';
+ else {
+ my $prod
+ = $self->class_to_product($hafas_obj)->{ $journey->class }
+ // q{};
+ if ( $prod eq 'ice' or $prod eq 'ic_ec' ) {
+ $linetype = 'fern';
+ }
+ elsif ( $prod eq 's' ) {
+ $linetype = 'sbahn';
+ }
+ elsif ( $prod eq 'bus' ) {
+ $linetype = 'bus';
+ }
+ elsif ( $prod eq 'u' ) {
+ $linetype = 'ubahn';
+ }
+ elsif ( $prod eq 'tram' ) {
+ $linetype = 'tram';
+ }
}
- $res->{origin} = $route_info->{stations}[0];
- $res->{destination} = $route_info->{stations}[-1];
+ $res->{origin} = $journey->route_start;
+ $res->{destination} = $journey->route_end;
+ $res->{operator} = $journey->operator;
- $res->{route_post_diff}
- = [ map { { name => $_ } } @{ $route_info->{stations} } ];
+ $res->{route_post_diff} = $route;
- if ($route_ts) {
- for my $elem ( @{ $res->{route_post_diff} } ) {
- for my $key ( keys %{ $route_ts->{ $elem->{name} } // {} } )
- {
- $elem->{$key} = $route_ts->{ $elem->{name} }{$key};
+ if ( my $req_name = $self->param('highlight') ) {
+ my $split;
+ for my $i ( 0 .. $#{ $res->{route_post_diff} } ) {
+ if ( $res->{route_post_diff}[$i]{name} eq $req_name ) {
+ $split = $i;
+ last;
}
}
+ if ( defined $split ) {
+ $self->stash( station_name => $req_name );
+ for my $i ( 0 .. $split - 1 ) {
+ push(
+ @{ $res->{route_pre_diff} },
+ shift( @{ $res->{route_post_diff} } )
+ );
+ }
+ my $station_info = shift( @{ $res->{route_post_diff} } );
+ $res->{eva} = $station_info->{eva};
+ if ( $station_info->{sched_arr} ) {
+ $res->{sched_arrival}
+ = $station_info->{sched_arr}->strftime('%H:%M');
+ }
+ if ( $station_info->{rt_arr} ) {
+ $res->{arrival}
+ = $station_info->{rt_arr}->strftime('%H:%M');
+ }
+ if ( $station_info->{sched_dep} ) {
+ $res->{sched_departure}
+ = $station_info->{sched_dep}->strftime('%H:%M');
+ }
+ if ( $station_info->{rt_dep} ) {
+ $res->{departure}
+ = $station_info->{rt_dep}->strftime('%H:%M');
+ }
+ $res->{arrival_is_cancelled}
+ = $station_info->{arr_cancelled};
+ $res->{departure_is_cancelled}
+ = $station_info->{dep_cancelled};
+ $res->{is_cancelled} = $res->{arrival_is_cancelled}
+ || $res->{arrival_is_cancelled};
+ $res->{platform} = $station_info->{platform};
+ $res->{scheduled_platform}
+ = $station_info->{sched_platform};
+ }
}
- if ( $route_info and @{ $route_info->{messages} // [] } ) {
- my $him = $route_info->{messages};
- my @him_messages;
- for my $message ( @{$him} ) {
- if ( $message->{display} ) {
- push( @him_messages,
- [ $message->{header}, $message->{lead} ] );
- if ( $message->{lead} =~ m{zuginfo.nrw/?\?msg=(\d+)} ) {
- push(
- @{ $res->{links} },
- [
- "Großstörung",
- "https://zuginfo.nrw/?msg=$1"
- ]
- );
- }
- }
+ my @him_messages;
+ my @him_details;
+ for my $message ( $journey->messages ) {
+ if ( $message->code ) {
+ push( @him_details,
+ [ $message->short // q{}, { text => $message->text } ]
+ );
}
+ else {
+ push( @him_messages,
+ [ $message->short // q{}, { text => $message->text } ]
+ );
+ }
+ }
+ for my $m (@him_messages) {
+ if ( $m->[0] =~ s{: Information.}{:} ) {
+ $m->[1]{icon} = 'info_outline';
+ }
+ elsif ( $m->[0] =~ s{: Störung.}{: } ) {
+ $m->[1]{icon} = 'warning';
+ }
+ elsif ( $m->[0] =~ s{: Bauarbeiten.}{: } ) {
+ $m->[1]{icon} = 'build';
+ }
+ }
+ if (@him_messages) {
$res->{moreinfo} = [@him_messages];
}
+ if (@him_details) {
+ $res->{details} = [@him_details];
+ }
$self->render(
$self->param('ajax') ? '_train_details' : 'train_details',
+ description => sprintf(
+ '%s %s%s%s nach %s',
+ $res->{train_type},
+ $res->{train_line} // $res->{train_no},
+ $res->{origin} ? ' von ' : q{},
+ $res->{origin} // q{},
+ $res->{destination} // 'unbekannt'
+ ),
departure => $res,
linetype => $linetype,
- icetype => $self->app->ice_type_map->{ $res->{train_no} },
- details => {}, #$departure->{composition} // {},
- dt_now => DateTime->now( time_zone => 'Europe/Berlin' ),
-
- #station_name => "FIXME",#$station_name,
+ dt_now => DateTime->now( time_zone => 'Europe/Berlin' ),
);
}
)->catch(
@@ -1007,7 +1300,8 @@ sub train_details {
if ($e) {
$self->render(
'exception',
- exception => $e,
+ message => $e,
+ exception => undef,
snapshot => {}
);
}
@@ -1025,15 +1319,18 @@ sub handle_result {
my @departures;
my @platforms = split( /,/, $self->param('platforms') // q{} );
- my $template = $self->param('mode') // 'app';
+ my $template = $self->param('mode') // 'app';
my $hide_low_delay = $self->param('hidelowdelay') // 0;
- my $hide_opts = $self->param('hide_opts') // 0;
- my $show_realtime = $self->param('show_realtime') // 0;
- my $show_details = $self->param('detailed') // 0;
- my $admode = $self->param('admode') // 'deparr';
- my $apiver = $self->param('version') // 0;
- my $callback = $self->param('callback');
- my $via = $self->param('via');
+ my $hide_opts = $self->param('hide_opts') // 0;
+ my $show_realtime = $self->param('rt') // $self->param('show_realtime')
+ // 0;
+ my $show_details = $self->param('detailed') // 0;
+ my $admode = $self->param('admode') // 'deparr';
+ my $apiver = $self->param('version') // 0;
+ my $callback = $self->param('callback');
+ my $via = $self->param('via');
+ my $hafas = $self->param('hafas');
+ my $hafas_obj = $data->{hafas};
my $now = DateTime->now( time_zone => 'Europe/Berlin' );
@@ -1044,13 +1341,12 @@ sub handle_result {
if ( $template eq 'single' ) {
if ( not @platforms ) {
for my $result (@results) {
+ my $num_part
+ = $self->numeric_platform_part( $result->platform );
if (
- not( $self->numeric_platform_part( $result->platform ) ~~
- \@platforms )
- )
+ not( List::MoreUtils::any { $num_part eq $_ } @platforms ) )
{
- push( @platforms,
- $self->numeric_platform_part( $result->platform ) );
+ push( @platforms, $num_part );
}
}
@platforms = sort { $a <=> $b } @platforms;
@@ -1065,7 +1361,10 @@ sub handle_result {
}
if ($show_realtime) {
- if ( $admode eq 'arr' ) {
+ if ($hafas) {
+ @results = sort { $a->datetime <=> $b->datetime } @results;
+ }
+ elsif ( $admode eq 'arr' ) {
@results = sort {
( $a->arrival // $a->departure )
<=> ( $b->arrival // $b->departure )
@@ -1079,44 +1378,77 @@ sub handle_result {
}
}
+ my $class_to_product
+ = $hafas_obj ? $self->class_to_product($hafas_obj) : {};
+
@results = $self->filter_results(@results);
for my $result (@results) {
my $platform = ( split( qr{ }, $result->platform // '' ) )[0];
my $delay = $result->delay;
- if ( $admode eq 'arr' and not $result->arrival ) {
+ if ( $admode eq 'arr' and not $hafas and not $result->arrival ) {
next;
}
- if ( $admode eq 'dep'
+ if ( $admode eq 'dep'
+ and not $hafas
and not $result->departure )
{
next;
}
- my ( $info, $moreinfo )
- = $self->format_iris_result_info( $template, $result );
+ my ( $info, $moreinfo );
+ if ( $result->can('replacement_for') ) {
+ ( $info, $moreinfo )
+ = $self->format_iris_result_info( $template, $result );
+ }
- my $time = $result->time;
+ my $time
+ = $result->can('time')
+ ? $result->time
+ : $result->sched_datetime->strftime('%H:%M');
my $linetype = 'bahn';
- my @classes = $result->classes;
- if ( @classes == 0 ) {
- $linetype = 'ext';
- }
- elsif ( grep { $_ eq 'S' } @classes ) {
- $linetype = 'sbahn';
+ if ( $result->can('classes') ) {
+ my @classes = $result->classes;
+ if ( @classes == 0 ) {
+ $linetype = 'ext';
+ }
+ elsif ( grep { $_ eq 'S' } @classes ) {
+ $linetype = 'sbahn';
+ }
+ elsif ( grep { $_ eq 'F' } @classes ) {
+ $linetype = 'fern';
+ }
}
- elsif ( grep { $_ eq 'F' } @classes ) {
- $linetype = 'fern';
+ elsif ( $result->can('class') ) {
+ my $prod = $class_to_product->{ $result->class } // q{};
+ if ( $prod eq 'ice' or $prod eq 'ic_ec' ) {
+ $linetype = 'fern';
+ }
+ elsif ( $prod eq 's' ) {
+ $linetype = 'sbahn';
+ }
+ elsif ( $prod eq 'bus' ) {
+ $linetype = 'bus';
+ }
+ elsif ( $prod eq 'u' ) {
+ $linetype = 'ubahn';
+ }
+ elsif ( $prod eq 'tram' ) {
+ $linetype = 'tram';
+ }
}
# ->time defaults to dep, so we only need to overwrite $time
# if we want arrival times
- if ( $admode eq 'arr' ) {
+ if ( $admode eq 'arr' and not $hafas ) {
$time = $result->sched_arrival->strftime('%H:%M');
}
if ($show_realtime) {
- if ( ( $admode eq 'arr' and $result->arrival )
+ if ($hafas) {
+ $time = $result->datetime->strftime('%H:%M');
+ }
+ elsif ( ( $admode eq 'arr' and $result->arrival )
or not $result->departure )
{
$time = $result->arrival->strftime('%H:%M');
@@ -1136,8 +1468,14 @@ sub handle_result {
}
if ( $template eq 'json' ) {
- my @json_route = $self->json_route_diff( [ $result->route ],
- [ $result->sched_route ] );
+ my @json_route;
+ if ( $result->can('sched_route') ) {
+ @json_route = $self->json_route_diff( [ $result->route ],
+ [ $result->sched_route ] );
+ }
+ else {
+ @json_route = map { $_->TO_JSON } $result->route;
+ }
if ( $apiver eq '1' or $apiver eq '2' ) {
@@ -1153,29 +1491,136 @@ sub handle_result {
return;
}
else { # apiver == 3
- my ( $delay_arr, $delay_dep, $sched_arr, $sched_dep );
- if ( $result->arrival ) {
- $delay_arr = $result->arrival->subtract_datetime(
- $result->sched_arrival )->in_units('minutes');
- }
- if ( $result->departure ) {
- $delay_dep = $result->departure->subtract_datetime(
- $result->sched_departure )->in_units('minutes');
- }
- if ( $result->sched_arrival ) {
- $sched_arr = $result->sched_arrival->strftime('%H:%M');
+ if ( $result->isa('Travel::Status::DE::IRIS::Result') ) {
+ my ( $delay_arr, $delay_dep, $sched_arr, $sched_dep );
+ if ( $result->arrival ) {
+ $delay_arr = $result->arrival->subtract_datetime(
+ $result->sched_arrival )->in_units('minutes');
+ }
+ if ( $result->departure ) {
+ $delay_dep = $result->departure->subtract_datetime(
+ $result->sched_departure )->in_units('minutes');
+ }
+ if ( $result->sched_arrival ) {
+ $sched_arr = $result->sched_arrival->strftime('%H:%M');
+ }
+ if ( $result->sched_departure ) {
+ $sched_dep
+ = $result->sched_departure->strftime('%H:%M');
+ }
+ push(
+ @departures,
+ {
+ delayArrival => $delay_arr,
+ delayDeparture => $delay_dep,
+ destination => $result->destination,
+ isCancelled => $result->is_cancelled,
+ messages => {
+ delay => [
+ map {
+ {
+ timestamp => $_->[0],
+ text => $_->[1]
+ }
+ } $result->delay_messages
+ ],
+ qos => [
+ map {
+ {
+ timestamp => $_->[0],
+ text => $_->[1]
+ }
+ } $result->qos_messages
+ ],
+ },
+ missingRealtime => (
+ (
+ not $result->has_realtime
+ and $result->start < $now
+ ) ? \1 : \0
+ ),
+ platform => $result->platform,
+ route => \@json_route,
+ scheduledPlatform => $result->sched_platform,
+ scheduledArrival => $sched_arr,
+ scheduledDeparture => $sched_dep,
+ train => $result->train,
+ trainClasses => [ $result->classes ],
+ trainNumber => $result->train_no,
+ via => [ $result->route_interesting(3) ],
+ }
+ );
}
- if ( $result->sched_departure ) {
- $sched_dep = $result->sched_departure->strftime('%H:%M');
+ else {
+ push(
+ @departures,
+ {
+ delay => $result->delay,
+ direction => $result->direction,
+ destination => $result->destination,
+ isCancelled => $result->is_cancelled,
+ messages => [ $result->messages ],
+ platform => $result->platform,
+ route => \@json_route,
+ scheduledPlatform => $result->sched_platform,
+ scheduledTime => $result->sched_datetime->epoch,
+ time => $result->datetime->epoch,
+ train => $result->line,
+ trainNumber => $result->number,
+ via => [ $result->route_interesting(3) ],
+ }
+ );
}
+ }
+ }
+ elsif ( $template eq 'text' ) {
+ push(
+ @departures,
+ [
+ sprintf( '%5s %s%s',
+ $result->is_cancelled ? '--:--' : $time,
+ ( $delay and $delay > 0 ) ? q{+} : q{},
+ $delay || q{} ),
+ $result->train,
+ $result->destination,
+ $platform // q{ }
+ ]
+ );
+ }
+ else {
+ if ( $result->can('replacement_for') ) {
push(
@departures,
{
- delayArrival => $delay_arr,
- delayDeparture => $delay_dep,
- destination => $result->destination,
- isCancelled => $result->is_cancelled,
- messages => {
+ time => $time,
+ sched_arrival => $result->sched_arrival
+ ? $result->sched_arrival->strftime('%H:%M')
+ : undef,
+ sched_departure => $result->sched_departure
+ ? $result->sched_departure->strftime('%H:%M')
+ : undef,
+ arrival => $result->arrival
+ ? $result->arrival->strftime('%H:%M')
+ : undef,
+ departure => $result->departure
+ ? $result->departure->strftime('%H:%M')
+ : undef,
+ train => $result->train,
+ train_type => $result->type // '',
+ train_line => $result->line_no,
+ train_no => $result->train_no,
+ via => [ $result->route_interesting(3) ],
+ destination => $result->destination,
+ origin => $result->origin,
+ platform => $result->platform,
+ scheduled_platform => $result->sched_platform,
+ info => $info,
+ is_cancelled => $result->is_cancelled,
+ departure_is_cancelled =>
+ $result->departure_is_cancelled,
+ arrival_is_cancelled => $result->arrival_is_cancelled,
+ linetype => $linetype,
+ messages => {
delay => [
map {
{
@@ -1193,104 +1638,80 @@ sub handle_result {
} $result->qos_messages
],
},
- missingRealtime => (
- (
- not $result->has_realtime
- and $result->start < $now
- ) ? \1 : \0
+ station => $result->station,
+ moreinfo => $moreinfo,
+ delay => $delay,
+ missing_realtime => (
+ not $result->has_realtime
+ and $result->start < $now ? 1 : 0
),
- platform => $result->platform,
- route => \@json_route,
- scheduledPlatform => $result->sched_platform,
- scheduledArrival => $sched_arr,
- scheduledDeparture => $sched_dep,
- train => $result->train,
- trainClasses => [ $result->classes ],
- trainNumber => $result->train_no,
- via => [ $result->route_interesting(3) ],
+ route_pre => [ $result->route_pre ],
+ route_post => [ $result->route_post ],
+ additional_stops => [ $result->additional_stops ],
+ canceled_stops => [ $result->canceled_stops ],
+ replaced_by => [
+ map { $_->type . q{ } . $_->train_no }
+ $result->replaced_by
+ ],
+ replacement_for => [
+ map { $_->type . q{ } . $_->train_no }
+ $result->replacement_for
+ ],
+ wr_link => $result->sched_departure
+ ? $result->sched_departure->strftime('%Y%m%d%H%M')
+ : undef,
}
);
}
- }
- elsif ( $template eq 'text' ) {
- push(
- @departures,
- [
- sprintf( '%5s %s%s',
- $result->is_cancelled ? '--:--' : $time,
- ( $delay and $delay > 0 ) ? q{+} : q{},
- $delay || q{} ),
- $result->train,
- $result->destination,
- $platform // q{ }
- ]
- );
- }
- else {
- push(
- @departures,
- {
- time => $time,
- sched_arrival => $result->sched_arrival
- ? $result->sched_arrival->strftime('%H:%M')
- : undef,
- sched_departure => $result->sched_departure
- ? $result->sched_departure->strftime('%H:%M')
- : undef,
- arrival => $result->arrival
- ? $result->arrival->strftime('%H:%M')
- : undef,
- departure => $result->departure
- ? $result->departure->strftime('%H:%M')
- : undef,
- train => $result->train,
- train_type => $result->type // '',
- train_line => $result->line_no,
- train_no => $result->train_no,
- via => [ $result->route_interesting(3) ],
- destination => $result->destination,
- origin => $result->origin,
- platform => $result->platform,
- scheduled_platform => $result->sched_platform,
- info => $info,
- is_cancelled => $result->is_cancelled,
- departure_is_cancelled => $result->departure_is_cancelled,
- arrival_is_cancelled => $result->arrival_is_cancelled,
- linetype => $linetype,
- messages => {
- delay => [
- map { { timestamp => $_->[0], text => $_->[1] } }
- $result->delay_messages
- ],
- qos => [
- map { { timestamp => $_->[0], text => $_->[1] } }
- $result->qos_messages
- ],
- },
- station => $result->station,
- moreinfo => $moreinfo,
- delay => $delay,
- missing_realtime => (
- not $result->has_realtime
- and $result->start < $now ? 1 : 0
- ),
- route_pre => [ $result->route_pre ],
- route_post => [ $result->route_post ],
- additional_stops => [ $result->additional_stops ],
- canceled_stops => [ $result->canceled_stops ],
- replaced_by => [
- map { $_->type . q{ } . $_->train_no }
- $result->replaced_by
- ],
- replacement_for => [
- map { $_->type . q{ } . $_->train_no }
- $result->replacement_for
- ],
- wr_link => $result->sched_departure
- ? $result->sched_departure->strftime('%Y%m%d%H%M')
- : undef,
+ else {
+ my $city = q{};
+ if ( $result->station =~ m{ , ([^,]+) $ }x ) {
+ $city = $1;
}
- );
+ push(
+ @departures,
+ {
+ time => $time,
+ sched_departure =>
+ ( $result->sched_datetime and $admode ne 'arr' )
+ ? $result->sched_datetime->strftime('%H:%M')
+ : undef,
+ departure =>
+ ( $result->rt_datetime and $admode ne 'arr' )
+ ? $result->rt_datetime->strftime('%H:%M')
+ : undef,
+ train => $result->name,
+ train_type => q{},
+ train_line => $result->line,
+ train_no => $result->number,
+ journey_id => $result->id,
+ via => [
+ map { $_->loc->name =~ s{,\Q$city\E}{}r }
+ $result->route_interesting(3)
+ ],
+ destination => $result->route_end =~ s{,\Q$city\E}{}r,
+ origin => $result->route_end =~ s{,\Q$city\E}{}r,
+ platform => $result->platform,
+ scheduled_platform => $result->sched_platform,
+ info => $info,
+ is_cancelled => $result->is_cancelled,
+ linetype => $linetype,
+ station => $result->station,
+ moreinfo => $moreinfo,
+ delay => $delay,
+ replaced_by => [],
+ replacement_for => [],
+ route_pre => $admode eq 'arr'
+ ? [ map { $_->loc->name } $result->route ]
+ : [],
+ route_post => $admode eq 'arr' ? []
+ : [ map { $_->loc->name } $result->route ],
+ wr_link => $result->sched_datetime
+ ? $result->sched_datetime->strftime('%Y%m%d%H%M')
+ : undef,
+ }
+ );
+ }
if ( $self->param('train') ) {
$self->render_train( $result, $departures[-1],
$data->{station_name} // $self->stash('station') );
@@ -1301,12 +1722,11 @@ sub handle_result {
if ( $template eq 'json' ) {
$self->res->headers->access_control_allow_origin(q{*});
- my $json = $self->render_to_string(
- json => {
- departures => \@departures,
- }
- );
+ my $json = {
+ departures => \@departures,
+ };
if ($callback) {
+ $json = $self->render_to_string( json => $json );
$self->render(
data => "$callback($json);",
format => 'json'
@@ -1314,8 +1734,7 @@ sub handle_result {
}
else {
$self->render(
- data => $json,
- format => 'json'
+ json => $json,
);
}
}
@@ -1338,14 +1757,40 @@ sub handle_result {
}
else {
my $station_name = $data->{station_name} // $self->stash('station');
+ my ( $api_link, $api_text, $api_icon );
+ my $params = $self->req->params->clone;
+ $params->param( hafas => not $params->param('hafas') );
+ if ( $params->param('hafas') ) {
+ if ( $data->{station_eva} >= 8100000
+ and $data->{station_eva} < 8200000 )
+ {
+ $params->param( hafas => 'ÖBB' );
+ }
+ $api_link = '/' . $data->{station_eva} . '?' . $params->to_string;
+ $api_text = 'Auf Nahverkehr wechseln';
+ $api_icon = 'train';
+ }
+ else {
+ my $iris_eva = List::Util::min grep { $_ >= 1000000 }
+ @{ $data->{station_evas} // [] };
+ if ($iris_eva) {
+ $api_link = '/' . $iris_eva . '?' . $params->to_string;
+ $api_text = 'Auf Bahnverkehr wechseln';
+ $api_icon = 'directions';
+ }
+ }
$self->render(
$template,
+ description => 'Abfahrtstafel '
+ . ( $via ? "$station_name via $via" : $station_name ),
+ api_link => $api_link,
+ api_text => $api_text,
+ api_icon => $api_icon,
departures => \@departures,
- ice_type => $self->app->ice_type_map,
station => $station_name,
version => $self->config->{version},
title => $via ? "$station_name → $via" : $station_name,
- refresh_interval => $template eq 'app' ? 0 : 120,
+ refresh_interval => $template eq 'app' ? 0 : 120,
hide_opts => $hide_opts,
hide_low_delay => $hide_low_delay,
show_realtime => $show_realtime,
@@ -1354,8 +1799,13 @@ sub handle_result {
or $template eq 'multi'
),
force_mobile => ( $template eq 'app' ),
- nav_link => $self->url_for( 'station', station => $station_name )
- ->query( { detailed => $self->param('detailed') } ),
+ nav_link =>
+ $self->url_for( 'station', station => $station_name )->query(
+ {
+ detailed => $self->param('detailed'),
+ hafas => $self->param('hafas')
+ }
+ ),
);
}
return;
@@ -1369,24 +1819,138 @@ sub stations_by_coordinates {
if ( not $lon or not $lat ) {
$self->render( json => { error => 'Invalid lon/lat received' } );
+ return;
}
- else {
- my @candidates = map {
- {
- ds100 => $_->[0][0],
- name => $_->[0][1],
- eva => $_->[0][2],
- lon => $_->[0][3],
- lat => $_->[0][4],
- distance => $_->[1],
- }
- } Travel::Status::DE::IRIS::Stations::get_station_by_location( $lon,
- $lat, 10 );
- $self->render(
- json => {
- candidates => [@candidates],
+
+ $self->render_later;
+
+ my @iris = map {
+ {
+ ds100 => $_->[0][0],
+ name => $_->[0][1],
+ eva => $_->[0][2],
+ lon => $_->[0][3],
+ lat => $_->[0][4],
+ distance => $_->[1],
+ hafas => 0,
+ }
+ } Travel::Status::DE::IRIS::Stations::get_station_by_location( $lon,
+ $lat, 10 );
+
+ @iris = uniq_by { $_->{name} } @iris;
+
+ Travel::Status::DE::HAFAS->new_p(
+ promise => 'Mojo::Promise',
+ user_agent => $self->ua,
+ geoSearch => {
+ lat => $lat,
+ lon => $lon
+ }
+ )->then(
+ sub {
+ my ($hafas) = @_;
+ my @hafas = map {
+ {
+ name => $_->name,
+ eva => $_->eva,
+ distance => $_->distance_m / 1000,
+ hafas => 1
+ }
+ } $hafas->results;
+ if ( @hafas > 10 ) {
+ @hafas = @hafas[ 0 .. 9 ];
}
- );
+ my @results = map { $_->[0] }
+ sort { $a->[1] <=> $b->[1] }
+ map { [ $_, $_->{distance} ] } ( @iris, @hafas );
+ $self->render(
+ json => {
+ candidates => [@results],
+ }
+ );
+ }
+ )->catch(
+ sub {
+ my ($err) = @_;
+ $self->render(
+ json => {
+ candidates => [@iris],
+ warning => $err,
+ }
+ );
+ }
+ )->wait;
+}
+
+sub autocomplete {
+ my ($self) = @_;
+
+ $self->res->headers->cache_control('max-age=31536000, immutable');
+
+ my $output = '$(function(){const stations=';
+ $output
+ .= encode_json(
+ [ map { $_->[1] } Travel::Status::DE::IRIS::Stations::get_stations() ]
+ );
+ $output .= ";\n";
+ $output
+ .= "\$('input.station').autocomplete({delay:0,minLength:3,source:stations});});\n";
+
+ $self->render(
+ format => 'js',
+ data => $output
+ );
+}
+
+sub redirect_to_station {
+ my ($self) = @_;
+ my $input = $self->param('input');
+ my $params = $self->req->params;
+
+ $params->remove('input');
+
+ for my $param (qw(platforms mode admode via)) {
+ if (
+ not $params->param($param)
+ or ( exists $default{$param}
+ and $params->param($param) eq $default{$param} )
+ )
+ {
+ $params->remove($param);
+ }
+ }
+
+ if ( $input =~ m{ ^ [a-zA-Z]{1,5} \s+ \d+ }x ) {
+ if ( $input =~ s{ \s* @ \s* (?<date> [0-9.]+) $ }{}x ) {
+ $params->param( date => $+{date} );
+ }
+ elsif ( $input =~ s{ \s* [(] \s* (?<date> [0-9.]+) \s* [)] $ }{}x ) {
+ $params->param( date => $+{date} );
+ }
+ $params = $params->to_string;
+ $self->redirect_to("/z/${input}?${params}");
+ }
+ elsif ( $params->param('hafas') and $params->param('hafas') ne '1' ) {
+ $params = $params->to_string;
+ $self->redirect_to("/${input}?${params}");
+ }
+ else {
+ my @candidates
+ = Travel::Status::DE::IRIS::Stations::get_station($input);
+ if (
+ @candidates == 1
+ and ( $input eq $candidates[0][0]
+ or lc($input) eq lc( $candidates[0][1] )
+ or $input eq $candidates[0][2] )
+ )
+ {
+ $params->remove('hafas');
+ }
+ else {
+ $params->param( hafas => 1 );
+ }
+ $params = $params->to_string;
+ $self->redirect_to("/${input}?${params}");
}
}
diff --git a/lib/DBInfoscreen/Controller/Wagenreihung.pm b/lib/DBInfoscreen/Controller/Wagenreihung.pm
index b7c6d84..1708285 100644
--- a/lib/DBInfoscreen/Controller/Wagenreihung.pm
+++ b/lib/DBInfoscreen/Controller/Wagenreihung.pm
@@ -1,6 +1,6 @@
package DBInfoscreen::Controller::Wagenreihung;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -13,120 +13,20 @@ use utf8;
use Travel::Status::DE::DBWagenreihung;
use Travel::Status::DE::DBWagenreihung::Wagon;
-sub get_zugbildung_db {
- my ( $self, $train_no ) = @_;
-
- say $train_no;
-
- my $details = $self->app->train_details_db->{$train_no};
-
- if ( not $details ) {
- return;
- }
-
- my @wagons;
-
- for my $wagon ( @{ $details->{wagons} } ) {
- my $wagon_type = $wagon->{type};
- my $wagon_number = $wagon->{number};
- my %wagon = (
- fahrzeugnummer => "",
- fahrzeugtyp => $wagon_type,
- kategorie => $wagon_type =~ m{^[0-9.]+$} ? 'LOK' : '',
- train_no => $train_no,
- wagenordnungsnummer => $wagon_number,
- positionamhalt => {
- startprozent => 0,
- endeprozent => 0,
- startmeter => 0,
- endemeter => 0,
- }
- );
- my $wagon = Travel::Status::DE::DBWagenreihung::Wagon->new(%wagon);
-
- if ( $details->{type} ) {
- $wagon->set_traintype( $details->{type} );
- }
- push( @wagons, $wagon );
- }
-
- my $pos = 0;
- for my $wagon (@wagons) {
- $wagon->{position}{start_percent} = $pos;
- $wagon->{position}{end_percent} = $pos + 5;
- $pos += 5;
- }
-
- my $train_type = $details->{rawType};
- $train_type =~ s{ - .* }{}x;
-
- my $route_start = $details->{route}{start} // $details->{route}{preStart};
- my $route_end = $details->{route}{end} // $details->{route}{postEnd};
- my $route = "${route_start} → ${route_end}";
-
- return {
- route => $route,
- train_type => $train_type,
- wagons => [@wagons]
- };
-}
-
-sub zugbildung_db {
- my ($self) = @_;
-
- my $train_no = $self->param('train');
-
- my $details = $self->get_zugbildung_db($train_no);
-
- if ( not $details ) {
- $self->render( 'not_found',
- message => "Keine Daten zu Zug ${train_no} bekannt" );
- return;
- }
+sub handle_wagenreihung_error {
+ my ( $self, $train_no, $err ) = @_;
$self->render(
- 'zugbildung_db',
- wr_error => undef,
- title => $details->{train_type} . ' ' . $train_no,
- route => $details->{route},
- zb => $details,
+ 'wagenreihung',
+ title => "Zug $train_no",
+ wr_error => $err,
train_no => $train_no,
- wagons => $details->{wagons},
+ wr => undef,
+ wref => undef,
hide_opts => 1,
);
}
-sub handle_wagenreihung_error {
- my ( $self, $train_no, $err ) = @_;
-
- my $details = $self->get_zugbildung_db($train_no);
- if ( $details and @{ $details->{wagons} } ) {
- my $wr_error
- = "${err}. Ersatzweise werden die Solldaten laut Fahrplan angezeigt.";
- $self->render(
- 'zugbildung_db',
- wr_error => $wr_error,
- title => $details->{train_type} . ' ' . $train_no,
- route => $details->{route},
- zb => $details,
- train_no => $train_no,
- wagons => $details->{wagons},
- hide_opts => 1,
- );
- }
- else {
- $self->render(
- 'wagenreihung',
- title => "Zug $train_no",
- wr_error => $err,
- train_no => $train_no,
- wr => undef,
- wref => undef,
- hide_opts => 1,
- );
- }
-}
-
sub wagenreihung {
my ($self) = @_;
my $train = $self->stash('train');
@@ -218,10 +118,10 @@ sub wagenreihung {
and $wnb2 =~ m{^\d+$} )
{
- # We need to perform normalization in two cases:
- # * wagon 1 is leftmost and its number is higher than wagon 2
- # * wagon 1 is rightmost and its number is lower than wagon 2
- # (-> the leftmost wagon has the highest number)
+ # We need to perform normalization in two cases:
+ # * wagon 1 is leftmost and its number is higher than wagon 2
+ # * wagon 1 is rightmost and its number is lower than wagon 2
+ # (-> the leftmost wagon has the highest number)
# However, if wpa/wna und wpb/wnb do not match, we have a
# winged train with different normalization requirements
@@ -261,11 +161,17 @@ sub wagenreihung {
$wref = b64_encode( encode_json($wref) );
+ my $title = join( ' / ',
+ map { $wr->train_type . ' ' . $_ } $wr->train_numbers );
+
$self->render(
'wagenreihung',
- wr_error => undef,
- title => join( ' / ',
- map { $wr->train_type . ' ' . $_ } $wr->train_numbers ),
+ description => sprintf(
+ 'Ist-Wagenreihung %s in %s',
+ $title, $wr->station_name
+ ),
+ wr_error => undef,
+ title => $title,
train_no => $train,
wr => $wr,
wref => $wref,
@@ -319,15 +225,15 @@ sub wagen {
);
}
- my $title = "Wagen $wagon_id";
+ my $title = 'Wagen ' . $wagon_id;
if ( $wref->{tt} and $wref->{tn} ) {
$title = sprintf( '%s %s', $wref->{tt}, $wref->{tn} );
if ($wagon_no) {
- $title .= " Wagen $wagon_no";
+ $title .= ' Wagen ' . $wagon_no;
}
else {
- $title .= " Wagen $wagon_id";
+ $title .= ' Wagen ' . $wagon_id;
}
}
@@ -351,6 +257,9 @@ sub wagen {
$self->render(
'wagen',
+ description => ( $wref->{s} ? 'Position von ' : q{} )
+ . $title
+ . ( $wref->{s} ? " in $wref->{s}" : q{} ),
title => $title,
wagon_files => [@wagon_files],
wagon_data => $self->app->dbdb_wagon->{$wagon_id},
diff --git a/lib/DBInfoscreen/Helper/Marudor.pm b/lib/DBInfoscreen/Helper/EFA.pm
index cdc90f4..2a7416e 100644
--- a/lib/DBInfoscreen/Helper/Marudor.pm
+++ b/lib/DBInfoscreen/Helper/EFA.pm
@@ -1,6 +1,6 @@
-package DBInfoscreen::Helper::Marudor;
+package DBInfoscreen::Helper::EFA;
-# Copyright (C) 2020 Daniel Friesel
+# Copyright (C) 2020-2022 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -9,9 +9,10 @@ use warnings;
use 5.020;
use DateTime;
-use Encode qw(decode encode);
+use Encode qw(decode encode);
use Mojo::JSON qw(decode_json);
use Mojo::Promise;
+use Mojo::Util qw(url_escape);
use XML::LibXML;
sub new {
@@ -34,7 +35,7 @@ sub get_json_p {
my $promise = Mojo::Promise->new;
if ( my $content = $cache->thaw($url) ) {
- $self->{log}->debug("marudor->get_json_p($url): cached");
+ $self->{log}->debug("efa->get_json_p($url): cached");
if ( $content->{error} ) {
return $promise->reject( $content->{error} );
}
@@ -48,8 +49,7 @@ sub get_json_p {
if ( my $err = $tx->error ) {
$self->{log}->debug(
-"marudor->get_json_p($url): HTTP $err->{code} $err->{message}"
- );
+ "efa->get_json_p($url): HTTP $err->{code} $err->{message}");
$cache->freeze( $url, { error => $err->{message} } );
$promise->reject(
"GET $url returned HTTP $err->{code} $err->{message}");
@@ -59,8 +59,7 @@ sub get_json_p {
my $res = $tx->res->json;
if ( not $res ) {
- $self->{log}
- ->debug("marudor->get_json_p($url): empty response");
+ $self->{log}->debug("efa->get_json_p($url): empty response");
$promise->reject("GET $url returned empty response");
return;
}
@@ -74,7 +73,7 @@ sub get_json_p {
)->catch(
sub {
my ($err) = @_;
- $self->{log}->debug("marudor->get_json_p($url): $err");
+ $self->{log}->debug("efa->get_json_p($url): $err");
$cache->freeze( $url, { error => $err } );
$promise->reject($err);
return;
@@ -115,48 +114,4 @@ sub get_efa_occupancy {
return $promise;
}
-sub get_train_utilization {
- my ( $self, %opt ) = @_;
-
- my $promise = Mojo::Promise->new;
- my $train = $opt{train};
-
- if ( not $train->sched_departure ) {
- $promise->reject("train has no departure");
- return $promise;
- }
-
- my $train_no = $train->train_no;
- my $this_station = $train->station;
- my @route = $train->route_post;
- my $next_station;
- my $dep = $train->sched_departure->iso8601;
-
- if ( @route > 1 ) {
- $next_station = $route[1];
- }
- else {
- $next_station = $route[0];
- }
-
- $self->get_json_p( $self->{realtime_cache},
-"https://marudor.de/api/hafas/v2/auslastung/${this_station}/${next_station}/${train_no}/${dep}"
- )->then(
- sub {
- my ($utilization_json) = @_;
-
- $promise->resolve( $utilization_json->{first},
- $utilization_json->{second} );
- return;
- }
- )->catch(
- sub {
- $promise->reject;
- return;
- }
- )->wait;
-
- return $promise;
-}
-
1;
diff --git a/lib/DBInfoscreen/Helper/HAFAS.pm b/lib/DBInfoscreen/Helper/HAFAS.pm
index 91661a2..149bfc9 100644
--- a/lib/DBInfoscreen/Helper/HAFAS.pm
+++ b/lib/DBInfoscreen/Helper/HAFAS.pm
@@ -1,6 +1,6 @@
package DBInfoscreen::Helper::HAFAS;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2022 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -10,6 +10,7 @@ use 5.020;
use DateTime;
use Encode qw(decode encode);
+use Travel::Status::DE::HAFAS;
use Mojo::JSON qw(decode_json);
use Mojo::Promise;
use XML::LibXML;
@@ -28,398 +29,128 @@ sub new {
}
-sub get_json_p {
- my ( $self, $cache, $url ) = @_;
+sub get_route_p {
+ my ( $self, %opt ) = @_;
my $promise = Mojo::Promise->new;
+ my $now = DateTime->now( time_zone => 'Europe/Berlin' );
- if ( my $content = $cache->thaw($url) ) {
- return $promise->resolve($content);
+ my $hafas_promise;
+
+ if ( $opt{trip_id} ) {
+ $hafas_promise = Travel::Status::DE::HAFAS->new_p(
+ service => $opt{service},
+ journey => {
+ id => $opt{trip_id},
+ },
+ language => $opt{language},
+ cache => $self->{realtime_cache},
+ promise => 'Mojo::Promise',
+ user_agent => $self->{user_agent}->request_timeout(10)
+ );
+ }
+ elsif ( $opt{train} ) {
+ $opt{train_req} = $opt{train}->type . ' ' . $opt{train}->train_no;
+ $opt{train_origin} = $opt{train}->origin;
+ }
+ else {
+ $opt{train_req} = $opt{train_type} . ' ' . $opt{train_no};
}
- $self->{log}->debug("get_json_p($url)");
-
- $self->{user_agent}->request_timeout(5)->get_p( $url => $self->{header} )
- ->then(
+ $hafas_promise //= Travel::Status::DE::HAFAS->new_p(
+ journeyMatch => $opt{train_req} =~ s{^- }{}r,
+ datetime => ( $opt{train} ? $opt{train}->start : $opt{datetime} ),
+ language => $opt{language},
+ cache => $self->{realtime_cache},
+ promise => 'Mojo::Promise',
+ user_agent => $self->{user_agent}->request_timeout(10)
+ )->then(
sub {
- my ($tx) = @_;
+ my ($hafas) = @_;
+ my @results = $hafas->results;
- if ( my $err = $tx->error ) {
- $self->{log}->warn(
- "hafas->get_json_p($url): HTTP $err->{code} $err->{message}"
- );
- $promise->reject(
- "GET $url returned HTTP $err->{code} $err->{message}");
- return;
+ if ( not @results ) {
+ return Mojo::Promise->reject(
+ "journeyMatch($opt{train_req}) found no results");
}
- my $body
- = encode( 'utf-8', decode( 'ISO-8859-15', $tx->res->body ) );
- $body =~ s{^TSLs[.]sls = }{};
- $body =~ s{;$}{};
- $body =~ s{&#x0028;}{(}g;
- $body =~ s{&#x0029;}{)}g;
-
- my $json = decode_json($body);
-
- if ( not $json ) {
- $self->{log}->debug("hafas->get_json_p($url): empty response");
- $promise->reject("GET $url returned empty response");
- return;
+ my $result = $results[0];
+ if ( @results > 1 ) {
+ for my $journey (@results) {
+ if ( $opt{train_origin}
+ and ( $journey->route )[0]->loc->name eq
+ $opt{train_origin} )
+ {
+ $result = $journey;
+ last;
+ }
+ }
}
- $cache->freeze( $url, $json );
-
- $promise->resolve($json);
- return;
- }
- )->catch(
- sub {
- my ($err) = @_;
- $self->{log}->warn("hafas->get_json_p($url): $err");
- $promise->reject($err);
- return;
+ return Travel::Status::DE::HAFAS->new_p(
+ journey => {
+ id => $result->id,
+ },
+ language => $opt{language},
+ cache => $self->{realtime_cache},
+ promise => 'Mojo::Promise',
+ user_agent => $self->{user_agent}->request_timeout(10)
+ );
}
- )->wait;
-
- return $promise;
-}
+ );
-sub get_xml_p {
- my ( $self, $cache, $url ) = @_;
-
- my $promise = Mojo::Promise->new;
-
- if ( my $content = $cache->thaw($url) ) {
- return $promise->resolve($content);
- }
-
- $self->{log}->debug("get_xml_p($url)");
-
- $self->{user_agent}->request_timeout(5)->get_p( $url => $self->{header} )
- ->then(
+ $hafas_promise->then(
sub {
- my ($tx) = @_;
-
- if ( my $err = $tx->error ) {
- $cache->freeze( $url, {} );
- $self->{log}->warn(
- "hafas->get_xml_p($url): HTTP $err->{code} $err->{message}"
- );
- $promise->reject(
- "GET $url returned HTTP $err->{code} $err->{message}");
- return;
- }
-
- my $body = decode( 'ISO-8859-15', $tx->res->body );
-
- # <SDay text="... &gt; ..."> is invalid XML, but present
- # regardless. As it is the last tag, we just throw it away.
- $body =~ s{<SDay [^>]*/>}{}s;
-
- # More fixes for invalid XML
- $body =~ s{P&R}{P&amp;R};
- $body =~ s{Wagen \d+ \K&(?= )}{&amp;};
-
- # <Attribute [...] text="[...]"[...]"" /> is invalid XML.
- # Work around it.
- $body
- =~ s{<Attribute([^>]+)text="([^"]*)"([^"=>]*)""}{<Attribute$1text="$2&#042;$3&#042;"}s;
-
- # Same for <HIMMessage lead="[...]"[...]"[...]" />
- $body
- =~ s{<HIMMessage([^>]+)lead="([^"]*)"([^"=>]*)"([^"]*)"}{<Attribute$1text="$2&#042;$3&#042;$4"}s;
-
- # Dito for <HIMMessage [...] lead="[...]<br>[...]">
- # (replace line breaks with space)
- while ( $body
- =~ s{<HIMMessage([^>]+)lead="([^"]*)<br/?>([^"=]*)"}{<HIMMessage$1lead="$2 $3"}gis
- )
- {
- }
-
- # ... and <HIMMessage [...] lead="[...]<>[...]">
- # (replace <> with t$t)
- while ( $body
- =~ s{<HIMMessage([^>]+)lead="([^"]*)<>([^"=]*)"}{<HIMMessage$1lead="$2&#11020;$3"}gis
- )
- {
- }
-
- # ... and any other HTML tag inside an XML attribute
- # (remove them entirely)
- while ( $body
- =~ s{<HIMMessage([^>]+)lead="([^"]*)<[^>]+>([^"=]*)"}{<HIMMessage$1lead="$2$3"}gis
- )
- {
- }
-
- my $tree;
-
- eval { $tree = XML::LibXML->load_xml( string => $body ) };
-
- if ($@) {
- $self->{log}->debug("hafas->get_xml_p($url): $@");
- $cache->freeze( $url, {} );
- $promise->reject;
- return;
- }
-
- my $ret = {
- station => {},
- stations => [],
- messages => [],
- };
-
- for my $station ( $tree->findnodes('/Journey/St') ) {
- my $name = $station->getAttribute('name');
- my $adelay = $station->getAttribute('adelay');
- my $ddelay = $station->getAttribute('ddelay');
- push( @{ $ret->{stations} }, $name );
- $ret->{station}{$name} = {
- adelay => $adelay,
- ddelay => $ddelay,
- };
- }
-
- for my $message ( $tree->findnodes('/Journey/HIMMessage') ) {
- my $header = $message->getAttribute('header');
- my $lead = $message->getAttribute('lead');
- my $display = $message->getAttribute('display');
+ my ($hafas) = @_;
+ my $journey = $hafas->result;
+ my @ret;
+ my $station_is_past = 1;
+ for my $stop ( $journey->route ) {
push(
- @{ $ret->{messages} },
+ @ret,
{
- header => $header,
- lead => $lead,
- display => $display
+ name => $stop->loc->name,
+ eva => $stop->loc->eva,
+ sched_arr => $stop->sched_arr,
+ sched_dep => $stop->sched_dep,
+ rt_arr => $stop->rt_arr,
+ rt_dep => $stop->rt_dep,
+ arr_delay => $stop->arr_delay,
+ dep_delay => $stop->dep_delay,
+ arr_cancelled => $stop->arr_cancelled,
+ dep_cancelled => $stop->dep_cancelled,
+ platform => $stop->platform,
+ sched_platform => $stop->sched_platform,
+ load => $stop->load,
+ isAdditional => $stop->is_additional,
+ isCancelled => (
+ ( $stop->arr_cancelled or not $stop->sched_arr )
+ and
+ ( $stop->dep_cancelled or not $stop->sched_dep )
+ ),
}
);
- }
-
- $cache->freeze( $url, $ret );
- $promise->resolve($ret);
-
- return;
- }
- )->catch(
- sub {
- my ($err) = @_;
- $self->{log}->warn("hafas->get_xml_p($url): $err");
- $promise->reject($err);
- return;
- }
- )->wait;
-
- return $promise;
-}
-
-sub trainsearch_p {
- my ( $self, %opt ) = @_;
-
- my $base
- = 'https://reiseauskunft.bahn.de/bin/trainsearch.exe/dn?L=vs_json&start=yes&rt=1';
-
- if ( not $opt{date_yy} ) {
- my $now = DateTime->now( time_zone => 'Europe/Berlin' );
- $opt{date_yy} = $now->strftime('%d.%m.%y');
- $opt{date_yyyy} = $now->strftime('%d.%m.%Y');
- }
-
- # IRIS reports trains with unknown type as type "-". HAFAS thinks otherwise
- # and prefers the type to be left out entirely in this case.
- $opt{train_req} =~ s{^- }{};
-
- my $promise = Mojo::Promise->new;
-
- $self->get_json_p( $self->{realtime_cache},
- "${base}&date=$opt{date_yy}&trainname=$opt{train_req}" )->then(
- sub {
- my ($trainsearch) = @_;
-
- # Fallback: Take first result
- my $result = $trainsearch->{suggestions}[0];
-
- # Try finding a result for the current date
- for my $suggestion ( @{ $trainsearch->{suggestions} // [] } ) {
-
- # Drunken API, sail with care. Both date formats are used interchangeably
if (
- exists $suggestion->{depDate}
- and ( $suggestion->{depDate} eq $opt{date_yy}
- or $suggestion->{depDate} eq $opt{date_yyyy} )
+ $station_is_past
+ and not $ret[-1]{isCancelled}
+ and $now->epoch < (
+ $ret[-1]{rt_arr} // $ret[-1]{rt_dep}
+ // $ret[-1]{sched_arr} // $ret[-1]{sched_dep} // $now
+ )->epoch
)
{
- # Train numbers are not unique, e.g. IC 149 refers both to the
- # InterCity service Amsterdam -> Berlin and to the InterCity service
- # Koebenhavns Lufthavn st -> Aarhus. One workaround is making
- # requests with the stationFilter=80 parameter. Checking the origin
- # station seems to be the more generic solution, so we do that
- # instead.
- if ( $opt{train_origin}
- and $suggestion->{dep} eq $opt{train_origin} )
- {
- $result = $suggestion;
- last;
- }
+ $station_is_past = 0;
}
+ $ret[-1]{isPast} = $station_is_past;
}
- if ($result) {
-
- # The trip_id's date part doesn't seem to matter -- so far, HAFAS is
- # happy as long as the date part starts with a number. HAFAS-internal
- # tripIDs use this format (withouth leading zero for day of month < 10)
- # though, so let's stick with it.
- my $date_map = $opt{date_yyyy};
- $date_map =~ tr{.}{}d;
- $result->{trip_id} = sprintf( '1|%d|%d|%d|%s',
- $result->{id}, $result->{cycle},
- $result->{pool}, $date_map );
- $promise->resolve($result);
- }
- else {
- $self->{log}->warn(
- "hafas->trainsearch_p($opt{train_req}): train not found");
- $promise->reject("Zug $opt{train_req} nicht gefunden");
- }
-
- # do not propagate $promise->reject's return value to this promise.
- # Perl implicitly returns the last statement, so we explicitly return
- # nothing to avoid this.
+ $promise->resolve( \@ret, $journey, $hafas );
return;
}
)->catch(
sub {
my ($err) = @_;
- $self->{log}->warn("hafas->trainsearch_p($opt{train_req}): $err");
$promise->reject($err);
-
- # do not propagate $promise->reject's return value to this promise
- return;
- }
- )->wait;
-
- return $promise;
-}
-
-sub get_route_timestamps_p {
- my ( $self, %opt ) = @_;
-
- my $promise = Mojo::Promise->new;
- my $now = DateTime->now( time_zone => 'Europe/Berlin' );
-
- if ( $opt{train} ) {
- $opt{date_yy} = $opt{train}->start->strftime('%d.%m.%y');
- $opt{date_yyyy} = $opt{train}->start->strftime('%d.%m.%Y');
- $opt{train_req} = $opt{train}->type . ' ' . $opt{train}->train_no;
- $opt{train_origin} = $opt{train}->origin;
- }
- else {
- $opt{date_yy} = $now->strftime('%d.%m.%y');
- $opt{date_yyyy} = $now->strftime('%d.%m.%Y');
- }
-
- my $base = 'https://reiseauskunft.bahn.de/bin/traininfo.exe/dn';
- my ( $trainsearch_result, $trainlink );
-
- $self->trainsearch_p(%opt)->then(
- sub {
- ($trainsearch_result) = @_;
- $trainlink = $trainsearch_result->{trainLink};
- return Mojo::Promise->all(
- $self->get_json_p(
- $self->{realtime_cache},
- "${base}/${trainlink}?rt=1&date=$opt{date_yy}&L=vs_json"
- ),
- $self->get_xml_p(
- $self->{realtime_cache},
- "${base}/${trainlink}?rt=1&date=$opt{date_yy}&L=vs_java3"
- )
- );
- }
- )->then(
- sub {
- my ( $traininfo, $traindelay ) = @_;
- $traininfo = $traininfo->[0];
- $traindelay = $traindelay->[0];
- if ( not $traininfo or $traininfo->{error} ) {
- $promise->reject;
- return;
- }
- $trainsearch_result->{trainClass}
- = $traininfo->{suggestions}[0]{trainClass};
- my $ret = {};
-
- my $strp = DateTime::Format::Strptime->new(
- pattern => '%d.%m.%y %H:%M',
- time_zone => 'Europe/Berlin',
- );
-
- my $station_is_past = 1;
-
- for
- my $station ( @{ $traininfo->{suggestions}[0]{locations} // [] } )
- {
- my $name = $station->{name};
- my $arr = $station->{arrDate} . ' ' . $station->{arrTime};
- my $dep = $station->{depDate} . ' ' . $station->{depTime};
- $ret->{$name} = {
- sched_arr => scalar $strp->parse_datetime($arr),
- sched_dep => scalar $strp->parse_datetime($dep),
- };
- if ( exists $traindelay->{station}{$name} ) {
- my $delay = $traindelay->{station}{$name};
- if ( $ret->{$name}{sched_arr}
- and $delay->{adelay}
- and $delay->{adelay} =~ m{^\d+$} )
- {
- $ret->{$name}{rt_arr} = $ret->{$name}{sched_arr}
- ->clone->add( minutes => $delay->{adelay} );
- }
- if ( $ret->{$name}{sched_dep}
- and $delay->{ddelay}
- and $delay->{ddelay} =~ m{^\d+$} )
- {
- $ret->{$name}{rt_dep} = $ret->{$name}{sched_dep}
- ->clone->add( minutes => $delay->{ddelay} );
- if (
- (
- defined $delay->{adelay}
- and $delay->{adelay} eq q{}
- )
- or ( defined $delay->{ddelay}
- and $delay->{ddelay} eq q{} )
- )
- {
- $ret->{$name}{rt_bogus} = 1;
- }
- if ( $delay->{ddelay} and $delay->{ddelay} eq 'cancel' )
- {
- $ret->{$name}{isCancelled} = 1;
- }
- }
- if (
- $station_is_past
- and not $ret->{$name}{isCancelled}
- and $now->epoch < (
- $ret->{$name}{rt_arr} // $ret->{$name}{rt_dep}
- // $ret->{$name}{sched_arr}
- // $ret->{$name}{sched_dep} // $now
- )->epoch
- )
- {
- $station_is_past = 0;
- }
- $ret->{$name}{isPast} = $station_is_past;
- }
- }
-
- $promise->resolve( $ret, $traindelay // {}, $trainsearch_result );
- return;
- }
- )->catch(
- sub {
- $promise->reject;
return;
}
)->wait;
@@ -428,68 +159,37 @@ sub get_route_timestamps_p {
}
# Input: (HAFAS TripID, line number)
-# Output: Promise returning a
-# https://github.com/public-transport/hafas-client/blob/4/docs/trip.md instance
-# on success
+# Output: Promise returning a Travel::Status::DE::HAFAS::Journey instance on success
sub get_polyline_p {
- my ( $self, $trip_id, $line ) = @_;
+ my ( $self, %opt ) = @_;
- my $api = $self->{api};
- my $url = "${api}/trips/${trip_id}?lineName=${line}&polyline=true";
- my $log_url = $url;
- my $cache = $self->{realtime_cache};
+ my $trip_id = $opt{id};
+ my $line = $opt{line};
+ my $service = $opt{service};
my $promise = Mojo::Promise->new;
- $log_url =~ s{://\K[^:]+:[^@]+\@}{***@};
-
- if ( my $content = $cache->thaw($url) ) {
- $promise->resolve($content);
- $self->{log}->debug("GET $log_url (cached)");
- return $promise;
- }
-
- $self->{user_agent}->request_timeout(5)->get_p( $url => $self->{header} )
- ->then(
+ Travel::Status::DE::HAFAS->new_p(
+ service => $service,
+ journey => {
+ id => $trip_id,
+ name => $line,
+ },
+ with_polyline => 1,
+ cache => $self->{realtime_cache},
+ promise => 'Mojo::Promise',
+ user_agent => $self->{user_agent}->request_timeout(10)
+ )->then(
sub {
- my ($tx) = @_;
-
- if ( my $err = $tx->error ) {
- $self->{log}->warn(
-"hafas->get_polyline_p($log_url): HTTP $err->{code} $err->{message}"
- );
- $promise->reject(
- "GET $log_url returned HTTP $err->{code} $err->{message}");
- return;
- }
-
- $self->{log}->debug("GET $log_url (OK)");
- my $json = decode_json( $tx->res->body );
- my @coordinate_list;
-
- for my $feature ( @{ $json->{polyline}{features} } ) {
- if ( exists $feature->{geometry}{coordinates} ) {
- push( @coordinate_list, $feature->{geometry}{coordinates} );
- }
-
- #if ($feature->{type} eq 'Feature') {
- # say "Feature " . $feature->{properties}{name};
- #}
- }
-
- my $ret = {
- name => $json->{line}{name} // '?',
- polyline => [@coordinate_list],
- raw => $json,
- };
+ my ($hafas) = @_;
+ my $journey = $hafas->result;
- $cache->freeze( $url, $ret );
- $promise->resolve($ret);
+ $promise->resolve($journey);
return;
}
)->catch(
sub {
my ($err) = @_;
- $self->{log}->debug("GET $log_url (error: $err)");
+ $self->{log}->debug("HAFAS->new_p($trip_id, $line) error: $err");
$promise->reject($err);
return;
}
diff --git a/lib/DBInfoscreen/Helper/Wagonorder.pm b/lib/DBInfoscreen/Helper/Wagonorder.pm
index 469eda6..5cdee40 100644
--- a/lib/DBInfoscreen/Helper/Wagonorder.pm
+++ b/lib/DBInfoscreen/Helper/Wagonorder.pm
@@ -1,6 +1,6 @@
package DBInfoscreen::Helper::Wagonorder;
-# Copyright (C) 2011-2020 Daniel Friesel
+# Copyright (C) 2011-2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: AGPL-3.0-or-later
@@ -24,170 +24,11 @@ sub new {
}
-sub is_available_p {
- my ( $self, $train, $wr_link ) = @_;
- my $promise = Mojo::Promise->new;
-
- $self->check_wagonorder_p( $train->train_no, $wr_link )->then(
- sub {
- my ($body) = @_;
- $promise->resolve($body);
- return;
- },
- sub {
- if ( $train->is_wing ) {
- my $wing = $train->wing_of;
- return $self->check_wagonorder_p( $wing->train_no, $wr_link );
- }
- else {
- $promise->reject;
- return;
- }
- }
- )->then(
- sub {
- my ($body) = @_;
- $promise->resolve($body);
- return;
- },
- sub {
- $promise->reject;
- return;
- }
- )->wait;
-
- return $promise;
-}
-
-sub get_dbdb_p {
- my ( $self, $url ) = @_;
-
- my $promise = Mojo::Promise->new;
-
- my $cache = $self->{main_cache};
-
- if ( my $content = $cache->get($url) ) {
- if ($content) {
- return $promise->resolve($content);
- }
- else {
- return $promise->reject;
- }
- }
-
- $self->{user_agent}->request_timeout(5)->get_p( $url => $self->{header} )
- ->then(
- sub {
- my ($tx) = @_;
- if ( $tx->result->is_success ) {
- my $body = $tx->result->body;
- $cache->set( $url, $body );
- $promise->resolve($body);
- }
- else {
- $cache->set( $url, q{} );
- $promise->reject;
- }
- return;
- }
- )->catch(
- sub {
- $cache->set( $url, q{} );
- $promise->reject;
- return;
- }
- )->wait;
- return $promise;
-}
-
-sub head_dbdb_p {
- my ( $self, $url ) = @_;
-
- my $promise = Mojo::Promise->new;
-
- my $cache = $self->{main_cache};
-
- if ( my $content = $cache->get($url) ) {
- $self->{log}->debug("wagonorder->head_dbdb_p($url): cached ($content)");
- if ( $content eq 'y' ) {
- return $promise->resolve;
- }
- else {
- return $promise->reject;
- }
- }
-
- $self->{user_agent}->request_timeout(5)->head_p( $url => $self->{header} )
- ->then(
- sub {
- my ($tx) = @_;
- if ( $tx->result->is_success ) {
- $self->{log}->debug("wagonorder->head_dbdb_p($url): y");
- $cache->set( $url, 'y' );
- $promise->resolve;
- }
- else {
- $self->{log}->debug("wagonorder->head_dbdb_p($url): n");
- $cache->set( $url, 'n' );
- $promise->reject;
- }
- return;
- }
- )->catch(
- sub {
- $self->{log}->debug("wagonorder->head_dbdb_p($url): n");
- $cache->set( $url, 'n' );
- $promise->reject;
- return;
- }
- )->wait;
- return $promise;
-}
-
-sub has_cycle_p {
- my ( $self, $train_no ) = @_;
-
- return $self->head_dbdb_p(
- "https://lib.finalrewind.org/dbdb/db_umlauf/${train_no}.svg");
-}
-
-sub check_wagonorder_p {
- my ( $self, $train_no, $wr_link ) = @_;
-
- my $promise = Mojo::Promise->new;
-
- $self->head_dbdb_p(
- "https://lib.finalrewind.org/dbdb/has_wagonorder/${train_no}/${wr_link}"
- )->then(
- sub {
- $promise->resolve;
- return;
- }
- )->catch(
- sub {
- $self->get_p( $train_no, $wr_link )->then(
- sub {
- $promise->resolve;
- return;
- }
- )->catch(
- sub {
- $promise->reject;
- return;
- }
- )->wait;
- return;
- }
- )->wait;
-
- return $promise;
-}
-
sub get_p {
my ( $self, $train_no, $api_ts ) = @_;
my $url
- = "https://www.apps-bahn.de/wr/wagenreihung/1.0/${train_no}/${api_ts}";
+ = "https://ist-wr.noncd.db.de/wagenreihung/1.0/${train_no}/${api_ts}";
my $cache = $self->{realtime_cache};
diff --git a/lib/DBInfoscreen/I18N/en.pm b/lib/DBInfoscreen/I18N/en.pm
new file mode 100644
index 0000000..3abb70f
--- /dev/null
+++ b/lib/DBInfoscreen/I18N/en.pm
@@ -0,0 +1,84 @@
+package DBInfoscreen::I18N::en;
+
+# Copyright (C) 2023 Birte Kristina Friesel
+#
+# SPDX-License-Identifier: AGPL-3.0-or-later
+
+use Mojo::Base 'DBInfoscreen::I18N';
+
+our %Lexicon = (
+
+ # common
+ 'Stationen in der Umgebung suchen' => 'Find stops nearby',
+
+ # layouts/app
+ 'Mehrdeutige Eingabe' => 'Ambiguous input',
+ 'Bitte eine Station aus der Liste auswählen' =>
+ 'Please select a station from the list',
+ 'Zug / Station' => 'Enter train number or station name',
+ 'Zug, Stationsname oder Ril100-Kürzel' =>
+ 'train, station name, or DS100 code',
+ 'Abfahrtstafel' => 'Show departures',
+ 'Weitere Einstellungen' => 'Preferences',
+ 'Zeiten inkl. Verspätung angeben' => 'Include delay in timestamps',
+ 'Verspätungen erst ab 5 Minuten anzeigen' => 'Hide delays below 5 minutes',
+ 'Mehr Details' => 'Verbose mode',
+'Betriebliche Bahnhofstrennungen berücksichtigen (z.B. "Hbf (Fern+Regio)" vs. "Hbf (S)")'
+ => 'Respect split stations; do not join them',
+ 'Bereits abgefahrene Züge anzeigen' => 'Include past trains',
+ 'Formular verstecken' => 'Hide form',
+ 'Nur Züge über' => 'Only show trains via',
+ 'Bahnhof 1, Bhf2, ... (oder regulärer Ausdruck)' =>
+ 'Station 1, 2, ... (or regular expression)',
+ 'Gleise' => 'Platforms',
+ 'Ankunfts- oder Abfahrtszeit anzeigen?' => 'Show arrival or departure?',
+ 'Abfahrt bevorzugen' => 'prefer departure',
+ 'Nur Abfahrt' => 'departure only',
+ 'Nur Ankunft' => 'arrival only',
+ 'Anzeigen' => 'Submit',
+ 'Datenschutz' => 'Privacy',
+ 'Impressum' => 'Imprint',
+
+ # landing page
+ 'Oder hier angeben:' => 'Or enter manually:',
+
+ # train details
+ 'Gleis' => 'Platform',
+ 'An:' => 'Arr',
+ 'Ab:' => 'Dep',
+ 'Plan:' => 'Sched',
+ 'Auslastung unbekannt' => 'Occupancy unknown',
+ 'Geringe Auslastung' => 'Low occupancy',
+ 'Hohe Auslastung' => 'High occupancy',
+ 'Sehr hohe Auslastung' => 'Very high occupancy',
+ 'Zug ist ausgebucht' => 'Fully booked',
+ 'Geringe Auslastung erwartet' => 'Low occupancy expected',
+ 'Hohe Auslastung erwartet' => 'High occupancy expected',
+ 'Sehr hohe Auslastung erwartet' => 'Very high occupancy expected',
+ 'Meldungen' => 'Messages',
+ 'Fahrtverlauf am' => 'Route on',
+ 'Betrieb' => 'Operator',
+ 'Karte' => 'Map',
+ 'Wagen' => 'Composition',
+
+ # wagon order
+ 'Nach' => 'To',
+ 'in Abschnitt' => 'in sections',
+ 'Wagen ' => 'carriage ',
+
+ # map
+ 'Fahrt' => 'Trip',
+ 'von' => 'from',
+ 'nach' => 'to',
+ 'Nächster Halt:' => 'Next stop:',
+ 'um' => 'at',
+ 'auf Gleis' => 'on platform',
+ 'Aufenthalt in' => 'Stopped in',
+ 'an Gleis' => 'on platform',
+ 'bis' => 'until',
+ 'Abfahrt in' => 'Departs',
+ 'von Gleis' => 'from platform',
+ 'Endstation erreicht um' => 'Terminus reached at',
+);
+
+1;
diff --git a/public/static/css/dark.min.css b/public/static/css/dark.min.css
index cfc7377..41e5170 100644
--- a/public/static/css/dark.min.css
+++ b/public/static/css/dark.min.css
@@ -1 +1 @@
-body{margin:0;color:#fff;background-color:#101010}html{font-family:Sans-Serif}a{color:#99f;text-decoration:none}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}p,div.about,div.input-field,div.notes{max-width:94%;margin-left:auto;margin-right:auto}p{text-align:justify}div.content{width:100%;margin:0}.copyright{margin-top:1em;color:#999;clear:both}.wagonorder{position:relative;width:100%;height:100ex}.wagonorder.exit-unknown .section{left:1em;width:2em}.wagonorder.exit-unknown .wagon{left:3em;min-width:6em}.wagonorder.exit-unknown .details{left:10em;right:0em}.wagonorder.exit-left .section{left:1em;width:2em;background-color:#222}.wagonorder.exit-left .wagon{left:3em;min-width:6em}.wagonorder.exit-left .details{left:10em;right:0em}.wagonorder.exit-right .section{right:1em;width:2em;background-color:#222}.wagonorder.exit-right .wagon{right:3em;min-width:6em}.wagonorder.exit-right .details{right:10em;left:0em;text-align:right}.wagonorder .section{position:absolute;text-align:center}.wagonorder .wagon{position:absolute;border:1px solid #999;padding-left:0.2em;padding-right:0.2em}.wagonorder .wagon .material-icons{color:#bbb}.wagonorder .wagon .direction{position:absolute;left:0.2em;bottom:0;right:0;text-align:center;color:#bbb}.wagonorder .wagon~.wagon{border-top:none}.wagonorder .firstclass{background-color:#330}.wagonorder .powercar{background-color:#222}.wagonorder .nondestwagon{border-style:dashed}.wagonorder .details{position:absolute;padding-top:0.5ex}.wagonorder .details .type{display:inline-block;width:5em;color:#bbb}.wagonorder .details a.type{color:#99f}.wagonorder .details .uicunknown{color:#999}.wagonorder .details .uicexchange{margin-right:0.2em;color:#999}.wagonorder .details .uiccountry{margin-right:0.2em;color:#999}.wagonorder .details .uic5{margin-right:0.2em;color:#999}.wagonorder .details .uic56{color:#bbb;font-weight:bold}.wagonorder .details .uic78{margin-right:0.2em;color:#bbb;font-weight:bold}.wagonorder .details .uic78::before{content:"-"}.wagonorder .details .uictype{margin-right:0.2em;color:#bbb;font-weight:bold}.wagonorder .details .uicno{color:#bbb}.wagonorder .details .uiccheck{color:#999}.wagonorder .details .uiccheck::before{content:"-"}.singlewagon .sign-left{float:left;padding-left:5%}.singlewagon .sign-right{float:right;padding-right:5%}.singlewagon .sign-center{text-align:center}.singlewagon .platform{text-align:center;background-color:#444;font-weight:bold;padding-top:0.5em;padding-bottom:0.5em}.singlewagon img.wagonfile{width:100%;margin-top:0.2em;margin-bottom:0.2em}div.app{border-width:1px 2px;width:100%;margin-bottom:5em}div.app>ul{position:relative;width:100%;list-style-type:none;margin:0;padding:0}div.app>ul>li{min-height:7em;display:block;width:100%;position:relative;border-bottom:1px solid #999;background-color:#101010}div.app>ul>li.cancelled{background-color:#512f00}div.app>ul>li>a{color:#fff}div.app>ul>li .anchor{position:relative;top:-12em}div.app>ul>li .line{font-size:2.7em;position:absolute;bottom:5px;left:2px;max-width:6em;max-height:3ex;overflow:hidden}div.app>ul>li .line .trainno{font-weight:normal}div.app>ul>li .line .trainno_sub{font-weight:normal;font-size:0.6em;text-align:center;margin-top:-0.2em}div.app>ul>li .sbahn .trainno_sub{font-weight:normal;font-size:0.5em;text-align:center;margin-top:-0.25em}div.app>ul>li .lineinfo{color:#fff;font-size:2em;position:absolute;top:0px;left:2px}div.app>ul>li .route{background-color:transparent;font-size:2.1em;position:absolute;top:1px;left:7.7em;right:7em;height:1.2em;overflow:hidden;color:#ddd}div.app>ul>li .info{color:#f77;background-color:transparent;font-size:2.1em;position:absolute;top:1px;left:7.7em;right:7em;height:1.2em;overflow:hidden}div.app>ul>li .dest{background-color:transparent;font-size:4em;position:absolute;top:0.62em;left:4em;bottom:0px;width:70%;overflow:hidden;color:#fff}div.app>ul>li .origin{background-color:transparent;font-size:4em;position:absolute;top:0.62em;left:4em;bottom:0px;width:70%;overflow:hidden;color:#bbb}div.app>ul>li .origin:before{content:"von "}div.app>ul>li .platform{background-color:transparent;font-size:3em;font-weight:bold;position:absolute;right:5px;bottom:2px;padding-left:0.2em;color:#fff}div.app>ul>li .changed-platform{color:#f77}div.app>ul>li .time{background-color:transparent;font-size:2.3em;position:absolute;right:5px;top:4px;padding-left:0.2em;color:#fff}div.app>ul>li .time.delayed{color:#f77;background-color:transparent}div.app>ul>li .time .no-realtime{background-color:transparent;padding-right:1ex}div.app>ul>li .time .no-realtime i.material-icons{font-size:12px}div.app>ul>li .time .delay{font-size:1em;color:#f77;background-color:transparent;padding-right:1ex}div.app>ul>li .time .undelay{font-size:1em;color:#7f7;padding-right:1ex}div.app>ul>li .time .delaynorm{font-size:0.9em;color:#d99;padding-right:1ex}div.app>ul>li .time .undelaynorm{font-size:0.9em;color:#9d9;padding-right:1ex}div.app .trainsubtype{font-weight:normal;font-size:70%;position:relative;vertical-align:baseline;top:-0.6ex;left:-0.5ex}div.app .replacement{color:#afa}div.app .replaced{color:#faa}div.app .sbahn{font-weight:bold;border-radius:30px;padding:3px 6px 2px 6px;background-color:#151}div.app .bahn,div.app .fern,div.app .ext{font-weight:bold;border-radius:5px;padding:3px 5px 2px 5px}div.app .bahn{background-color:#333}div.app .fern{background-color:#511}div.app .ext{border:2px solid #333}div.app .moreinfo{font-size:2.1em;position:fixed;left:0;right:0;bottom:0em;z-index:5;overflow:auto;cursor:default;background-color:#101010}div.app .moreinfo .mheader,div.app .moreinfo .mfooter{max-width:50em;margin-left:auto;margin-right:auto}div.app .moreinfo .mheader{text-align:center;font-size:120%;padding-top:0.5em;padding-bottom:0.5em;padding-left:1em;padding-right:1em;border-bottom:0.1em dashed #cccccc}div.app .moreinfo .mfooter{padding-top:0.5em;padding-left:1em;padding-right:1em}div.app .moreinfo .dataline{font-size:120%;width:100%;display:flex;justify-content:space-between;margin-bottom:1em}div.app .moreinfo .dataline>div{width:33%}div.app .moreinfo .departure{text-align:right}div.app .moreinfo .platform{text-align:center}div.app .moreinfo .arrival{display:inline-block;text-align:right}div.app .moreinfo .loading{text-align:center;width:100%;color:#888888}div.app .moreinfo .minfo{color:#f77}div.app .moreinfo .undelay{color:#7f7}div.app .moreinfo .verbose{margin-bottom:1em}div.app .moreinfo .verbose .no-realtime{color:#f77}div.app .moreinfo .mroute .important-stop{color:#fff}div.app .moreinfo .mroute .generic-stop{color:#bbb}div.app .moreinfo .mroute .additional-stop{color:#7f7}div.app .moreinfo .mroute .cancelled-stop{color:#f77}div.app .moreinfo .mroute .past-stop{list-style-type:disc}div.app .moreinfo .mroute .future-stop{list-style-type:circle}div.app .moreinfo .db-attr{margin-bottom:1em}div.app .moreinfo .db-attr span{margin-right:0.5em}div.app .collapsed-moreinfo{display:none}div.app .expanded-moreinfo{display:block}ul.ui-autocomplete{max-height:20em;overflow-x:hidden;overflow-y:auto}div.geolocation{text-align:center}div.candidatestatus{text-align:center;color:#999999}div.candidatelist a{display:block;text-decoration:none;font-size:1.4em;padding-top:0.3em;text-align:center;border-bottom:1px solid #999999}div.candidatelist a .distance:after{content:" km"}div.candidatelist a .distance{font-size:0.6em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.candidatelist a .traininfo{font-size:0.7em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.about{margin-top:2em;font-family:Sans-Serif;color:#bbb}div.about a{color:#99f;text-decoration:none}.notice{padding:15px;margin-bottom:20px;border:1px solid #bce8f1;border-radius:4px;color:#31708f;background-color:#d9edf7;margin-left:auto;margin-right:auto}.warning{padding:15px;margin-bottom:20px;border:1px solid #faebcc;border-radius:4px;color:#8a6d3b;background-color:#fcf8e3;margin-left:auto;margin-right:auto}.error{padding:15px;margin-bottom:20px;border:1px solid #ebccd1;border-radius:4px;color:#a94442;background-color:#f2dede;margin-left:auto;margin-right:auto}.error .errcode{font-family:Monospace;margin-top:2em;font-size:100%;color:#aaaaaa}.container{max-width:60em;margin-left:auto;margin-right:auto}pre{margin-bottom:2em}span.optional,span.notes{color:#bbb}.moresettings-header{cursor:pointer}.moresettings-header-collapsed:before{content:"▹ "}.moresettings-header-expanded:before{content:"▿ "}.moresettings-collapsed{display:none}.moresettings-expanded{display:block}.developers-header{cursor:pointer}.developers-header-collapsed:before{content:"▹ "}.developers-header-expanded:before{content:"▿ "}.developers-collapsed{display:none}.developers-expanded{display:block}div.break{height:1em}div.field{margin-top:0.3em;margin-bottom:0.6em}.disabledbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #cccccc;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #2e6da4;transition:background-color .3s;color:#fff;background-color:#337ab7;cursor:pointer;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton .material-icons,.disabledbutton .material-icons{display:block;float:left;margin-right:0.5ex}input,select,.button{display:inline-block;width:60em;max-width:100%;min-height:1.8em;border-radius:4px;color:#fff;background-color:#101010;border:1px solid #444;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);font-size:90%;text-align:center;vertical-align:middle}input[type="text"]{width:59em;padding-left:0.5em;padding-right:0.5em;text-align:left;box-sizing:border-box}select{min-height:2em}input[type="checkbox"]{width:1.5em;box-shadow:none}input[type="submit"],.button{transition:background-color .3s;color:#fff;background-color:#337ab7;border-color:#2e6da4;cursor:pointer;box-shadow:none;padding-top:0.9ex;padding-bottom:0.9ex}.button{padding-top:1.1ex;padding-bottom:0}input[type="submit"]:active,input[type="submit"]:focus,input[type="submit"]:hover,.button:active,.button:focus,.button:hover,.smallbutton:active,.smallbutton:focus,.smallbutton:hover{color:#fff;background-color:#286090;border-color:#204d74}input[type="submit"]:active,.button:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.button-light{color:#ddd;background-color:#101010;border-color:#444}.button-light:active,.button-light:focus,.button-light:hover{color:#ddd;background-color:#111;border-color:#333}div.notes{margin-top:2em}div.notes ul{margin-top:1em}div.app{max-width:60em;margin-left:auto;margin-right:auto}.navbar-fixed{position:relative;z-index:997}.navbar-fixed nav{position:fixed}nav{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}nav{width:100%;overflow:hidden}nav a{color:#fff}nav .nav-wrapper{position:relative;height:100%}nav i,nav i.material-icons{display:block;font-size:24px}nav .brand-logo{position:absolute;display:inline-block;padding-left:0.5rem}nav ul{margin:0;padding-left:0;list-style-type:none}nav ul li{transition:background-color .3s;float:left;padding:0;list-style-type:none;background-color:#00838f}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}@media only screen and (max-width: 600px){div.app>ul>li{font-size:35%}div.navbar-fixed{height:56px}.moreinfo{top:56px}nav{height:56px;line-height:56px}nav .brand-logo{font-size:1.5rem}nav .nav-wrapper i{height:56px;line-height:56px}}@media only screen and (min-width: 600px){div.app>ul>li{font-size:40%}div.navbar-fixed{height:64px}.moreinfo{top:64px}nav{height:64px;line-height:64px}nav .brand-logo{font-size:2.1rem}nav .nav-wrapper i{height:64px;line-height:64px}}div.app .moreinfo{font-size:100%}
+body{margin:0;color:#fff;background-color:#101010}html{font-family:"Arimo", "Arial", Sans-Serif}a{color:#99f;text-decoration:none}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}p,div.about,div.config,div.input-field,div.notes{max-width:94%;margin-left:auto;margin-right:auto}p{text-align:justify}div.content{width:100%;margin:0}.copyright{margin-top:1em;color:#999;clear:both}.wagonorder{position:relative;width:100%;height:100ex}.wagonorder.exit-unknown .section{left:1em;width:2em}.wagonorder.exit-unknown .wagon{left:3em;min-width:6em}.wagonorder.exit-unknown .details{left:10em;right:0em}.wagonorder.exit-left .section{left:1em;width:2em;background-color:#222}.wagonorder.exit-left .wagon{left:3em;min-width:6em}.wagonorder.exit-left .details{left:10em;right:0em}.wagonorder.exit-right .section{right:1em;width:2em;background-color:#222}.wagonorder.exit-right .wagon{right:3em;min-width:6em}.wagonorder.exit-right .details{right:10em;left:0em;text-align:right}.wagonorder .section{position:absolute;text-align:center}.wagonorder .wagon{position:absolute;border:1px solid #999;padding-left:0.2em;padding-right:0.2em}.wagonorder .wagon .material-icons{color:#bbb}.wagonorder .wagon .direction{position:absolute;left:0.2em;bottom:0;right:0;text-align:center;color:#bbb}.wagonorder .wagon~.wagon{border-top:none}.wagonorder .firstclass{background-color:#330}.wagonorder .powercar{background-color:#222}.wagonorder .nondestwagon{border-style:dashed}.wagonorder .details{position:absolute;padding-top:0.5ex}.wagonorder .details .type{display:inline-block;width:5em;color:#bbb}.wagonorder .details a.type{color:#99f}.wagonorder .details .uicunknown{color:#999}.wagonorder .details .uicexchange{margin-right:0.2em;color:#999}.wagonorder .details .uiccountry{margin-right:0.2em;color:#999}.wagonorder .details .uic5{margin-right:0.2em;color:#999}.wagonorder .details .uic56{color:#bbb;font-weight:bold}.wagonorder .details .uic78{margin-right:0.2em;color:#bbb;font-weight:bold}.wagonorder .details .uic78::before{content:"-"}.wagonorder .details .uictype{margin-right:0.2em;color:#bbb;font-weight:bold}.wagonorder .details .uicno{color:#bbb}.wagonorder .details .uiccheck{color:#999}.wagonorder .details .uiccheck::before{content:"-"}.singlewagon .sign-left{float:left;padding-left:5%}.singlewagon .sign-right{float:right;padding-right:5%}.singlewagon .sign-center{text-align:center}.singlewagon .platform{text-align:center;background-color:#444;font-weight:bold;padding-top:0.5em;padding-bottom:0.5em}.singlewagon img.wagonfile{width:100%;margin-top:0.2em;margin-bottom:0.2em}div.app{border-width:1px 2px;width:100%;margin-bottom:5em}div.app>ul{position:relative;width:100%;list-style-type:none;margin:0;padding:0}div.app>ul>li{min-height:7em;display:block;width:100%;position:relative;border-bottom:1px solid #999;background-color:#101010}div.app>ul>li.cancelled{background-color:#512f00}div.app>ul>li.past{opacity:0.8;background-color:#222}div.app>ul>li>a{color:#fff}div.app>ul>li .anchor{position:relative;top:-12em}div.app>ul>li .line{font-size:2.7em;position:absolute;bottom:5px;left:2px;max-width:6em;max-height:3ex;overflow:hidden}div.app>ul>li .line .trainno{font-weight:normal}div.app>ul>li .line .trainno_sub{font-weight:normal;font-size:0.6em;text-align:center;margin-top:-0.2em}div.app>ul>li .sbahn .trainno_sub{font-weight:normal;font-size:0.5em;text-align:center;margin-top:-0.25em}div.app>ul>li .lineinfo{color:#fff;font-size:2em;position:absolute;top:0px;left:2px}div.app>ul>li .route,div.app>ul>li .info{background-color:transparent;font-size:2.1em;position:absolute;top:0;left:7.7em;right:7em;height:1.5em;overflow:hidden;white-space:nowrap}div.app>ul>li .route{color:#ddd}div.app>ul>li .info{color:#f77}div.app>ul>li .dest,div.app>ul>li .origin{background-color:transparent;font-size:4em;position:absolute;bottom:0;left:4em;width:70%;white-space:nowrap;overflow:hidden;color:#fff}div.app>ul>li .dest{background-color:transparent;color:#fff}div.app>ul>li .origin{background-color:transparent;color:#bbb}div.app>ul>li .origin:before{content:"von "}div.app>ul>li .platform{background-color:transparent;font-size:3em;font-weight:bold;position:absolute;right:5px;bottom:0;padding-left:0.2em;color:#fff}div.app>ul>li .changed-platform{color:#f77}div.app>ul>li .time{background-color:transparent;font-size:2.3em;position:absolute;right:5px;top:1px;padding-left:0.2em;color:#fff}div.app>ul>li .time.delayed{color:#f77;background-color:transparent}div.app>ul>li .time .no-realtime{background-color:transparent;padding-right:1ex}div.app>ul>li .time .no-realtime i.material-icons{font-size:12px}div.app>ul>li .time .delay{font-size:1em;color:#f77;background-color:transparent;padding-right:1ex}div.app>ul>li .time .undelay{font-size:1em;color:#7f7;padding-right:1ex}div.app>ul>li .time .delaynorm{font-size:0.9em;color:#d99}div.app>ul>li .time .undelaynorm{font-size:0.9em;color:#9d9}div.app .trainsubtype{font-weight:normal;font-size:70%;position:relative;vertical-align:baseline;top:-0.6ex;left:-0.5ex}div.app .replacement{color:#afa}div.app .replaced{color:#faa}div.app .sbahn{font-weight:bold;border-radius:30px;padding:3px 6px 2px 6px;background-color:#151}div.app .bahn,div.app .fern,div.app .ext{font-weight:bold;border-radius:5px;padding:3px 5px 2px 5px}div.app .bahn{background-color:#333}div.app .fern{background-color:#511}div.app .ext{border:2px solid #333}div.app .tram,div.app .bus,div.app .ubahn{padding:3px 5px 2px 5px}div.app .tram{background-color:#411}div.app .bus{background-color:#515}div.app .ubahn{background-color:#071e62}div.app .moreinfo{font-size:2.1em;position:fixed;left:0;right:0;bottom:0em;z-index:5;overflow:auto;cursor:default;background-color:#101010}div.app .moreinfo .mheader,div.app .moreinfo .mfooter{max-width:50em;margin-left:auto;margin-right:auto}div.app .moreinfo .mheader{text-align:center;font-size:120%;padding-top:0.5em;padding-bottom:0.5em;padding-left:1em;padding-right:1em;border-bottom:0.1em dashed #cccccc}div.app .moreinfo .mfooter{padding-top:0.5em;padding-left:1em;padding-right:1em}div.app .moreinfo .dataline{font-size:120%;width:100%;display:flex;justify-content:space-between;margin-bottom:0.5em}div.app .moreinfo .dataline>div{width:33%}div.app .moreinfo .wagonorder-preview{font-size:110%;width:100%;text-align:center;margin-bottom:1em}div.app .moreinfo .wagonorder-preview a{color:#fff}div.app .moreinfo .departure{text-align:right}div.app .moreinfo .platform{text-align:center}div.app .moreinfo .arrival{display:inline-block;text-align:right}div.app .moreinfo .loading{text-align:center;width:100%;color:#888888}div.app .moreinfo .minfo{color:#f77}div.app .moreinfo .timehidden{color:#bbb}div.app .moreinfo .undelay{color:#7f7}div.app .moreinfo .verbose{margin-bottom:1em}div.app .moreinfo .verbose .no-realtime{color:#f77}div.app .moreinfo .messages i.material-icons{font-size:14px}div.app .moreinfo .details{margin-top:1em}div.app .moreinfo .mroute .important-stop{color:#fff}div.app .moreinfo .mroute .generic-stop{color:#bbb}div.app .moreinfo .mroute .additional-stop{color:#7f7}div.app .moreinfo .mroute .cancelled-stop{color:#f77}div.app .moreinfo .mroute .past-stop{list-style-type:disc}div.app .moreinfo .mroute .future-stop{list-style-type:circle}div.app .moreinfo .mroute i.material-icons{font-size:14px}div.app .moreinfo .db-attr{margin-bottom:1em}div.app .moreinfo .db-attr span{margin-right:0.5em}div.app .collapsed-moreinfo{display:none}div.app .expanded-moreinfo{display:block}ul.ui-autocomplete{max-height:20em;overflow-x:hidden;overflow-y:auto}div.geolocation{text-align:center}div.candidatestatus{text-align:center;color:#999999}div.candidatelist a{display:block;text-decoration:none;font-size:1.4em;padding-top:0.3em;text-align:center;border-bottom:1px solid #999999}div.candidatelist a .distance:after{content:" km"}div.candidatelist a .distance{font-size:0.6em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.candidatelist a .traininfo{font-size:0.7em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.config{margin-top:2em;font-family:Sans-Serif;color:#bbb}div.config a{color:#99f;cursor:pointer;text-decoration:none}div.about{margin-top:1em;font-family:Sans-Serif;color:#bbb}div.about a{color:#99f;text-decoration:none}.notice{padding:15px;margin-bottom:20px;border:1px solid #bce8f1;border-radius:4px;color:#31708f;background-color:#d9edf7;margin-left:auto;margin-right:auto}.warning{padding:15px;margin-bottom:20px;border:1px solid #faebcc;border-radius:4px;color:#8a6d3b;background-color:#fcf8e3;margin-left:auto;margin-right:auto}.error{padding:15px;margin-bottom:20px;border:1px solid #ebccd1;border-radius:4px;color:#a94442;background-color:#f2dede;margin-left:auto;margin-right:auto}.error .errcode{font-family:Monospace;margin-top:2em;font-size:100%;color:#aaaaaa}.container{max-width:60em;margin-left:auto;margin-right:auto}pre{margin-bottom:2em}span.optional,span.notes{color:#bbb}.moresettings-header{cursor:pointer}.moresettings-header-collapsed:before{content:"▹ "}.moresettings-header-expanded:before{content:"▿ "}.moresettings-collapsed{display:none}.moresettings-expanded{display:block}.developers-header{cursor:pointer}.developers-header-collapsed:before{content:"▹ "}.developers-header-expanded:before{content:"▿ "}.developers-collapsed{display:none}.developers-expanded{display:block}div.break{height:1em}div.field{margin-top:0.3em;margin-bottom:0.6em}.disabledbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #cccccc;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #2e6da4;transition:background-color .3s;color:#fff;background-color:#337ab7;cursor:pointer;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton .material-icons,.disabledbutton .material-icons{display:block;float:left;margin-right:0.5ex}.smallbutton img{display:block;float:left;margin-right:0.7ex;height:1.2em}input,select,.button{display:inline-block;width:60em;max-width:100%;min-height:1.8em;border-radius:4px;color:#fff;background-color:#101010;border:1px solid #444;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);font-size:90%;text-align:center;vertical-align:middle}input[type="text"]{width:59em;padding-left:0.5em;padding-right:0.5em;text-align:left;box-sizing:border-box}select{min-height:2em}input[type="checkbox"]{width:1.5em;box-shadow:none}input[type="submit"],.button{transition:background-color .3s;color:#fff;background-color:#337ab7;border-color:#2e6da4;cursor:pointer;box-shadow:none;padding-top:0.9ex;padding-bottom:0.9ex}.button{padding-top:1.1ex;padding-bottom:0}input[type="submit"]:active,input[type="submit"]:focus,input[type="submit"]:hover,.button:active,.button:focus,.button:hover,.smallbutton:active,.smallbutton:focus,.smallbutton:hover{color:#fff;background-color:#286090;border-color:#204d74}input[type="submit"]:active,.button:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.button-light{color:#ddd;background-color:#101010;border-color:#444}.button-light:active,.button-light:focus,.button-light:hover{color:#ddd;background-color:#111;border-color:#333}div.notes{margin-top:2em}div.notes ul{margin-top:1em}div.app{max-width:60em;margin-left:auto;margin-right:auto}.navbar-fixed{position:relative;z-index:997}.navbar-fixed nav{position:fixed}nav{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}nav{width:100%;overflow:hidden}nav a{color:#fff}nav .nav-wrapper{position:relative;height:100%}nav i,nav i.material-icons{display:block;font-size:24px}nav .brand-logo{position:absolute;display:inline-block;padding-left:0.5rem}nav ul{margin:0;padding-left:0;list-style-type:none}nav ul li{transition:background-color .3s;float:left;padding:0;list-style-type:none;background-color:#00838f}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}@media only screen and (max-width: 600px){div.app>ul>li{font-size:35%}div.navbar-fixed{height:56px}.moreinfo{top:56px}nav{height:56px;line-height:56px}nav .brand-logo{font-size:1.5rem}nav .nav-wrapper i{height:56px;line-height:56px}}@media only screen and (min-width: 600px){div.app>ul>li{font-size:40%}div.navbar-fixed{height:64px}.moreinfo{top:64px}nav{height:64px;line-height:64px}nav .brand-logo{font-size:2.1rem}nav .nav-wrapper i{height:64px;line-height:64px}}div.app .moreinfo{font-size:100%}
diff --git a/public/static/css/default.css b/public/static/css/default.css
index c991b44..ac2eb79 100644
--- a/public/static/css/default.css
+++ b/public/static/css/default.css
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 Daniel Friesel
+ * Copyright (C) 2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
diff --git a/public/static/css/light.min.css b/public/static/css/light.min.css
index d1178a6..f2de094 100644
--- a/public/static/css/light.min.css
+++ b/public/static/css/light.min.css
@@ -1 +1 @@
-body{margin:0;color:#000;background-color:#fff}html{font-family:Sans-Serif}a{color:#009;text-decoration:none}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}p,div.about,div.input-field,div.notes{max-width:94%;margin-left:auto;margin-right:auto}p{text-align:justify}div.content{width:100%;margin:0}.copyright{margin-top:1em;color:#999;clear:both}.wagonorder{position:relative;width:100%;height:100ex}.wagonorder.exit-unknown .section{left:1em;width:2em}.wagonorder.exit-unknown .wagon{left:3em;min-width:6em}.wagonorder.exit-unknown .details{left:10em;right:0em}.wagonorder.exit-left .section{left:1em;width:2em;background-color:#ddd}.wagonorder.exit-left .wagon{left:3em;min-width:6em}.wagonorder.exit-left .details{left:10em;right:0em}.wagonorder.exit-right .section{right:1em;width:2em;background-color:#ddd}.wagonorder.exit-right .wagon{right:3em;min-width:6em}.wagonorder.exit-right .details{right:10em;left:0em;text-align:right}.wagonorder .section{position:absolute;text-align:center}.wagonorder .wagon{position:absolute;border:1px solid #999;padding-left:0.2em;padding-right:0.2em}.wagonorder .wagon .material-icons{color:#666}.wagonorder .wagon .direction{position:absolute;left:0.2em;bottom:0;right:0;text-align:center;color:#666}.wagonorder .wagon~.wagon{border-top:none}.wagonorder .firstclass{background-color:#ff9}.wagonorder .powercar{background-color:#ccc}.wagonorder .nondestwagon{border-style:dashed}.wagonorder .details{position:absolute;padding-top:0.5ex}.wagonorder .details .type{display:inline-block;width:5em;color:#666}.wagonorder .details a.type{color:#009}.wagonorder .details .uicunknown{color:#999}.wagonorder .details .uicexchange{margin-right:0.2em;color:#999}.wagonorder .details .uiccountry{margin-right:0.2em;color:#999}.wagonorder .details .uic5{margin-right:0.2em;color:#999}.wagonorder .details .uic56{color:#666;font-weight:bold}.wagonorder .details .uic78{margin-right:0.2em;color:#666;font-weight:bold}.wagonorder .details .uic78::before{content:"-"}.wagonorder .details .uictype{margin-right:0.2em;color:#666;font-weight:bold}.wagonorder .details .uicno{color:#666}.wagonorder .details .uiccheck{color:#999}.wagonorder .details .uiccheck::before{content:"-"}.singlewagon .sign-left{float:left;padding-left:5%}.singlewagon .sign-right{float:right;padding-right:5%}.singlewagon .sign-center{text-align:center}.singlewagon .platform{text-align:center;background-color:#ccc;font-weight:bold;padding-top:0.5em;padding-bottom:0.5em}.singlewagon img.wagonfile{width:100%;margin-top:0.2em;margin-bottom:0.2em}div.app{border-width:1px 2px;width:100%;margin-bottom:5em}div.app>ul{position:relative;width:100%;list-style-type:none;margin:0;padding:0}div.app>ul>li{min-height:7em;display:block;width:100%;position:relative;border-bottom:1px solid #999;background-color:#fff}div.app>ul>li.cancelled{background-color:#ffe7d0}div.app>ul>li>a{color:#000}div.app>ul>li .anchor{position:relative;top:-12em}div.app>ul>li .line{font-size:2.7em;position:absolute;bottom:5px;left:2px;max-width:6em;max-height:3ex;overflow:hidden}div.app>ul>li .line .trainno{font-weight:normal}div.app>ul>li .line .trainno_sub{font-weight:normal;font-size:0.6em;text-align:center;margin-top:-0.2em}div.app>ul>li .sbahn .trainno_sub{font-weight:normal;font-size:0.5em;text-align:center;margin-top:-0.25em}div.app>ul>li .lineinfo{color:#000;font-size:2em;position:absolute;top:0px;left:2px}div.app>ul>li .route{background-color:transparent;font-size:2.1em;position:absolute;top:1px;left:7.7em;right:7em;height:1.2em;overflow:hidden;color:#444}div.app>ul>li .info{color:red;background-color:transparent;font-size:2.1em;position:absolute;top:1px;left:7.7em;right:7em;height:1.2em;overflow:hidden}div.app>ul>li .dest{background-color:transparent;font-size:4em;position:absolute;top:0.62em;left:4em;bottom:0px;width:70%;overflow:hidden;color:#000}div.app>ul>li .origin{background-color:transparent;font-size:4em;position:absolute;top:0.62em;left:4em;bottom:0px;width:70%;overflow:hidden;color:#666}div.app>ul>li .origin:before{content:"von "}div.app>ul>li .platform{background-color:transparent;font-size:3em;font-weight:bold;position:absolute;right:5px;bottom:2px;padding-left:0.2em;color:#000}div.app>ul>li .changed-platform{color:red}div.app>ul>li .time{background-color:transparent;font-size:2.3em;position:absolute;right:5px;top:4px;padding-left:0.2em;color:#000}div.app>ul>li .time.delayed{color:red;background-color:transparent}div.app>ul>li .time .no-realtime{background-color:transparent;padding-right:1ex}div.app>ul>li .time .no-realtime i.material-icons{font-size:12px}div.app>ul>li .time .delay{font-size:1em;color:red;background-color:transparent;padding-right:1ex}div.app>ul>li .time .undelay{font-size:1em;color:#060;padding-right:1ex}div.app>ul>li .time .delaynorm{font-size:0.9em;color:#b33;padding-right:1ex}div.app>ul>li .time .undelaynorm{font-size:0.9em;color:#383;padding-right:1ex}div.app .trainsubtype{font-weight:normal;font-size:70%;position:relative;vertical-align:baseline;top:-0.6ex;left:-0.5ex}div.app .replacement{color:#060}div.app .replaced{color:#600}div.app .sbahn{font-weight:bold;border-radius:30px;padding:3px 6px 2px 6px;background-color:#95d79f}div.app .bahn,div.app .fern,div.app .ext{font-weight:bold;border-radius:5px;padding:3px 5px 2px 5px}div.app .bahn{background-color:#eee}div.app .fern{background-color:#fdd}div.app .ext{border:2px solid #eee}div.app .moreinfo{font-size:2.1em;position:fixed;left:0;right:0;bottom:0em;z-index:5;overflow:auto;cursor:default;background-color:#fff}div.app .moreinfo .mheader,div.app .moreinfo .mfooter{max-width:50em;margin-left:auto;margin-right:auto}div.app .moreinfo .mheader{text-align:center;font-size:120%;padding-top:0.5em;padding-bottom:0.5em;padding-left:1em;padding-right:1em;border-bottom:0.1em dashed #cccccc}div.app .moreinfo .mfooter{padding-top:0.5em;padding-left:1em;padding-right:1em}div.app .moreinfo .dataline{font-size:120%;width:100%;display:flex;justify-content:space-between;margin-bottom:1em}div.app .moreinfo .dataline>div{width:33%}div.app .moreinfo .departure{text-align:right}div.app .moreinfo .platform{text-align:center}div.app .moreinfo .arrival{display:inline-block;text-align:right}div.app .moreinfo .loading{text-align:center;width:100%;color:#888888}div.app .moreinfo .minfo{color:red}div.app .moreinfo .undelay{color:#060}div.app .moreinfo .verbose{margin-bottom:1em}div.app .moreinfo .verbose .no-realtime{color:#c00}div.app .moreinfo .mroute .important-stop{color:#000}div.app .moreinfo .mroute .generic-stop{color:#666}div.app .moreinfo .mroute .additional-stop{color:#090}div.app .moreinfo .mroute .cancelled-stop{color:#c00}div.app .moreinfo .mroute .past-stop{list-style-type:disc}div.app .moreinfo .mroute .future-stop{list-style-type:circle}div.app .moreinfo .db-attr{margin-bottom:1em}div.app .moreinfo .db-attr span{margin-right:0.5em}div.app .collapsed-moreinfo{display:none}div.app .expanded-moreinfo{display:block}ul.ui-autocomplete{max-height:20em;overflow-x:hidden;overflow-y:auto}div.geolocation{text-align:center}div.candidatestatus{text-align:center;color:#999999}div.candidatelist a{display:block;text-decoration:none;font-size:1.4em;padding-top:0.3em;text-align:center;border-bottom:1px solid #999999}div.candidatelist a .distance:after{content:" km"}div.candidatelist a .distance{font-size:0.6em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.candidatelist a .traininfo{font-size:0.7em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.about{margin-top:2em;font-family:Sans-Serif;color:#666}div.about a{color:#009;text-decoration:none}.notice{padding:15px;margin-bottom:20px;border:1px solid #bce8f1;border-radius:4px;color:#31708f;background-color:#d9edf7;margin-left:auto;margin-right:auto}.warning{padding:15px;margin-bottom:20px;border:1px solid #faebcc;border-radius:4px;color:#8a6d3b;background-color:#fcf8e3;margin-left:auto;margin-right:auto}.error{padding:15px;margin-bottom:20px;border:1px solid #ebccd1;border-radius:4px;color:#a94442;background-color:#f2dede;margin-left:auto;margin-right:auto}.error .errcode{font-family:Monospace;margin-top:2em;font-size:100%;color:#aaaaaa}.container{max-width:60em;margin-left:auto;margin-right:auto}pre{margin-bottom:2em}span.optional,span.notes{color:#666}.moresettings-header{cursor:pointer}.moresettings-header-collapsed:before{content:"▹ "}.moresettings-header-expanded:before{content:"▿ "}.moresettings-collapsed{display:none}.moresettings-expanded{display:block}.developers-header{cursor:pointer}.developers-header-collapsed:before{content:"▹ "}.developers-header-expanded:before{content:"▿ "}.developers-collapsed{display:none}.developers-expanded{display:block}div.break{height:1em}div.field{margin-top:0.3em;margin-bottom:0.6em}.disabledbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #cccccc;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #2e6da4;transition:background-color .3s;color:#fff;background-color:#337ab7;cursor:pointer;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton .material-icons,.disabledbutton .material-icons{display:block;float:left;margin-right:0.5ex}input,select,.button{display:inline-block;width:60em;max-width:100%;min-height:1.8em;border-radius:4px;color:#000;background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);font-size:90%;text-align:center;vertical-align:middle}input[type="text"]{width:59em;padding-left:0.5em;padding-right:0.5em;text-align:left;box-sizing:border-box}select{min-height:2em}input[type="checkbox"]{width:1.5em;box-shadow:none}input[type="submit"],.button{transition:background-color .3s;color:#fff;background-color:#337ab7;border-color:#2e6da4;cursor:pointer;box-shadow:none;padding-top:0.9ex;padding-bottom:0.9ex}.button{padding-top:1.1ex;padding-bottom:0}input[type="submit"]:active,input[type="submit"]:focus,input[type="submit"]:hover,.button:active,.button:focus,.button:hover,.smallbutton:active,.smallbutton:focus,.smallbutton:hover{color:#fff;background-color:#286090;border-color:#204d74}input[type="submit"]:active,.button:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.button-light{color:#333;background-color:#fff;border-color:#ccc}.button-light:active,.button-light:focus,.button-light:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}div.notes{margin-top:2em}div.notes ul{margin-top:1em}div.app{max-width:60em;margin-left:auto;margin-right:auto}.navbar-fixed{position:relative;z-index:997}.navbar-fixed nav{position:fixed}nav{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}nav{width:100%;overflow:hidden}nav a{color:#fff}nav .nav-wrapper{position:relative;height:100%}nav i,nav i.material-icons{display:block;font-size:24px}nav .brand-logo{position:absolute;display:inline-block;padding-left:0.5rem}nav ul{margin:0;padding-left:0;list-style-type:none}nav ul li{transition:background-color .3s;float:left;padding:0;list-style-type:none;background-color:#00838f}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}@media only screen and (max-width: 600px){div.app>ul>li{font-size:35%}div.navbar-fixed{height:56px}.moreinfo{top:56px}nav{height:56px;line-height:56px}nav .brand-logo{font-size:1.5rem}nav .nav-wrapper i{height:56px;line-height:56px}}@media only screen and (min-width: 600px){div.app>ul>li{font-size:40%}div.navbar-fixed{height:64px}.moreinfo{top:64px}nav{height:64px;line-height:64px}nav .brand-logo{font-size:2.1rem}nav .nav-wrapper i{height:64px;line-height:64px}}div.app .moreinfo{font-size:100%}
+body{margin:0;color:#000;background-color:#fff}html{font-family:"Arimo", "Arial", Sans-Serif}a{color:#009;text-decoration:none}.visually-hidden{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}p,div.about,div.config,div.input-field,div.notes{max-width:94%;margin-left:auto;margin-right:auto}p{text-align:justify}div.content{width:100%;margin:0}.copyright{margin-top:1em;color:#999;clear:both}.wagonorder{position:relative;width:100%;height:100ex}.wagonorder.exit-unknown .section{left:1em;width:2em}.wagonorder.exit-unknown .wagon{left:3em;min-width:6em}.wagonorder.exit-unknown .details{left:10em;right:0em}.wagonorder.exit-left .section{left:1em;width:2em;background-color:#ddd}.wagonorder.exit-left .wagon{left:3em;min-width:6em}.wagonorder.exit-left .details{left:10em;right:0em}.wagonorder.exit-right .section{right:1em;width:2em;background-color:#ddd}.wagonorder.exit-right .wagon{right:3em;min-width:6em}.wagonorder.exit-right .details{right:10em;left:0em;text-align:right}.wagonorder .section{position:absolute;text-align:center}.wagonorder .wagon{position:absolute;border:1px solid #999;padding-left:0.2em;padding-right:0.2em}.wagonorder .wagon .material-icons{color:#666}.wagonorder .wagon .direction{position:absolute;left:0.2em;bottom:0;right:0;text-align:center;color:#666}.wagonorder .wagon~.wagon{border-top:none}.wagonorder .firstclass{background-color:#ff9}.wagonorder .powercar{background-color:#ccc}.wagonorder .nondestwagon{border-style:dashed}.wagonorder .details{position:absolute;padding-top:0.5ex}.wagonorder .details .type{display:inline-block;width:5em;color:#666}.wagonorder .details a.type{color:#009}.wagonorder .details .uicunknown{color:#999}.wagonorder .details .uicexchange{margin-right:0.2em;color:#999}.wagonorder .details .uiccountry{margin-right:0.2em;color:#999}.wagonorder .details .uic5{margin-right:0.2em;color:#999}.wagonorder .details .uic56{color:#666;font-weight:bold}.wagonorder .details .uic78{margin-right:0.2em;color:#666;font-weight:bold}.wagonorder .details .uic78::before{content:"-"}.wagonorder .details .uictype{margin-right:0.2em;color:#666;font-weight:bold}.wagonorder .details .uicno{color:#666}.wagonorder .details .uiccheck{color:#999}.wagonorder .details .uiccheck::before{content:"-"}.singlewagon .sign-left{float:left;padding-left:5%}.singlewagon .sign-right{float:right;padding-right:5%}.singlewagon .sign-center{text-align:center}.singlewagon .platform{text-align:center;background-color:#ccc;font-weight:bold;padding-top:0.5em;padding-bottom:0.5em}.singlewagon img.wagonfile{width:100%;margin-top:0.2em;margin-bottom:0.2em}div.app{border-width:1px 2px;width:100%;margin-bottom:5em}div.app>ul{position:relative;width:100%;list-style-type:none;margin:0;padding:0}div.app>ul>li{min-height:7em;display:block;width:100%;position:relative;border-bottom:1px solid #999;background-color:#fff}div.app>ul>li.cancelled{background-color:#ffe7d0}div.app>ul>li.past{opacity:0.8;background-color:#ddd}div.app>ul>li>a{color:#000}div.app>ul>li .anchor{position:relative;top:-12em}div.app>ul>li .line{font-size:2.7em;position:absolute;bottom:5px;left:2px;max-width:6em;max-height:3ex;overflow:hidden}div.app>ul>li .line .trainno{font-weight:normal}div.app>ul>li .line .trainno_sub{font-weight:normal;font-size:0.6em;text-align:center;margin-top:-0.2em}div.app>ul>li .sbahn .trainno_sub{font-weight:normal;font-size:0.5em;text-align:center;margin-top:-0.25em}div.app>ul>li .lineinfo{color:#000;font-size:2em;position:absolute;top:0px;left:2px}div.app>ul>li .route,div.app>ul>li .info{background-color:transparent;font-size:2.1em;position:absolute;top:0;left:7.7em;right:7em;height:1.5em;overflow:hidden;white-space:nowrap}div.app>ul>li .route{color:#444}div.app>ul>li .info{color:red}div.app>ul>li .dest,div.app>ul>li .origin{background-color:transparent;font-size:4em;position:absolute;bottom:0;left:4em;width:70%;white-space:nowrap;overflow:hidden;color:#000}div.app>ul>li .dest{background-color:transparent;color:#000}div.app>ul>li .origin{background-color:transparent;color:#666}div.app>ul>li .origin:before{content:"von "}div.app>ul>li .platform{background-color:transparent;font-size:3em;font-weight:bold;position:absolute;right:5px;bottom:0;padding-left:0.2em;color:#000}div.app>ul>li .changed-platform{color:red}div.app>ul>li .time{background-color:transparent;font-size:2.3em;position:absolute;right:5px;top:1px;padding-left:0.2em;color:#000}div.app>ul>li .time.delayed{color:red;background-color:transparent}div.app>ul>li .time .no-realtime{background-color:transparent;padding-right:1ex}div.app>ul>li .time .no-realtime i.material-icons{font-size:12px}div.app>ul>li .time .delay{font-size:1em;color:red;background-color:transparent;padding-right:1ex}div.app>ul>li .time .undelay{font-size:1em;color:#060;padding-right:1ex}div.app>ul>li .time .delaynorm{font-size:0.9em;color:#b33}div.app>ul>li .time .undelaynorm{font-size:0.9em;color:#383}div.app .trainsubtype{font-weight:normal;font-size:70%;position:relative;vertical-align:baseline;top:-0.6ex;left:-0.5ex}div.app .replacement{color:#060}div.app .replaced{color:#600}div.app .sbahn{font-weight:bold;border-radius:30px;padding:3px 6px 2px 6px;background-color:#95d79f}div.app .bahn,div.app .fern,div.app .ext{font-weight:bold;border-radius:5px;padding:3px 5px 2px 5px}div.app .bahn{background-color:#eee}div.app .fern{background-color:#fdd}div.app .ext{border:2px solid #eee}div.app .tram,div.app .bus,div.app .ubahn{padding:3px 5px 2px 5px}div.app .tram{background-color:#fcc}div.app .bus{background-color:#eae}div.app .ubahn{background-color:#aac0ff}div.app .moreinfo{font-size:2.1em;position:fixed;left:0;right:0;bottom:0em;z-index:5;overflow:auto;cursor:default;background-color:#fff}div.app .moreinfo .mheader,div.app .moreinfo .mfooter{max-width:50em;margin-left:auto;margin-right:auto}div.app .moreinfo .mheader{text-align:center;font-size:120%;padding-top:0.5em;padding-bottom:0.5em;padding-left:1em;padding-right:1em;border-bottom:0.1em dashed #cccccc}div.app .moreinfo .mfooter{padding-top:0.5em;padding-left:1em;padding-right:1em}div.app .moreinfo .dataline{font-size:120%;width:100%;display:flex;justify-content:space-between;margin-bottom:0.5em}div.app .moreinfo .dataline>div{width:33%}div.app .moreinfo .wagonorder-preview{font-size:110%;width:100%;text-align:center;margin-bottom:1em}div.app .moreinfo .wagonorder-preview a{color:#000}div.app .moreinfo .departure{text-align:right}div.app .moreinfo .platform{text-align:center}div.app .moreinfo .arrival{display:inline-block;text-align:right}div.app .moreinfo .loading{text-align:center;width:100%;color:#888888}div.app .moreinfo .minfo{color:red}div.app .moreinfo .timehidden{color:#666}div.app .moreinfo .undelay{color:#060}div.app .moreinfo .verbose{margin-bottom:1em}div.app .moreinfo .verbose .no-realtime{color:#c00}div.app .moreinfo .messages i.material-icons{font-size:14px}div.app .moreinfo .details{margin-top:1em}div.app .moreinfo .mroute .important-stop{color:#000}div.app .moreinfo .mroute .generic-stop{color:#666}div.app .moreinfo .mroute .additional-stop{color:#090}div.app .moreinfo .mroute .cancelled-stop{color:#c00}div.app .moreinfo .mroute .past-stop{list-style-type:disc}div.app .moreinfo .mroute .future-stop{list-style-type:circle}div.app .moreinfo .mroute i.material-icons{font-size:14px}div.app .moreinfo .db-attr{margin-bottom:1em}div.app .moreinfo .db-attr span{margin-right:0.5em}div.app .collapsed-moreinfo{display:none}div.app .expanded-moreinfo{display:block}ul.ui-autocomplete{max-height:20em;overflow-x:hidden;overflow-y:auto}div.geolocation{text-align:center}div.candidatestatus{text-align:center;color:#999999}div.candidatelist a{display:block;text-decoration:none;font-size:1.4em;padding-top:0.3em;text-align:center;border-bottom:1px solid #999999}div.candidatelist a .distance:after{content:" km"}div.candidatelist a .distance{font-size:0.6em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.candidatelist a .traininfo{font-size:0.7em;color:#999999;padding-top:0.2em;padding-bottom:0.3em}div.config{margin-top:2em;font-family:Sans-Serif;color:#666}div.config a{color:#009;cursor:pointer;text-decoration:none}div.about{margin-top:1em;font-family:Sans-Serif;color:#666}div.about a{color:#009;text-decoration:none}.notice{padding:15px;margin-bottom:20px;border:1px solid #bce8f1;border-radius:4px;color:#31708f;background-color:#d9edf7;margin-left:auto;margin-right:auto}.warning{padding:15px;margin-bottom:20px;border:1px solid #faebcc;border-radius:4px;color:#8a6d3b;background-color:#fcf8e3;margin-left:auto;margin-right:auto}.error{padding:15px;margin-bottom:20px;border:1px solid #ebccd1;border-radius:4px;color:#a94442;background-color:#f2dede;margin-left:auto;margin-right:auto}.error .errcode{font-family:Monospace;margin-top:2em;font-size:100%;color:#aaaaaa}.container{max-width:60em;margin-left:auto;margin-right:auto}pre{margin-bottom:2em}span.optional,span.notes{color:#666}.moresettings-header{cursor:pointer}.moresettings-header-collapsed:before{content:"▹ "}.moresettings-header-expanded:before{content:"▿ "}.moresettings-collapsed{display:none}.moresettings-expanded{display:block}.developers-header{cursor:pointer}.developers-header-collapsed:before{content:"▹ "}.developers-header-expanded:before{content:"▿ "}.developers-collapsed{display:none}.developers-expanded{display:block}div.break{height:1em}div.field{margin-top:0.3em;margin-bottom:0.6em}.disabledbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #cccccc;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton{display:inline-block;vertical-align:baseline;border-radius:4px;border:1px solid #2e6da4;transition:background-color .3s;color:#fff;background-color:#337ab7;cursor:pointer;box-shadow:none;padding:0.9ex;margin-right:1em}.smallbutton .material-icons,.disabledbutton .material-icons{display:block;float:left;margin-right:0.5ex}.smallbutton img{display:block;float:left;margin-right:0.7ex;height:1.2em}input,select,.button{display:inline-block;width:60em;max-width:100%;min-height:1.8em;border-radius:4px;color:#000;background-color:#fff;border:1px solid #ccc;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);font-size:90%;text-align:center;vertical-align:middle}input[type="text"]{width:59em;padding-left:0.5em;padding-right:0.5em;text-align:left;box-sizing:border-box}select{min-height:2em}input[type="checkbox"]{width:1.5em;box-shadow:none}input[type="submit"],.button{transition:background-color .3s;color:#fff;background-color:#337ab7;border-color:#2e6da4;cursor:pointer;box-shadow:none;padding-top:0.9ex;padding-bottom:0.9ex}.button{padding-top:1.1ex;padding-bottom:0}input[type="submit"]:active,input[type="submit"]:focus,input[type="submit"]:hover,.button:active,.button:focus,.button:hover,.smallbutton:active,.smallbutton:focus,.smallbutton:hover{color:#fff;background-color:#286090;border-color:#204d74}input[type="submit"]:active,.button:active{box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.button-light{color:#333;background-color:#fff;border-color:#ccc}.button-light:active,.button-light:focus,.button-light:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}div.notes{margin-top:2em}div.notes ul{margin-top:1em}div.app{max-width:60em;margin-left:auto;margin-right:auto}.navbar-fixed{position:relative;z-index:997}.navbar-fixed nav{position:fixed}nav{box-shadow:0 2px 2px 0 rgba(0,0,0,0.14),0 3px 1px -2px rgba(0,0,0,0.12),0 1px 5px 0 rgba(0,0,0,0.2)}nav{width:100%;overflow:hidden}nav a{color:#fff}nav .nav-wrapper{position:relative;height:100%}nav i,nav i.material-icons{display:block;font-size:24px}nav .brand-logo{position:absolute;display:inline-block;padding-left:0.5rem}nav ul{margin:0;padding-left:0;list-style-type:none}nav ul li{transition:background-color .3s;float:left;padding:0;list-style-type:none;background-color:#00838f}nav ul a{transition:background-color .3s;font-size:1rem;color:#fff;display:block;padding:0 15px;cursor:pointer}@media only screen and (max-width: 600px){div.app>ul>li{font-size:35%}div.navbar-fixed{height:56px}.moreinfo{top:56px}nav{height:56px;line-height:56px}nav .brand-logo{font-size:1.5rem}nav .nav-wrapper i{height:56px;line-height:56px}}@media only screen and (min-width: 600px){div.app>ul>li{font-size:40%}div.navbar-fixed{height:64px}.moreinfo{top:64px}nav{height:64px;line-height:64px}nav .brand-logo{font-size:2.1rem}nav .nav-wrapper i{height:64px;line-height:64px}}div.app .moreinfo{font-size:100%}
diff --git a/public/static/css/material-icons.css b/public/static/css/material-icons.css
index 3ef93fd..7f0681f 100644
--- a/public/static/css/material-icons.css
+++ b/public/static/css/material-icons.css
@@ -2,12 +2,12 @@
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
- src: url(/static/v57/fonts/MaterialIcons-Regular.eot); /* For IE6-8 */
+ src: url(/static/v90/fonts/MaterialIcons-Regular.eot); /* For IE6-8 */
src: local('Material Icons'),
local('MaterialIcons-Regular'),
- url(/static/v57/fonts/MaterialIcons-Regular.woff2) format('woff2'),
- url(/static/v57/fonts/MaterialIcons-Regular.woff) format('woff'),
- url(/static/v57/fonts/MaterialIcons-Regular.ttf) format('truetype');
+ url(/static/v90/fonts/MaterialIcons-Regular.woff2) format('woff2'),
+ url(/static/v90/fonts/MaterialIcons-Regular.woff) format('woff'),
+ url(/static/v90/fonts/MaterialIcons-Regular.ttf) format('truetype');
}
.material-icons {
diff --git a/public/static/css/mobile.css b/public/static/css/mobile.css
index c75ccf1..0bf84d4 100644
--- a/public/static/css/mobile.css
+++ b/public/static/css/mobile.css
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 Daniel Friesel
+ * Copyright (C) 2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
diff --git a/public/static/icons/bahn-expert.svg b/public/static/icons/bahn-expert.svg
new file mode 100644
index 0000000..4cee072
--- /dev/null
+++ b/public/static/icons/bahn-expert.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="910.683" height="911.613" viewBox="0 0 240.952 241.198">
+ <path
+ d="M156.283 14.31l-76.155.03a6.102 6.102 0 0 0-.247 12.197c7.448.304 14.872 2.649 21.144 6.675 3.91 2.511 7.182 5.608 9.07 9.101.5.927.916 1.91 1.243 2.925-8.798.583-18.387 1.932-27.009 3.806-5.011 1.088-10.013 2.373-14.69 4.477-4.679 2.103-9.011 5.062-12.391 8.92-3.38 3.858-5.735 8.575-6.962 13.555-1.228 4.98-1.322 10.16-1.322 15.29v72.291c0 4.87.066 9.793 1.25 14.517 1.183 4.724 3.513 9.198 6.957 12.642 3.444 3.444 7.918 5.774 12.642 6.957 3.2.802 6.492 1.086 9.797 1.19l-21.18 31.596h16.19l8.39-12.515 75.786.067 8.284 12.355h16.189l-21.134-31.528c3.038-.124 6.059-.427 9.003-1.164 4.724-1.184 9.199-3.514 12.642-6.957 3.444-3.444 5.774-7.918 6.958-12.642 1.183-4.724 1.25-9.647 1.25-14.517V91.286c0-5.117-.096-10.285-1.328-15.25-1.232-4.967-3.594-9.668-6.98-13.504-3.385-3.837-7.72-6.77-12.393-8.853-4.674-2.083-9.666-3.351-14.665-4.44-9.599-2.092-18.512-3.595-28.316-4.119a20.03 20.03 0 0 1 1.782-3.754c1.785-2.919 4.444-5.549 7.575-7.78a39.466 39.466 0 0 1 19.172-7.098 6.102 6.102 0 0 0 5.522-6.351c-.148-3.25-2.82-5.797-6.074-5.826zm-29.096 12.215c-2.77 2.395-5.38 5.062-7.415 8.356-2.037-3.255-4.554-6.019-7.34-8.35zm-20.641 47.72c8.312 0 14.465 1.246 18.458 3.74 7.254-2.494 13.895-3.74 19.926-3.74 8.639 0 15.118 1.473 19.437 4.42 4.32 2.946 6.479 8.197 6.479 15.751v39.324h-22.249V99.403c0-2.947-.855-5.062-2.567-6.346-1.71-1.36-4.237-2.04-7.579-2.04-1.467 0-2.77.188-3.912.566-1.14.378-1.833.794-2.078 1.247v40.91h-22.248V99.403c0-2.947-.856-5.062-2.567-6.346-1.712-1.36-4.238-2.04-7.58-2.04-1.466 0-2.77.188-3.911.566-1.141.378-1.834.794-2.078 1.247v40.91H71.829V81.044c2.852-1.435 8.027-2.908 15.524-4.42 7.498-1.586 13.896-2.379 19.193-2.379zM83.483 152.82c7.27 0 13.165 5.895 13.165 13.166 0 7.27-5.894 13.165-13.165 13.165-7.271 0-13.166-5.894-13.166-13.165 0-7.271 5.895-13.166 13.166-13.166zm74.655 0c7.272 0 13.166 5.895 13.166 13.166 0 7.27-5.895 13.165-13.166 13.165-7.27 0-13.165-5.894-13.165-13.165 0-7.271 5.894-13.166 13.165-13.166zm-62.375 46.122H146l5.975 8.913-62.15-.054z"
+ fill="#FFF" />
+</svg>
diff --git a/public/static/js/autocomplete.js b/public/static/js/autocomplete.js
deleted file mode 100644
index 4e12af2..0000000
--- a/public/static/js/autocomplete.js
+++ /dev/null
@@ -1,8 +0,0 @@
-$(function() {
- var stations = ["Aachen Hbf","Aachen Schanz","Aachen West","Aachen-Rothe Erde","Aalen Hbf","Aalten","Aalter","Aarau","Aarburg-Oftringen","Abcoude","Abenden","Abensberg","Achern","Achern Stadt","Achiet","Achim","Achkarren","Achmer","Achterwehr","Adelebsen","Adelschlag","Adelsdorf(Mittelfr)","Adelsheim Nord","Adelsheim Ost","Adorf(Erzgeb)","Adorf(Vogtl)","Affaltrach","Affoltern am Albis","Agatharied","Agathenburg","Agde","Aglasterhausen","Aha","Ahaus","Ahlbeck Grenze","Ahlbeck Ostseetherme","Ahlen(Westf)","Ahlhorn","Ahlten","Ahnatal Casselbreite","Ahnatal-Heckershausen","Ahnatal-Weimar","Ahrbrück","Ahrensburg","Ahrensburg-Gartenholz","Ahrensfelde","Ahrensfelde (S)","Ahrensfelde Friedhof","Ahrensfelde Nord","Ahrweiler","Ahrweiler Markt","Aich(Niederbay)","Aichach","Aichstetten","Aigle","Aime-la-Plagne","Aindorf","Ainring","Airolo","Aix-en-Provence TGV","Aix-les-Bains-le-Revard","Akkrum","Alassio","Alba Iulia","Albate-Camerlata","Albbruck","Albenga","Albersdorf","Albersweiler(Pfalz)","Albertville","Albgaubad, Ettlingen","Albig","Albrechtshaus","Albrechtshof","Albshausen","Albsheim(Eis)","Albstadt-Ebingen","Albstadt-Ebingen West","Albstadt-Laufen Ort","Albstadt-Lautlingen","Aldekerk","Aldingen(b Spaichingen)","Alençon","Ales","Aletshausen","Alexisbad","Alfeld(Leine)","Alfter-Impekoven","Alfter-Witterschlick","Algermissen","Aligse","Alken(B)","Alkmaar","Alkmaar Noord","Allendorf(Dillkr)","Allendorf(Eder) Bf","Allensbach","Allerheiligenhöfe","Allersberg(Rothsee)","Allmendingen","Almelo","Almelo de Riet","Almere Buiten","Almere Centrum","Almere Muziekwijk","Almere Oostvaarders","Almere Parkwijk","Almere Poort","Alpen","Alphen aan den Rijn","Alpirsbach","Alsdorf Poststraße","Alsdorf(Westerw)","Alsdorf-Annapark","Alsdorf-Busch","Alsdorf-Kellersberg","Alsdorf-Mariadorf","Alsenz","Alsfeld(Oberhess)","Alsheim","Alt Hüttendorf","Alt Rosenthal","Alt Schwerin","Altach","Altbach","Altdorf West","Altdorf(CH)","Altdorf(Niederbay)","Altdorf(b Nürnberg)","Altdöbern","Alte Veste","Altefähr","Altena(Westf)","Altenahr","Altenau(Bay)","Altenbach","Altenbamberg","Altenbeken","Altenberge","Altenburg","Altendorf(CH)","Altenerding","Altenfeld(Rhön)","Altenglan","Altengörs","Altenhasungen","Altenkirchen(Westerwald)","Altenmarkt im Pongau","Altenmarkt(Alz)","Altenseelbach","Altenstadt(Hess)","Altenstadt(Iller)","Altenstadt(Waldnaab)","Altenstadt-Höchst","Altenstadt-Lindheim","Altentreptow","Altenwillershagen","Altersbach","Altes Lager","Altglashütten-Falkau","Althegnenberg","Altheim(Hess)","Althof","Altingen(Württ)","Altmarkt/Regierungspräsidium, Kassel","Altmittweida","Altmorschen","Altnau","Altomünster","Altoschatz-Rosenthal","Altranft","Altshausen","Altstädten(Allgäu)","Altstätten SG","Alttann","Altötting","Alveslohe","Alvesta station","Alzenau Burg","Alzenau Nord","Alzenau(Unterfr)","Alzey","Alzey Süd","Alzey West","Am Kupferhammer, Kassel","Am Stern, Kassel","Am Weinberg, Kassel","Amberg","Amberieu","Amerang","Amersfoort Centraal","Amersfoort Schothorst","Amersfoort Vathorst","Ammern","Amorbach","Ampfing","Amriswil","Amsdorf","Amsterdam Amstel","Amsterdam Bijlmer ArenA","Amsterdam Centraal","Amsterdam Holendrecht","Amsterdam Lelylaan","Amsterdam Muiderpoort","Amsterdam RAI","Amsterdam Science Park","Amsterdam Sloterdijk","Amsterdam Zuid","Amstetten NÖ","Amstetten(W) Lokalbahn","Amstetten(Württ)","Amtshainersdorf","Andelfingen","Andermatt","Andernach","Andorf","Angermund","Angermünde","Angern-Rogätz","Angersbach","Angersdorf","Angleur","Angouleme","Anklam","Anna Paulowna","Annaberg-Buchholz Mitte","Annaberg-Buchholz Süd","Annaberg-Buchholz unterer Bf","Annaburg","Annweiler am Trifels","Annweiler-Sarnstall","Anrath","Ans(B)","Ansbach","Antibes","Antonsthal","Antwerpen Centraal","Antwerpen-Berchem","Antwerpen-Zuid","Anwanden","Anzefahr","Anzenkirchen","Apach(Moselle)","Apeldoorn","Apeldoorn De Maten","Apeldoorn Osseveld","Apensen","Apolda","Appenweier","Appingedam","Arad","Arbon","Arbon (See)","Arbste","Ardey","Arensdorf(Köthen)","Arenshausen","Arfurt(Lahn)","Argeles-sur-Mer","Arkel","Arles","Arlon","Armsheim","Arnbach","Arnemuiden","Arnhem Centraal","Arnhem Presikhaaf","Arnhem Velperpoort","Arnhem Zuid","Arnoldstein","Arnsberg(Westf)","Arnschwang","Arnsdorf(Dresden)","Arnstadt Hbf","Arnstadt Süd","Arosa","Arrach","Arras(F)","Arsbeck","Artenay(Loiret)","Artern","Arth-Goldau","Arvant","Arzberg(Oberfr)","As(CZ)","Aschaffenburg Hbf","Aschaffenburg Hochschule","Aschaffenburg Süd","Aschau(Chiemgau)","Ascheberg(Holst)","Ascheberg(Westf)","Aschendorf","Aschersleben","Ashausen","Ashford(Kent)","Ashford(Kent) Int.","Asperg","Asse","Asselheim","Assen","Assenheim(Oberhess)","Assmannshausen","Attendorn","Attendorn-Hohen Hagen","Attnang-Puchheim","Au SG","Au ZH","Au im Murgtal","Au(Sieg)","Aue(Sachs)","Aue(Sachs) Erzgebirgsstadion","Aue-Wingeshausen","Auehütte","Auerbach(V) ob Bf","Auerbach(V) unt Bf","Auerbach(Vogtl) Hp","Auerbach(b Mosbach, Baden)","Auersmacher","Auestadion, Kassel","Aufhausen(Württ)","Aufhausen(b Erding)","Auggen","Augsburg Haunstetterstraße","Augsburg Hbf","Augsburg Messe","Augsburg Morellstr.","Augsburg-Hochzoll","Augsburg-Oberhausen","August-Bebel-Straße, Karlsruhe","Augustfehn","Augustusburg Bergstation","Aukrug","Aulendorf","Aulnoye Aymeries","Aumenau","Aumühle","Auneau(Dourdan)","Auringen-Medenbach","Auvelais","Auw an der Kyll","Außenried","Avesnes-sur-Helpe","Avignon Centre","Avignon TGV","Aying","Aßlar","Aßling(Oberbay)","Baabe","Baalberge","Baar(CH)","Baar-Ebenhausen","Baarn","Babenhausen Langstadt","Babenhausen(Hess)","Babstadt","Babylon","Bacharach","Bachern","Bachfeld","Bachheim","Backnang","Bad Abbach","Bad Aibling","Bad Aibling Kurpark","Bad Arolsen","Bad Aussee","Bad Bellingen","Bad Belzig","Bad Bentheim","Bad Bergzabern","Bad Berka","Bad Berka Zeughausplatz","Bad Berleburg","Bad Bevensen","Bad Birnbach","Bad Blankenburg(Thüringerw)","Bad Blumau","Bad Bodendorf","Bad Bodenteich","Bad Brambach","Bad Bramstedt","Bad Bramstedt Kurhaus","Bad Breisig","Bad Camberg","Bad Doberan","Bad Doberan Goethestraße","Bad Doberan Stadtmitte","Bad Driburg(Westf)","Bad Dürkheim","Bad Dürkheim-Trift","Bad Dürrenberg","Bad Elster","Bad Ems","Bad Ems West","Bad Endorf","Bad Fallingbostel","Bad Freienwalde","Bad Friedrichshall Hbf","Bad Friedrichshall-Kochendorf","Bad Gandersheim","Bad Gastein","Bad Griesbach(Schwarzwald)","Bad Grönenbach","Bad Harzburg","Bad Herrenalb","Bad Hersfeld","Bad Hofgastein","Bad Holzhausen","Bad Homburg","Bad Honnef Stadtbahn","Bad Honnef(Rhein)","Bad Höhenstadt","Bad Hönningen","Bad Imnau","Bad Ischl","Bad Karlshafen","Bad Kissingen","Bad Kleinen","Bad Kohlgrub","Bad Kohlgrub Kurhaus","Bad Kreuznach","Bad Krozingen","Bad Krozingen Ost","Bad König","Bad König Zell","Bad Kösen","Bad Köstritz","Bad Kötzting","Bad Laasphe","Bad Laasphe-Niederlaasphe","Bad Langensalza","Bad Lausick","Bad Lauterberg im Harz Barbis","Bad Liebenwerda","Bad Liebenzell","Bad Lobenstein","Bad Malente-Gremsmühlen","Bad Mergentheim","Bad Münder(Deister)","Bad Münster a Stein","Bad Münstereifel","Bad Münstereifel-Arloff","Bad Münstereifel-Iversheim","Bad Nauheim","Bad Nenndorf","Bad Neuenahr","Bad Neustadt(Saale)","Bad Niedernau","Bad Nieuweschans","Bad Oeynhausen","Bad Oeynhausen Süd","Bad Oldesloe","Bad Peterstal","Bad Pyrmont","Bad Ragaz","Bad Rappenau","Bad Rappenau Kurpark","Bad Reichenhall","Bad Reichenhall-Kirchberg","Bad Rodach","Bad Rotenfels Bf","Bad Rotenfels Schloss","Bad Rotenfels Weinbrennerstraße","Bad Saarow","Bad Saarow Klinikum","Bad Sachsa","Bad Salzdetfurth","Bad Salzdetfurth Solebad","Bad Salzhausen","Bad Salzschlirf","Bad Salzuflen","Bad Salzuflen-Sylbach","Bad Salzungen","Bad Sassendorf","Bad Saulgau","Bad Schallerbach-Wallern","Bad Schandau","Bad Schlema","Bad Schmiedeberg","Bad Schmiedeberg Kurzentrum","Bad Schussenried","Bad Schwartau","Bad Schönborn Süd","Bad Schönborn-Kronau","Bad Sebastiansweiler-Belsen","Bad Segeberg","Bad Sobernheim","Bad Soden(Taunus)","Bad Soden-Salmünster","Bad Sooden-Allendorf","Bad St Peter Süd","Bad St Peter-Ording","Bad Staffelstein","Bad Steben","Bad Suderode","Bad Sulza","Bad Säckingen","Bad Teinach-Neubulach","Bad Tölz","Bad Tönisstein","Bad Urach","Bad Urach Ermstalklinik","Bad Urach Wasserfall","Bad Vigaun","Bad Vilbel","Bad Vilbel Süd","Bad Vilbel-Gronau","Bad Waldsee","Bad Wildbad Bf","Bad Wildbad Kurpark","Bad Wildbad Nord","Bad Wildbad Uhlandplatz","Bad Wildungen","Bad Wilsnack","Bad Wimpfen","Bad Wimpfen Im Tal","Bad Wimpfen-Hohenstadt","Bad Windsheim","Bad Wurzach","Bad Wörishofen","Bad Zurzach","Bad Zwischenahn","Baddeckenstedt","Baden(CH)","Baden(Verden)","Baden-Baden","Baden-Baden Haueneberstein","Baden-Baden Rebland","Baflo","Bagenz","Bahlingen Riedlen","Bahlingen am Kaiserstuhl","Bahnbrücken","Bahnhof Niederzwehren, Kassel","Bahnhof, Gönnheim","Bahnsdorf","Baierbrunn","Baiersbronn Bf","Baiersbronn Schule","Baiersdorf","Baisieux","Baitz","Balbersdorf","Baldham","Balduinstein","Balerna","Balgheim","Balgstädt","Balingen Süd","Balingen(Württ)","Ballersbach","Ballstädt(Gotha)","Baltersweiler","Balve","Bamberg","Bammental","Bannemin-Mölschow","Banova Jaruga","Bansin Seebad","Banteln","Bantin","Bantorf","Bantzenheim","Banyuls-sur-Mer","Bar-le-Duc","Barabein","Barbelroth","Barby","Barcelona Sants","Barchel","Bardowick","Barendrecht","Bargstedt","Bargteheide","Barleben","Barleber See","Barmstedt","Barmstedt Brunnenstr","Barneveld Centrum","Barneveld Noord","Barneveld Zuid","Barnstorf(Han)","Barnten","Barrien","Barsinghausen","Barth","Barthmühle","Baruth(Mark)","Bascharage-Sanem","Basdahl Kluste","Basdorf","Basel Bad Bf","Basel Dreispitz","Basel SBB","Basel St Johann","Bassersdorf","Bassum","Batzenhäusle","Batzhausen","Bauerbach","Baumholder","Baunach","Baunatal-Guntershausen","Baunatal-Rengershausen","Baunhoej","Bautzen","Bavendorf","Bayerbach","Bayerisch Eisenstein","Bayerisch Gmain","Bayonne","Bayreuth Hbf","Bayreuth-St Georgen","Bayrischzell","Bebitz","Bebra","Bechstedt-Trippstein","Beckingen(Saar)","Beckum-Neubeckum","Bedburg(Erft)","Bedburg-Hau","Bedum","Beek-Elsloo","Beelen","Beelitz Stadt","Beelitz-Heilstätten","Beerfelden Hetzbach","Beernem","Beesd","Beeskow","Beetz-Sommerfeld","Behringersdorf","Beienheim","Beilen","Beilrode","Beimerstetten","Bekescsaba","Bela pod Bezdezem","Beldorf","Belfort Ville","Belgershain","Belleben","Bellegarde(Ain)","Bellenberg","Belleville Meurthe et Moselle","Bellheim Am Mühlbuckel","Bellheim Bf","Bellinzona","Belp","Belval Lycée","Belval-Rédange","Belval-Université","Belvaux-Soleuvre","Bempflingen","Benediktbeuern","Benesov n. Ploucnici","Benestroff","Benfeld(Selestat)","Bengel","Bening","Benneckenstein","Bennemühlen","Bennewitz","Bennigsen","Benningen(Neckar)","Bennungen","Benshausen","Bensheim","Bensheim-Auerbach","Bentwisch","Beratzhausen","Berbisdorf","Berbisdorf Anbau","Berchem(LUX)","Berchtesgaden Hbf","Berg(CH)","Berg(Pfalz)","Berga(Elster)","Berga-Kelbra","Bergen auf Rügen","Bergen op Zoom","Bergen(Oberbay)","Bergenweiler","Bergfelde(b Berlin)","Berghausen Am Stadion","Berghausen Hummelberg","Berghausen Pfinzbrücke","Berghausen(Baden)","Berghausen(Pfalz)","Berghausen(b Wittgenstein)","Bergheim(Erft)","Bergheim-Giflitz","Bergisch Gladbach","Bergsdorf","Bergtheim","Bergues(Coudek)","Bergwitz","Bergün/Bravuogn","Beringen Bad Bf","Beringerfeld","Beringhausen","Beringstedt","Berka(Wipper)","Berkenbrück","Berlin Alexanderplatz","Berlin Alexanderplatz (S)","Berlin Alt-Reinickendorf","Berlin Anhalter Bf","Berlin Attilastr.","Berlin Baumschulenweg","Berlin Bellevue","Berlin Betriebsbf Rummelsburg","Berlin Beusselstraße","Berlin Bornholmer Str.","Berlin Botanischer Garten","Berlin Brandenburger Tor","Berlin Buckower Chaussee","Berlin Bundesplatz","Berlin Charlottenburg (S)","Berlin Eichborndamm","Berlin Feuerbachstr.","Berlin Frankfurter Allee","Berlin Friedrichstraße","Berlin Friedrichstraße (S)","Berlin Gehrenseestraße","Berlin Gesundbrunnen","Berlin Gesundbrunnen(S)","Berlin Greifswalder Str","Berlin Grünbergallee","Berlin Hackescher Markt","Berlin Hbf","Berlin Hbf (S-Bahn)","Berlin Hbf (tief)","Berlin Heerstraße","Berlin Heidelberger Platz","Berlin Hermannstraße","Berlin Hohenzollerndamm","Berlin Humboldthain","Berlin Innsbrucker Platz","Berlin Jannowitzbrücke","Berlin Julius-Leber-Brücke","Berlin Jungfernheide","Berlin Jungfernheide (S)","Berlin Karl-Bonhoeffer-Nervenklinik","Berlin Köllnische Heide","Berlin Landsberger Allee","Berlin Mehrower Allee","Berlin Messe Nord/ICC (Witzleben)","Berlin Messe Süd (Eichkamp)","Berlin Mexikoplatz","Berlin Nordbahnhof","Berlin Nöldnerplatz","Berlin Olympiastadion","Berlin Oranienburger Straße","Berlin Osdorfer Straße","Berlin Ostbahnhof","Berlin Ostbahnhof (S)","Berlin Ostkreuz","Berlin Ostkreuz (S)","Berlin Plänterwald","Berlin Poelchaustr.","Berlin Potsdamer Platz","Berlin Potsdamer Platz (S)","Berlin Prenzlauer Allee","Berlin Priesterweg","Berlin Raoul-Wallenberg-Str.","Berlin Rathaus Steglitz","Berlin Savignyplatz","Berlin Schichauweg","Berlin Schönhauser Allee","Berlin Sonnenallee","Berlin Springpfuhl","Berlin Storkower Str","Berlin Sundgauer Str","Berlin Südende","Berlin Südkreuz","Berlin Südkreuz (S)","Berlin Treptower Park","Berlin Wannsee","Berlin Wannsee (S)","Berlin Warschauer Straße","Berlin Westend","Berlin Westhafen","Berlin Westkreuz","Berlin Wollankstraße","Berlin Wuhletal","Berlin Yorckstr.(S1)","Berlin Yorckstr.(S2)","Berlin Zoologischer Garten","Berlin Zoologischer Garten (S)","Berlin-Adlershof","Berlin-Altglienicke","Berlin-Biesdorf","Berlin-Blankenburg","Berlin-Buch","Berlin-Charlottenburg","Berlin-Friedenau","Berlin-Friedrichsfelde Ost","Berlin-Friedrichshagen","Berlin-Frohnau","Berlin-Grunewald","Berlin-Grünau","Berlin-Halensee","Berlin-Heiligensee","Berlin-Hermsdorf","Berlin-Hirschgarten","Berlin-Hohenschönhausen","Berlin-Hohenschönhausen (S)","Berlin-Johannisthal","Berlin-Karlshorst","Berlin-Karlshorst (S)","Berlin-Karow","Berlin-Kaulsdorf","Berlin-Köpenick","Berlin-Lankwitz","Berlin-Lichtenberg","Berlin-Lichtenberg (S)","Berlin-Lichtenrade","Berlin-Lichterfelde Ost","Berlin-Lichterfelde Ost (S)","Berlin-Lichterfelde Süd","Berlin-Lichterfelde West","Berlin-Mahlsdorf","Berlin-Mahlsdorf (S)","Berlin-Marienfelde","Berlin-Marzahn","Berlin-Neukölln","Berlin-Nikolassee","Berlin-Oberspree","Berlin-Pankow","Berlin-Pankow-Heinersdorf","Berlin-Pichelsberg","Berlin-Rahnsdorf","Berlin-Rummelsburg","Berlin-Schlachtensee","Berlin-Schulzendorf","Berlin-Schöneberg","Berlin-Schöneweide","Berlin-Schöneweide (S)","Berlin-Schönholz","Berlin-Spandau","Berlin-Spandau (S)","Berlin-Spindlersfeld","Berlin-Staaken","Berlin-Stresow","Berlin-Tegel (S)","Berlin-Tempelhof","Berlin-Tiergarten","Berlin-Waidmannslust","Berlin-Wartenberg","Berlin-Wedding","Berlin-Wilhelmshagen","Berlin-Wilhelmsruh","Berlin-Wittenau (Wilhelmsruher Damm)","Berlin-Wuhlheide","Berlin-Zehlendorf","Berlingen URh","Berlingen(CH)","Bermatingen-Ahausen","Bern","Bernau (S)","Bernau a Chiemsee","Bernau(b Berlin)","Bernau-Friedenstal","Bernay","Bernburg Hbf","Bernburg-Friedenshall","Bernburg-Roschwitz","Bernburg-Strenzfeld","Bernburg-Waldau","Berne","Bernried","Bernterode","Beroun","Bersenbrück","Berthelming","Berthelsdorf(Erzgeb)","Berthelsdorf(Erzgebirge) Ort","Bertrange-Strassen","Bertrix","Bertsdorf","Berzhahn","Besançon-Mouillère","Besançon-Viotte","Besch","Besigheim","Besseringen","Best","Bestensee","Bestwig","Bettembourg","Bettembourg(fr)","Bettmannsäge","Bettwiesen","Betzdorf(LUX)","Betzdorf(Sieg)","Beucha","Beuchow","Beuggen","Beuna(Geiseltal)","Beuren","Beuron","Beutelsbach","Beutersitz","Beverungen-Wehrden","Beverwijk","Bex","Bexbach","Beyendorf","Beziers","Biarritz","Biasca","Bibelöd","Biberach(Baden)","Biberach(Riß)","Biberach(Riß) Süd","Biberist Ost","Biberist RBS","Biblis","Bibra","Bichl","Bichlbach Almkopfbahn","Bichlbach-Berwang","Bickenbach(Bergstr)","Biebesheim","Biedenkopf","Biedenkopf Campus","Biederitz","Biel/Bienne","Bielefeld Hbf","Bielefeld Ost","Bielefeld-Brackwede","Bielefeld-Senne","Bielefeld-Sennestadt","Bielefeld-Windelsbleiche","Biendorf","Bienenbüttel","Bienenmühle","Bierbach","Bieren-Rödinghausen","Bieringen","Biersdorf(Westerw)","Biersdorf-Ort(Ww)","Bierset-Awans","Biesenrode","Biesenthal","Biessenhofen","Bietigheim(Baden)","Bietigheim-Bissingen","Bietingen","Bigge","Bildstock","Bilfingen","Bilina","Billenhausen","Billerbeck","Billum st","Bilten","Bilthoven","Bily Kostel nad Nisou","Binau","Bindfelde","Bindlach","Bingen(Rhein) Hbf","Bingen(Rhein) Stadt","Bingen-Gaulsheim","Binolen","Binz LB","Binzen","Birach","Birkelbach","Birkenau","Birkenbringhausen","Birkenfeld(Enz)","Birkengrund","Birkenmoor","Birkenstein","Birkenwerder(b Berlin)","Birkungen","Birmensdorf ZH","Birresborn","Bischheim-Gersdorf","Bischofshofen","Bischofswerda","Bischofswiesen","Bischweier","Bisingen","Bissendorf","Bitburg-Erdorf","Bittelbronn","Bitterfeld","Bitzfeld","Blaibach(Oberpf)","Blaichach(Allgäu)","Blainville-Damelevieres","Blaj","Blankenbach","Blankenberg(Meckl)","Blankenberg(Sieg)","Blankenburg(Harz)","Blankenfelde (S)","Blankenfelde(Teltow-Fläming)","Blankenheim(Sangerhausen)","Blankenheim(Wald)","Blankenloch","Blankenloch Kirche, Stutensee","Blankenloch Mühlenweg, Stutensee","Blankenloch Nord, Stutensee","Blankenloch Süd, Stutensee","Blankenloch Tolna-Platz, Stutensee","Blankensee(Meckl)","Blankenstein(Saale)","Blaubeuren","Blaufelden","Blausee-Mitholz","Blaustein","Blechhammer(Thür)","Bleibach","Bleichenbach(Oberh)","Bleicherode Ost","Blens","Blerick","Blieskastel-Lautzkirchen","Blindenmarkt","Blindheim","Bloemendaal","Bludenz","Bludenz Brunnenfeld","Bludenz-Moos","Blumberg(b Berlin)","Blumberg-Rehhahn","Blumberg-Riedöschingen","Blumberg-Zollhaus","Blumenau","Blumenhagen","Blumenthal(Mark)","Blönsdorf","Bobenheim","Bobingen","Bobitz","Bobstadt","Bobzin","Bocholt","Bochum Hbf","Bochum West","Bochum-Dahlhausen","Bochum-Ehrenfeld","Bochum-Hamme","Bochum-Langendreer","Bochum-Langendreer West","Bochum-Riemke","Bockenheim-Kindenheim","Bodegraven","Bodelsberg","Bodelshausen","Bodenburg","Bodenfelde","Bodenheim","Bodenmais","Bodenrode","Bodenwöhr Nord","Bodio TI","Boen(F)","Bogen","Bohmte","Bohumin","Boisheim","Boizenburg(Elbe)","Bokholt","Bollwiller(Lutterb)","Bologna Centrale","Bolzano/Bozen","Bondorf(b Herrenberg)","Bonn Brühler Str.","Bonn Hbf","Bonn Hbf (tief)","Bonn Helmholtzstraße","Bonn Heussallee/Museumsmeile","Bonn Konrad-Adenauer-Platz","Bonn Stadthaus","Bonn UN Campus","Bonn-Bad Godesberg","Bonn-Bad Godesberg Stadthalle","Bonn-Beuel","Bonn-Duisdorf","Bonn-Endenich Nord","Bonn-Mehlem","Bonn-Oberkassel","Bonn-Oberkassel Mitte","Bonn-Ramersdorf","Bookholzberg","Boondael/Boondaal","Boostedt","Bopfingen","Boppard Hbf","Boppard Süd","Boppard-Bad Salzig","Boppard-Buchholz","Boppard-Fleckertshöhe","Boppard-Hirzenach","Bordeaux-St-Jean","Bordesholm","Borgeln","Borgholzhausen","Borgo S. Dalmazzo","Borgsdorf","Bork(Westf)","Borken(Hess)","Borken(Westf)","Borkheide","Borna(Leipzig)","Borne(NL)","Bornholte(b Verl)","Borsdorf(Hess)","Borsdorf(Sachs)","Boskoop","Boskoop Snijdelwijk","Bottighofen","Bottrop Hbf","Bottrop-Boy","Bottrop-Vonderort","Boulevarden st","Bourg-St.Maurice","Bourg-en-Bresse","Bourges","Bous(Saar)","Boven-Hardinxveld","Bovenkarspel Flora","Bovenkarspel-Grootebroek","Boxberg-Wölchingen","Boxmeer","Boxtel","Brachbach","Brachelen","Brahlstorf","Brake(Unterweser)","Brake(b Bielefeld)","Brakel(Höxter)","Bramming st","Bramsche","Bramstedt(b Syke)","Brand Tropical Islands","Brandenburg Altstadt","Brandenburg Hbf","Brandoberndorf","Brandstätt","Brannenburg","Brasov","Bratislava hl.st.","Bratislava-Petrzalka","Braubach","Braunau/Inn","Braunsbedra","Braunsbedra Ost","Braunschweig Hbf","Braunschweig-Gliesmarode","Braunsdorf-Lichtenwalde","Brebach","Breclav","Breclav(Gr)","Breda","Breda-Prinsenbeek","Breddin","Bredebro st","Bredelar","Bredenbek","Bredstedt","Brefeld","Bregenz","Bregenz Hafen","Bregenz Riedenburg","Brehna","Breil-sur-Roya","Breinig","Breisach","Breitenbrunn(Erzg)","Breitenbrunn(Schwab)","Breitendiel","Breitendorf","Breitengüßbach","Breitscheidt(Altenkirchen, Ww)","Breitungen(Werra)","Bremen Hbf","Bremen Kreinsloger","Bremen Mühlenstraße","Bremen Neustadt","Bremen Turnerstraße","Bremen-Aumund","Bremen-Blumenthal","Bremen-Burg","Bremen-Farge","Bremen-Hemelingen","Bremen-Lesum","Bremen-Mahndorf","Bremen-Oberneuland","Bremen-Oslebshausen","Bremen-Schönebeck","Bremen-Sebaldsbrück","Bremen-St Magnus","Bremen-Vegesack","Bremen-Walle","Bremerhaven Hbf","Bremerhaven-Lehe","Bremerhaven-Wulsdorf","Bremervörde","Brenk","Brennero/Brenner","Brescia","Bressanone/Brixen","Bressoux","Brest(F)","Brest-Aspe","Breternitz","Bretleben","Bretten","Bretten Kupferhälde","Bretten Rechberg","Bretten Schulzentrum","Bretten Stadtmitte","Bretten Wannenweg","Bretten-Ruit","Brettorf","Bretzenheim(Nahe)","Bretzfeld","Breukelen","Breyell","Breziny u Decina","Brieselang","Briesen(Mark)","Brig","Brigachtal Kirchdorf","Brigachtal Klengen","Brilon Stadt","Brilon Wald","Britz","Brixen im Thale","Brixlegg","Brocken","Brockhöfe","Broderstorf","Broens st","Brohl","Brokstedt","Bronschhofen","Bruchenbrücken","Bruchhausen(b Ettlingen)","Bruchköbel","Bruchmühlbach-Miesau","Bruchmühlen","Bruchsal","Bruchsal Am Mantel","Bruchsal Bildungszentrum","Bruchsal Schlachthof","Bruchsal Schloßgarten","Bruchsal Sportzentrum","Bruchsal Stegwiesen","Bruchsal Tunnelstraße","Bruchweiler","Bruck-Fusch","Bruck/Leitha","Bruck/Mur","Bruckberg","Brucken","Bruckmühl","Brugg AG","Brugge","Brumath","Brummen","Brunau-Packebusch","Brunico/Bruneck","Brunnen(CH)","Brunnen(Oberbay)","Brussels Airport - Zaventem","Bruxelles Midi","Bruxelles-Central","Bruxelles-Luxembourg","Bruxelles-Midi Eurostar","Bruxelles-Nord","Bräunlingen Bahnhof","Bräunlingen Industriegebiet","Brötzingen Mitte","Brötzingen Sandweg","Brötzingen Wohnlichstraße","Brück(Mark)","Brügge(Prign)","Brühl","Brühl-Kierberg","Bubach","Bubenheim","Bubenreuth","Buchbrunn-Mainstockheim","Buchen Ost","Buchen(Odenw)","Buchenau(Lahn)","Buchenau(Oberbay)","Buchenhain","Buchenhorst","Buchholz(Baden)","Buchholz(Nordheide)","Buchholz(Zauche)","Buchloe","Buchs SG","Buckow(Beeskow)","Bucuresti Nord Gara A","Budapest-Ferencváros","Budapest-Keleti","Budapest-Nyugati","Buddenhagen","Budenheim","Bufleben","Buggingen","Buir","Buitenpost","Buldern","Bullay(DB)","Bully-Grenay","Bunde","Bundenthal-Rumbach","Bunnik","Burbach Mitte","Burbach(Kr Siegen)","Burg Stargard(Meckl)","Burg(Dillkr) Nord","Burg(Dithm)","Burg(Magdeburg)","Burg-u. Nieder Gemünden","Burgau(Schwab)","Burgbernheim","Burgbernheim-Wildbad","Burgdorf","Burgfried b.Gnas","Burghaun(Hünfeld)","Burghausen","Burgheim","Burgholzhausen v d H","Burgkemnitz","Burgkirchen","Burgkunstadt","Burglauer","Burgsinn","Burgstall(Murr)","Burgstädt","Burgthann","Burgweiler","Burhafe(Ostfriesl)","Burkhardswalde-Maxen","Burkhardtsdorf","Burkhardtsdorf Mitte","Burkheim-Bischoffingen","Burladingen","Burladingen West","Buschmühle","Buschow","Busenbach","Busenberg-Schindhard","Busigny","Bussnang","Bussum Zuid","Busto Arsizio","Buttenheim","Buttstädt","Butzbach","Buxtehude","Bydgoszcz Glowna","Bäch","Bärenhecke-Johnsbach","Bärenklau","Bärenstein(Annaberg)","Bärenstein(b Glashütte, Sachs)","Bärnsdorf","Bäumenheim","Böbingen(Rems)","Böblingen","Böblingen Danziger Str","Böblingen Heusteigstr","Böblingen Südbf","Böblingen Zimmerschlag","Böbrach","Böckingen Sonnenbrunnen","Böckingen West","Böckstein","Bödigheim","Böheimkirchen","Böhl-Iggelheim","Böhlen Werke","Böhlen(Leipzig)","Böhmhof","Böhringen-Rickelshausen","Bölzke","Bönen","Bönen-Nordbögge","Bönningstedt","Börnecke(Harz)","Börßum","Bösdorf(Sachs-Anh)","Bösperde","Bötzingen","Bötzingen Mühle","Bübingen","Büchen","Büchenbach","Büches-Düdelsheim","Büchig, Stutensee","Bückeburg","Büdingen(Oberhess)","Büdingen(Westerw)","Bühl(Baden)","Bülach","Bülzig","Bünde(Westf)","Bürgeln","Bürgerhaus, Hessisch Lichtenau","Bürglen","Bürstadt","Büsenbachtal","Büsum","Büttgen","Bützow","Cadenazzo","Cadenberge","Cadolzburg","Cainsdorf","Calais Ville","Calais-Fréthun","Calau(Nl)","Calbe(Saale) Ost","Calbe(Saale) Stadt","Calbe(Saale) West","Calberlah","Caldern","Caldes de Malavella","Calmbach Bahnhof","Calmbach Süd","Calw","Camburg(Saale)","Cammin(Meckl)","Campo di Trens/Freienfeld","Cannes","Cannes-la-Bocca","Capelle Schollevaar","Capelle(Westf)","Capellen","Capolago-Riva S. Vitale","Caputh Schwielowsee","Caputh-Geltow","Carbonne(Boussens)","Carcassonne","Carimate","Carnoules(Toulon)","Casekow","Casteldarne/Ehrenburg","Castelnaudary","Castione-Arbedo","Castricum","Castrop-Rauxel Hbf","Castrop-Rauxel Süd","Castrop-Rauxel-Merklinde","Cavaillon(Avignon)","Celle","Centallo","Cents-Hamm","Cerbère","Ceska Kamenice","Ceska Kubice","Ceska Lipa hl.n.","Ceska Lipa strelnice","Ceske Budejovice","Ceske Velenice","Chalon sur Saône","Chalons en Champagne","Cham(Oberpf)","Chambery-Challes-E","Chamerau","Champigneulles","Charleroi Sud","Chateau-Thierry","Chauny(Tergnier)","Cheb","Cheb-Skalka","Chelles Gournay","Chemnitz Alt Chemnitz Center","Chemnitz Annenstraße","Chemnitz Bernsbachplatz","Chemnitz Brückenstraße/Freie Presse","Chemnitz Erdmannsdorfer Straße","Chemnitz Erfenschlag","Chemnitz Friedrichstraße","Chemnitz Gustav-Freytag-Straße","Chemnitz Hbf","Chemnitz Hbf (Bahnhofstraße)","Chemnitz Kinderwaldstätte","Chemnitz Küchwald","Chemnitz Mitte","Chemnitz Moritzhof","Chemnitz Omnibusbahnhof","Chemnitz Riemenschneiderstraße","Chemnitz Rosenbergstraße","Chemnitz Roter Turm","Chemnitz Rösslerstraße","Chemnitz Scheffelstraße","Chemnitz Schneeberger Straße","Chemnitz Schule Altchemnitz","Chemnitz Stadlerplatz","Chemnitz Stefan-Heym-Platz","Chemnitz Süd","Chemnitz TU Campus","Chemnitz Technopark","Chemnitz Theaterplatz","Chemnitz Treffurthstraße","Chemnitz Uhlestraße","Chemnitz Zentralhaltestelle","Chemnitz-Altchemnitz","Chemnitz-Borna Hp","Chemnitz-Harthau","Chemnitz-Hilbersdorf","Chemnitz-Reichenhain","Chemnitz-Schönau","Chemnitz-Siegmar","Chenay Gagny","Chenee","Cherbourg","Chevremont(NL)","Chiasso","Chiusa/Klausen","Chomutov","Chomutov mesto","Chorin","Chotyne","Chrastava","Chrastava-Andelska Hora","Chribska","Chur","Château du Loir","Château-Arnoux-St-Auban","Châteauroux","Châtelet","Cintegabelle","Clarholz","Clausnitz","Clermont-Ferrand","Clerval","Clervaux","Cloppenburg","Coburg","Coburg Nord","Coburg-Beiersdorf","Coburg-Neuses","Cochem(Mosel)","Coesfeld Schulzentrum","Coesfeld(Westf)","Coevorden","Colle Isarco/Gossensass","Collenberg","Collioure","Colmar","Combs la Ville Quincy","Como S. Giovanni","Compiegne","Conegliano","Conflans-Jarny","Contwig","Coppenbrügge","Corbehem(Douai)","Corbeil Essonnes","Cornaux","Coschen","Cosne","Cossebaude","Cossonay-Penthalaz","Coswig(Anh)","Coswig(b Dresden)","Cottbus Hbf","Cottbus-Merzdorf","Cottbus-Sandow","Cottbus-Willmersdorf Nord","Coulommiers","Courcelles-sur-Nied","Coutras","Crailsheim","Cranzahl","Creidlitz","Creil","Creußen(Oberfr)","Crimmitschau","Crivitz","Crossen Ort","Crossen a d Elster","Cuijk","Culemborg","Culmont-Chalindrey","Culoz","Cuneo","Cunnertswalde","Cursdorf","Curtici","Cuxhaven","Czerwiensk","Cölbe","Daaden","Daarlerveen","Dabendorf","Dachau Bahnhof","Dachau Stadt","Dachrieden","Dachsen","Dachwig","Dagebüll Kirche","Dagebüll Mole","Dagmersellen","Dahl","Dahlbruch","Dahlem(Eifel)","Dahlen(Sachs)","Dahlenburg","Dahlerbrück","Dahlewitz","Dahn","Dahn Süd","Dalen(NL)","Dalfsen","Dalheim","Dallau","Dallgow-Döberitz","Dambeck(Altm)","Dammerstock, Karlsruhe","Dannenberg Ost","Dannenwalde(Gransee)","Darching","Darlingerode","Darmstadt Hbf","Darmstadt Nord","Darmstadt Ost","Darmstadt Süd","Darmstadt TU-Lichtwiese","Darmstadt-Arheilgen","Darmstadt-Eberstadt","Darmstadt-Kranichstein","Darmstadt-Wixhausen","Dasing","Dattenfeld(Sieg)","Dauenhof","Daufenbach","Dausenau","Davensberg","Davos Dorf","Davos Platz","Dax","Daxlanden Dornröschenweg, Karlsruhe","Daxlanden Karl-Delisle-Straße, Karlsruhe","Daxlanden Nussbaumweg, Karlsruhe","Daxlanden Thomas-Mann-Straße, Karlsruhe","De Vink","Debrecen","Decin hl.n.","Decin vychod","Decin-Certova voda","Decin-Priper","Decin-Prostredni Zleb","Dedenhausen","Dedensen-Gümmer","Dedinghausen","Deezbüll","Deggendorf Hbf","Deidesheim","Deining(Oberpf)","Deinste","Deinum","Deisenhofen","Deißlingen Mitte","Delden","Delft","Delft Campus","Delfzijl","Delfzijl West","Delitzsch ob Bf","Delitzsch unt Bf","Dellfeld","Dellfeld Ort","Delmenhorst","Delmenhorst Hasporter Damm","Delémont","Demitz-Thumitz","Demker","Demmin","Den Dolder","Den Haag Centraal","Den Haag HS","Den Haag Laan van Nieuw Oost Indie","Den Haag Mariahoeve","Den Haag Moerwijk","Den Haag Ypenburg","Den Helder","Den Helder Zuid","Denderleeuw","Densborn","Denzlingen","Dernau","Dernbach(Westerw)","Derneburg(Han)","Desenice","Desenzano del Garda/Sirmione","Desio","Dessau Adria","Dessau Hbf","Dessau Süd","Dessau-Alten","Dessau-Mosigkau","Dessau-Waldersee","Detmold","Dettelbach Bahnhof","Dettenhausen","Dettingen Freibad","Dettingen Gsaidt","Dettingen Lehen","Dettingen(Main)","Dettingen(Teck)","Dettingen-Mitte","Dettum","Dettwiller","Deuben(Zeitz)","Deuerling","Deurne","Deuten","Deutzen","Deva","Deventer","Deventer Colmschate","Devinska Nova Ves","Diano Marina","Didam","Diebach","Dieburg","Diedelsheim","Diedorf(Schwab)","Diemen","Diemen Zuid","Diemeringen","Dienheim","Diepenbeek","Diepholz","Dieren","Dieskau","Diessenhofen","Diessenhofen URh","Dietersheim","Dietlikon","Dietmannsried","Dietzelbach","Dietzenbach Bahnhof","Dietzenbach Mitte","Dietzenbach-Steinberg","Dietzhausen","Dieulouard","Diez","Diez Ost","Dießen","Differdange","Dijon Porte Neuve","Dijon Ville","Dillbrecht","Dillenburg","Dillingen(Donau)","Dillingen(Saar)","Dingolfing","Dinkelsbühl Bf","Dinkelscherben","Dinslaken","Dippach-Reckange","Dippoldiswalde","Dirmingen","Dissen-Bad Rothenfelde","Distelhausen","Ditfurt","Dittersbach","Dittersdorf","Dittigheim","Ditzingen","Dobbiaco/Toblach","Doberlug-Kirchhain","Doberschütz","Dobova","Dobova(Gr)","Dodendorf","Dodenhof","Doestrup(Soenderjylland) st","Doetinchem","Doetinchem De Huet","Dogern","Dohna(Sachs)","Doksy","Dole Ville","Dolhain-Gileppe","Dollbergen","Dollern","Dollnstein","Dolni Habartice","Dolni Podluzi","Dolni Poustevna","Dolni Zleb","Dolni Zleb zast.","Domazlice","Dombühl","Dommeldange","Domnitz(Saalkr)","Domodossola","Domsühl","Donaueschingen","Donaueschingen Allmendshofen","Donaueschingen Aufen","Donaueschingen Grüningen","Donaueschingen Mitte/Siedlung","Donauwörth","Dordrecht","Dordrecht Stadspolders","Dordrecht Zuid","Dorf Mecklenburg","Dorfchemnitz","Dorfen Bahnhof","Dorfgastein","Dorfmark","Dorfprozelten","Dorheim(Wetterau)","Dormagen","Dormagen Chempark","Dornbirn","Dornbirn Schoren","Dornburg(Saale)","Dornstetten","Dornstetten-Aach","Dorsten","Dortelweil","Dortmund Hbf","Dortmund Knappschaftskrankenhaus","Dortmund Möllerbrücke","Dortmund Signal Iduna Park","Dortmund Stadthaus","Dortmund Tierpark","Dortmund Universität","Dortmund West","Dortmund-Aplerbeck","Dortmund-Aplerbeck Süd","Dortmund-Asseln Mitte","Dortmund-Barop","Dortmund-Brackel","Dortmund-Bövinghausen","Dortmund-Derne","Dortmund-Dorstfeld","Dortmund-Dorstfeld Süd","Dortmund-Germania","Dortmund-Huckarde","Dortmund-Huckarde Nord","Dortmund-Hörde","Dortmund-Kirchderne","Dortmund-Kirchhörde","Dortmund-Kley","Dortmund-Kruckel","Dortmund-Kurl","Dortmund-Körne","Dortmund-Körne West","Dortmund-Löttringhausen","Dortmund-Lütgendortmund","Dortmund-Lütgendortmund Nord","Dortmund-Marten","Dortmund-Marten Süd","Dortmund-Mengede","Dortmund-Nette/Oestrich","Dortmund-Oespel","Dortmund-Rahm","Dortmund-Scharnhorst","Dortmund-Somborn","Dortmund-Sölde","Dortmund-Westerfilde","Dortmund-Wickede","Dortmund-Wickede West","Dortmund-Wischlingen","Dorum(Weserm)","Dossow(Prign)","Dottenheim","Dotternhausen-Dormettingen","Dottikon-Dintikon","Dourges","Drahnsdorf","Drahtzug","Drauffelt","Drebkau","Drei Annen Hohne","Dreieich-Buchschlag","Dreieich-Dreieichenhain","Dreieich-Götzenhain","Dreieich-Offenthal","Dreieich-Sprendlingen","Dreieich-Weibelfeld","Dreikirchen","Dreileben-Drackenstedt","Drensteinfurt","Dresden Bischofsplatz","Dresden Flughafen","Dresden Freiberger Straße","Dresden Grenzstraße","Dresden Hbf","Dresden Industriegelände","Dresden Mitte","Dresden-Cotta","Dresden-Dobritz","Dresden-Friedrichstadt","Dresden-Kemnitz","Dresden-Klotzsche","Dresden-Neustadt","Dresden-Niedersedlitz","Dresden-Pieschen","Dresden-Plauen","Dresden-Reick","Dresden-Stetzsch","Dresden-Strehlen","Dresden-Trachau","Dresden-Zschachwitz","Dreye","Driebergen-Zeist","Driehuis","Drohndorf-Mehringen","Dronryp","Dronten","Duchcov","Ducherow","Duckterath","Dudweiler","Dugo Selo","Duisburg Entenfang","Duisburg Hbf","Duisburg-Buchholz","Duisburg-Großenbaum","Duisburg-Hochfeld Süd","Duisburg-Meiderich Ost","Duisburg-Meiderich Süd","Duisburg-Obermeiderich","Duisburg-Rahm","Duisburg-Ruhrort","Duisburg-Schlenk","Duisburg-Wedau","Duiven","Duivendrecht","Dunkerque","Durach","Durlach Hubstraße, Karlsruhe","Durlach Untermühlstraße, Karlsruhe","Durlacher Tor/KIT-Campus Süd, Karlsruhe","Durmersheim","Durmersheim Nord","Dutenhofen(Wetzlar)","Dußlingen","Dyreby st","Däniken","Döbeln Hbf","Döberitz","Döggingen","Döhlau","Döllstädt","Dörfles-Esbach","Dörpen","Dörrberg","Dörverden","Döttingen","Dülken","Dülmen","Düren","Düren Annakirmesplatz","Düren Im Großen Tal","Düren Renkerstraße","Düren-Kuhbrücke","Düren-Lendersdorf","Dürrenbüchig","Dürrnhaar","Dürrröhrsdorf","Düsseldorf Flughafen","Düsseldorf Flughafen Terminal","Düsseldorf Friedrichstadt","Düsseldorf Hbf","Düsseldorf Volksgarten","Düsseldorf Völklinger Str.","Düsseldorf Wehrhahn","Düsseldorf-Benrath","Düsseldorf-Bilk","Düsseldorf-Derendorf","Düsseldorf-Eller","Düsseldorf-Eller Mitte","Düsseldorf-Eller Süd","Düsseldorf-Flingern","Düsseldorf-Garath","Düsseldorf-Gerresheim","Düsseldorf-Hamm","Düsseldorf-Hellerhof","Düsseldorf-Oberbilk","Düsseldorf-Rath","Düsseldorf-Rath Mitte","Düsseldorf-Reisholz","Düsseldorf-Unterrath","Düsseldorf-Zoo","Dütschow","Ebbsfleet International Eurostar","Ebelsbach-Eltmann","Eben im Pongau","Ebenfurth","Ebenhausen(Unterfr)","Ebenhausen-Schäftlarn","Ebenhofen","Ebensfeld","Eberbach","Ebermannstadt","Ebermergen","Ebern","Ebersbach(Fils)","Ebersbach(Sachs)","Ebersberg(Oberbay)","Ebersbrunn","Ebersdorf(b Coburg)","Ebersheim","Eberswalde Hbf","Ebertsheim","Ebing","Ebringen","Ebstorf(Uelzen)","Echem","Eching","Echt","Echterdingen","Echzell","Eckardtsleben","Eckartsberga(Thür)","Eckartshausen-Ilshofen","Eckenerstraße, Karlsruhe","Eckernförde","Eckersmühlen","Eddersheim","Ede Centrum","Ede(B)","Ede-Wageningen","Edelfingen","Edenkoben","Edermünde-Grifte","Edesheim(Pfalz)","Ediger-Eller","Edingen(Wetzlar)","Edle Krone","Edling","Eemshaven","Effelder(Thür)","Effolderbach","Effretikon","Efringen-Kirchen","Egelsbach","Egersdorf","Egestorf(Deister)","Eggenfelden","Eggenfelden Mitte","Eggenstein Bf","Eggenstein Schweriner Straße, Eggenstein-Leopoldsh","Eggenstein Spöcker Weg, Eggenstein-Leopoldshafen","Eggenstein Süd, Eggenstein-Leopoldshafen","Eggersdorf","Eggesin","Eggingen","Egglkofen","Eggmühl","Eggolsheim","Eglharting","Egling","Eglisau","Egnach","Ehingen(Donau)","Ehlenbruch","Ehlershausen","Ehningen(b Böblingen)","Ehr","Ehrang","Ehrang Ort","Ehringen","Ehringhausen(Kr Lippstadt)","Ehringshausen(Kr Wetzlar)","Ehringshausen(Oberhess)","Ehrwald Zugspitzbahn","Eibau","Eich(Sachs)","Eichen(Kr Siegen)","Eichenau(Oberbay)","Eichenberg","Eichenzell","Eichhagen","Eicholzheim","Eichstedt(Altm)","Eichstetten am Kaiserstuhl","Eichstätt Bahnhof","Eichstätt Stadt","Eichwalde","Eickendorf","Eijsden","Eilenburg","Eilenburg Ost","Eilendorf","Eilsleben(b Magdeburg)","Eilvese","Eimeldingen","Einbeck Mitte","Einbeck Otto-Hahn-Straße","Einbeck-Salzderhelden","Eindhoven Centraal","Eindhoven Strijp-S","Einfeld","Einsiedel","Einsiedel Brauerei","Einsiedel Hp Gymnasium","Einsiedeln","Einsiedlerhof","Einöd(Saar)","Eisemroth","Eisenach","Eisenach Opelwerke Hp","Eisenach West","Eisenberg(Pfalz)","Eisenheim","Eisenhüttenstadt","Eisenärzt","Eiserfeld(Sieg)","Eisfeld","Eisfelder Talmühle","Eislingen(Fils)","Eiswoog","Eitensheim","Eitorf","Elend","Elfershausen-Trimberg","Elgersburg","Ellefeld","Ellental","Ellerau","Ellhofen","Ellingen(Bay)","Ellrich","Ellwangen","Ellzee","Elmenhorst","Elmshorn","Elne","Elpersheim","Elsbethen","Elsfleth","Elsholz","Elsnigk(Anh)","Elst","Elstal","Elster(Elbe)","Elsterberg","Elsterberg-Kunstseidenwerk","Elsterwerda","Elsterwerda-Biehla","Eltersdorf","Eltville","Elxleben","Elz(Limburg/Lahn)","Elz(Limburg/Lahn) Süd","Elzach","Elze(Han)","Emden Außenhafen","Emden Hbf","Emmelshausen","Emmen Zuid","Emmen(NL)","Emmenbrücke","Emmendingen","Emmerich","Emmerich-Elten","Emmerke","Emmerthal","Empel-Rees","Empelde","Emsdetten","Emskirchen","Endersbach","Endingen am Kaiserstuhl","Endingen(Württ)","Engeln","Engelskirchen","Engen","Engers","Engertsham","Engis","Engstingen","Engstingen Schulzentrum","Engstlatt","Enkenbach","Enkhuizen","Ennepetal","Enns","Enschede","Enschede De Eschmarke","Enschede Kennispark","Ensdorf(Saar)","Enspel","Entenfang, Karlsruhe","Entringen","Enzberg","Enzisweiler","Epe(Westf)","Epernay","Epierre-St Leger","Epinal","Eppelborn","Eppelsheim(Rheinhess)","Eppertshausen","Eppingen","Eppingen West","Eppstein","Eppstein-Bremthal","Erbach(Odenw)","Erbach(Odenw) Nord","Erbach(Rheingau)","Erbach(Württ)","Erbprinz/Schloss, Ettlingen","Erdeborn","Erding","Erdmannhausen","Erdmannsdorf-Augustusburg","Erdweg","Erftstadt","Erfurt Hbf","Erfurt Nord","Erfurt Ost","Erfurt-Bischleben","Erfurt-Gispersleben","Ergenzingen","Ergoldsbach","Ergste","Eriskirch","Erkelenz","Erkersreuth","Erkner","Erkner (S)","Erkrath","Erkrath-Nord","Erla","Erlabrunn(Erzgeb)","Erlangen","Erlangen Paul-Gossen-Straße","Erlangen-Bruck","Erlau(Sachs)","Erlen","Erlenbach(Main)","Ermatingen","Ermatingen URh","Ermelo","Erndtebrück","Ernsgaden","Ernsthausen","Ernstthal am Rennsteig","Erpel(Rhein)","Erpolzheim","Erquelinnes","Ersingen","Ersingen West","Erstein","Erstfeld","Erzhausen","Erzingen(Baden)","Erzingen(Württ)","Esbjerg st","Esch-sur-Alzette","Eschborn","Eschborn Süd","Eschede","Eschelbronn","Eschenau(Mittelfr)","Eschenau(b Heilbronn)","Eschenau/Salzach","Eschenbach(b Markt Erlbach)","Eschenlohe","Escherndorf-Vogelsburg","Eschhofen","Eschwege","Eschwege-Niederhone","Eschweiler Hbf","Eschweiler Talbahnhof","Eschweiler-Nothberg","Eschweiler-St.Jöris","Eschweiler-Weisweiler","Eschweiler-West","Esens(Ostfriesl)","Espelkamp","Espenau-Mönchehof","Essel","Essen Hbf","Essen Stadtwald","Essen Süd","Essen West","Essen(B)","Essen(Oldb)","Essen-Altenessen","Essen-Bergeborbeck","Essen-Borbeck","Essen-Borbeck Süd","Essen-Dellwig","Essen-Dellwig Ost","Essen-Eiberg","Essen-Frohnhausen","Essen-Gerschede","Essen-Holthausen","Essen-Horst","Essen-Hügel","Essen-Kray Nord","Essen-Kray Süd","Essen-Kupferdreh","Essen-Steele","Essen-Steele Ost","Essen-Werden","Essen-Zollverein Nord","Essen-Überruhr","Essenweinstraße, Karlsruhe","Esslingen(Neckar)","Esslingen-Mettingen","Esslingen-Zell","Esting","Etampes","Etelsen","Ettelbruck","Etten-Leur","Ettenhausen","Etterzhausen","Ettlingen Stadt","Ettlingen West","Etzbach","Etzelwang","Etzenbach","Etzenricht","Etzenrot","Etzleben","Etzwilen","Eubigheim","Euerdorf","Eupen","Europaplatz/Postgal. (Kaiser), Karlsruhe","Euskirchen","Euskirchen Zuckerfabrik","Euskirchen-Großbüllesheim","Euskirchen-Kreuzweingarten","Euskirchen-Kuchenheim","Euskirchen-Stotzheim","Eutin","Eutingen Nord","Eutingen im Gäu","Eutingen(Baden)","Evreux Normandie","Eyach","Eygelshoven","Eygelshoven Markt","Eystrup","Eßleben","Faak am See","Fachingen(Lahn)","Fahrenkrug","Fahrnau","Faido","Falkenau(Sachs)Hp","Falkenau(Sachs)Süd","Falkenberg(Elster)","Falkenberg(Mark)","Falkenhagen Gewerbepark Prignitz","Falkensee","Falkenstein(Vogtl)","Fallersleben","Fangschleuse","Farchant","Fasanenpark","Faulbach(Main)","Faulquemont","Faurndau","Favoritepark","Feanwalden","Fegersheim Lipsheim","Fehmarn-Burg","Fehraltorf","Fehring","Feilitzsch","Feldafing","Feldbach/Raab","Feldberg(Meckl)","Feldberg-Bärental","Felde","Feldhausen","Feldkirch","Feldkirch Amberg","Feldkirchen in Kärnten","Feldkirchen(b München)","Feldolling","Felixdorf","Fellbach","Felsberg-Altenbrunslar","Felsberg-Gensungen","Felsberg-Wolfershausen","Ferch-Lienewitz","Ferdinandshof","Fermerswalde","Ferndorf(Siegen)","Ferrara","Feucht","Feucht Ost","Feucht-Moosbach","Feudingen","Fichtenberg","Fieberbrunn","Figueres","Filderstadt","Filisur","Filsen","Finale Ligure Marina","Finkenheerd","Finkenkrug","Finnentrop","Finningerstraße","Finsterwald","Finsterwalde(Niederlausitz)","Firenze S.M.N.","Fischbach(Nürnberg)","Fischbach-Camphausen","Fischbach-Weierbach","Fischbachau","Fischen","Fischhaus","Fischhausen-Neuhaus","Fischweier, Karlsbad","Flamatt","Flassa","Flaurling","Flechtingen","Fleetmark","Flehingen","Flensburg","Flensburg-Weiche","Flers","Flieden","Flintbek","Flintsbach","Flomersheim","Floßmühle","Flughafen BER - Terminal 1-2","Flughafen BER - Terminal 1-2 (S-Bahn)","Flughafen BER - Terminal 5 (Schönefeld)","Flughafen Wien","Flums","Flöha","Flöha-Plaue","Flörsheim(Main)","Flüelen","Fohrde","Fontaine","Fontainebleau-Avon","Fontan Saorge","Forbach(F)","Forbach(Schwarzw)","Forchheim Hallenbad, Rheinstetten","Forchheim Hauptstraße, Rheinstetten","Forchheim Leichtsandstr./Messe Karlsruhe, Rheinste","Forchheim Leichtsandstraße/Messe Karlsruhe, Rheins","Forchheim Oberfeldstraße, Rheinstetten","Forchheim(Oberfr)","Forchheim(b Karlsruhe)","Forest Midi/Vorst Zuid","Fornsbach","Forst(Lausitz)","Forstfeldstraße, Kassel","Forsthaus","Forsting","Fortezza/Franzensfeste","Forth","Fossano","Fourchambault","Frahelsbruck","Fraipont","Franeker","Frankenberg(Eder)","Frankenberg(Sachs)","Frankenberg(Sachs) Süd","Frankenberg-Goßberg","Frankenberg-Viermünden","Frankenmarkt","Frankenstein(Pfalz)","Frankenstein(Sachs)","Frankenthal Hbf","Frankenthal Süd","Frankfurt Hbf (tief)","Frankfurt am Main - Stadion","Frankfurt(M) Flughafen Fernbf","Frankfurt(M) Flughafen Regionalbf","Frankfurt(M)Galluswarte","Frankfurt(M)Hauptwache","Frankfurt(M)Konstablerwache","Frankfurt(M)Lokalbahnhof","Frankfurt(M)Mühlberg","Frankfurt(M)Ostendstraße","Frankfurt(M)Stresemannallee","Frankfurt(M)Taunusanlage","Frankfurt(Main) Stresemannallee/Mörfelder Landstr","Frankfurt(Main)-Gateway Gardens","Frankfurt(Main)Hbf","Frankfurt(Main)Messe","Frankfurt(Main)Ost","Frankfurt(Main)Süd","Frankfurt(Main)West","Frankfurt(Oder)","Frankfurt(Oder)-Neuberesinchen","Frankfurt(Oder)-Rosengarten","Frankfurt-Berkersheim","Frankfurt-Eschersheim","Frankfurt-Frankfurter Berg","Frankfurt-Griesheim","Frankfurt-Höchst","Frankfurt-Höchst Farbwerke","Frankfurt-Louisa","Frankfurt-Mainkur","Frankfurt-Nied","Frankfurt-Niederrad","Frankfurt-Rödelheim","Frankfurt-Sindlingen","Frankfurt-Sossenheim","Frankfurt-Unterliederbach","Frankfurt-Zeilsheim","Frankleben","Frantiskovy Lazne","Frantiskovy Lazne Aquaforum","Frastanz","Frauenalb-Schielberg","Frauenau","Frauenfeld","Frauenhain","Frechen-Königsdorf","Freckleben","Freden(Leine)","Fredenbeck","Fredericia st","Fredersdorf(b Berlin)","Freiberg(Neckar)","Freiberg(Sachs)","Freiburg Klinikum","Freiburg Messe/Universität","Freiburg(Breisgau) Hbf","Freiburg-Herdern","Freiburg-Landwasser","Freiburg-Littenweiler","Freiburg-St Georgen","Freiburg-Wiehre","Freiburg-Zähringen","Freienbach SBB","Freienohl","Freienorla","Freihalden","Freihung","Freihöls","Freilassing","Freilassing-Hofham","Freimersheim(Rheinh)","Freinsheim","Freising","Freital-Coßmannsdorf","Freital-Deuben","Freital-Hainsberg","Freital-Hainsberg West","Freital-Potschappel","Frellstedt","Frelsdorf","Fremdingen Bf","Fremersdorf","Frenkendorf-Füllinsdorf","Frenz","Fresenburg","Fretzdorf","Freudenberg-Kirschfurt","Freudenstadt Hbf","Freudenstadt Industriegebiet","Freudenstadt Schulzentrum","Freudenstadt Stadt","Freusburg Siedlung","Freyburg(Unstrut)","Freyung Bf","Fribourg/Freiburg","Frickenhausen","Frickenhausen Kelterstraße","Frickhofen","Fridingen(b Tuttlingen)","Fridolfing","Friedberg Süd","Friedberg(Augsburg)","Friedberg(Hess)","Friedelhausen","Friedensdorf(Lahn)","Friedersdorf(Königs Wusterhausen)","Friedewald(Kr Dresden) Bad","Friedewald(Kr Dresden)Hp","Friedland(Han)","Friedrich Wilhelmshütte","Friedrichroda","Friedrichsdorf(Taunus)","Friedrichsfeld(Niederrhein)","Friedrichsgabe","Friedrichshafen Flughafen","Friedrichshafen Hafen","Friedrichshafen Landratsamt","Friedrichshafen Ost","Friedrichshafen Stadt","Friedrichshafen-Fischbach","Friedrichshafen-Kluftern","Friedrichshafen-Manzell","Friedrichshöhe","Friedrichsplatz, Kassel","Friedrichsruhe(Meck)","Friedrichssegen","Friedrichstadt","Friedrichstal Mitte, Stutensee","Friedrichstal Nord, Stutensee","Friedrichstal Saint-Riquier-Platz, Stutensee","Friedrichstal b Freudenstadt","Friedrichstal(Baden)","Friedrichsthal(Saar)","Friedrichsthal(Saar) Mitte","Friedrichsthal(b Bayreuth)","Friedrichswalde(bei Eberswalde)","Friesach in Kärnten","Friesack(Mark)","Friesdorf","Friesdorf Ost","Friesenheim(Baden)","Frimmersdorf","Frisvadvej st","Fritzens-Wattens","Fritzlar","Frohburg","Frommern","Fronhausen(Lahn)","Frontenex","Frose","Frouard","Frutigen","Frömern","Fröndenberg","Fröttstädt","Fulda","Fuldatal-Ihringshausen","Furschenbach","Furth im Wald","Furth(b Deisenhofen)","Futuroscope","Fährbrücke","Föderlach","Föhren","Förbau","Förderstedt","Förtha(Eisenach)","Förtschendorf","Fürfurt","Fürnitz","Fürstenberg(Havel)","Fürsteneck","Fürstenfeldbruck","Fürstenwald","Fürstenwalde Süd","Fürstenwalde(Spree)","Fürstenzell","Fürth Westvorstadt","Fürth(Bay)Hbf","Fürth(Odenw)","Fürth-Burgfarrnbach","Fürth-Dambach","Fürth-Unterfarrnbach","Fürth-Unterfürberg","Füssen","Gaanderen","Gablingen","Gadebusch","Gaggenau Bf","Gaggenau Mercedes-Benz Werk","Gagny","Gaildorf West","Gaillon Aubevoye","Gaimersheim","Gaißach","Gallarate","Gamburg(Tauber)","Gammertingen","Gammertingen Europastraße","Gampel-Steg","Ganderkesee","Gandrange-Amneville","Gangloffsömmern","Gannat","Ganzlin","Garbeck","Garbenteich","Garching(Alz)","Gardanne","Gardelegen","Garding","Garftitz","Garmisch-Partenkirchen","Garmisch-Partenkirchen Hausberg","Gars(Inn)","Gatersleben","Gau Algesheim","Gau Bickelheim","Gaubüttelbrunn","Gausbach","Gauselfingen","Gauting","Gdansk Glowny","Gdansk Oliwa","Gdansk Wrzeszcz","Gdynia Glowna","Gebersdorf","Gebra(Hainleite)","Geeste","Geestenseth","Geestgottberg","Gehlberg","Geigant","Geilenkirchen","Geilhausen","Geinberg","Geiselhöring","Geisenbrunn","Geisenhausen","Geisenheim","Geising","Geisingen","Geisingen-Aulfingen","Geisingen-Hausen","Geisingen-Kirchen","Geisingen-Leipferdingen","Geislingen(Steige)","Geislingen(Steige)West","Geitau","Geithain","Gelbensande","Geldermalsen","Geldern","Geldrop","Geleen Oost","Geleen-Lutterade","Gelnhausen","Gelsenkirchen Hbf","Gelsenkirchen Zoo","Gelsenkirchen-Buer Nord","Gelsenkirchen-Buer Süd","Gelsenkirchen-Hassel","Gelsenkirchen-Rotthausen","Geltendorf","Gelterkinden","Gemmingen","Gemmingen West","Gemona del Friuli","Gemünden(Main)","Genderkingen","Gendorf","Gengenbach","Genk","Gennweiler","Genova Piazza Principe","Gensingen-Horrweiler","Gent St Pieters","Gent-Dampoort","Gentbrugge","Genthin","Genève","Genève-Aéroport","Georgensgmünd","Gera Hbf","Gera Süd","Gera-Langenberg","Gera-Zwötzen","Geraberg","Geradstetten","Gerhausen","Gerichshain","Gerlachsheim","Gerlafingen","Gerlenhofen","Gerling im Pinzgau","Germering-Unterpfaffenhofen","Germersheim","Germersheim Mitte/Rhein","Germersheim Süd/Nolte","Gernlinden","Gernrode(Harz)","Gernrode-Niederorschel","Gernsbach Bf","Gernsbach Mitte","Gernsheim","Geroldshausen","Gerolstein","Gersdorf(Görlitz)","Gersfeld(Rhön)","Gerstetten","Gersthofen","Gerstungen","Gertenbach","Gerwisch","Geseke","Gessertshausen","Gettenau-Bingenheim","Gettorf","Gevelsberg Hbf","Gevelsberg West","Gevelsberg-Kipp","Gevelsberg-Knapp","Gevrey-Chambertin","Giengen(Brenz)","Giersleben","Gießen","Gießen Erdkauter Weg","Gießen Licher Str","Gießen Oswaldsgarten","Gießenbach in Tirol","Gifhorn","Gifhorn Stadt","Gilching-Argelsried","Gildenhall","Gilze-Rijen","Gingen(Fils)","Girod","Girona","Gisikon-Root","Gisors Embranchement","Gittelde/Bad Grund(Harz)","Giubiasco","Gjesing st","Gladbeck Ost","Gladbeck West","Gladbeck-Zweckel","Glan-Münchweiler","Glanerbrug","Glanzstoffwerke","Glashütte(Sachs)","Glattbrugg","Glattfelden","Glaubitz(Riesa)","Glauburg-Glauberg","Glauburg-Stockheim","Glauchau(Sachs)","Glauchau-Schönbörnchen","Gleisdorf","Glesch","Gloggnitz","Glossen(b Oschatz)","Glöwen","Glückauf","Glückstadt","Gmund(Tegernsee)","Gmünd NÖ","Gnadau","Gnarrenburg","Gnarrenburg Nord","Gnevkow","Gniezno","Goch","Gochsheim(Baden)","Godramstein","Goebelsmühle","Goes","Gokels","Goldbeck(Osterburg)","Goldberg(Württ)","Goldenstedt(Oldb)","Goldhausen","Goldshöfe","Golling-Abtenau","Gollmitz(Niederlausitz)","Golm","Golzow(Eberswalde)","Golzow(Oderbruch)","Golßen(Niederlausitz)","Gomadingen","Gommern","Gondelsheim Schlossstadion","Gondelsheim(Baden)","Goor","Goppenstein","Gorgast","Gorinchem","Gosberg","Goslar","Gossau SG","Gotha","Gotha Ost","Gottenheim","Gottesauer Platz/BGV, Karlsruhe","Gotteszell","Gottlieben (Schifflände)","Gottmadingen","Gouda","Gouda Goverwelle","Gouvy","Goßdorf-Kohlmühle","Goßfelden","Goßmannsdorf","Graal-Müritz","Graal-Müritz Koppelweg","Graben(Lechfeld)Gewerbepark","Graben-Neudorf","Graben-Neudorf Nord","Grabow(Meckl)","Grafenaschau","Grafenau","Grafenwiesen","Graffenstaden","Grafing Bahnhof","Grafing Stadt","Grafling-Arzting","Grafrath","Gramatneusiedl","Grambow","Gramsbergen","Granollers","Gransee","Gratwein-Gratkorn","Grauschwitz Flocke","Graz Hbf","Graz Ostbahnhof-Messe","Grebenstein","Gredstedbro st","Greifswald","Greifswald Süd","Greiz","Greiz-Dölau","Grenchen Nord","Grenoble","Grenzach","Greppin","Gresy-sur-Isere","Gretz-Armainvilliers","Greußen","Greven","Grevenbroich","Grevesmühlen","Grieben(Meckl)","Griebo","Griefstedt","Gries am Brenner","Gries im Pinzgau","Griesen(Oberbay)","Grieskirchen-Gallspach","Grießen(Baden)","Grijpskerk","Grimma ob Bf","Grimmen","Grimmenthal","Grobau","Groenendaal","Grombach","Gronau(Westf)","Groningen","Groningen Europapark","Groningen Noord","Gronsdorf","Grou-Jirnsum","Groß Ammensleben","Groß Behnitz","Groß Brütz","Groß Düngen","Groß Gerau","Groß Gerau-Dornberg","Groß Gerau-Dornheim","Groß Karben","Groß Kiesow","Groß Kreutz","Groß Köris","Groß Laasch","Groß Lüsewitz","Groß Pankow","Groß Quassow","Groß Rohrheim","Groß Schwaß","Groß Schönebeck","Groß-Umstadt Klein-Umstadt","Groß-Umstadt Mitte","Groß-Umstadt Wiebelsbach","Großarmschlag","Großauheim(Kr Hanau)","Großbeeren","Großbodungen","Großbothen","Großburgwedel","Großdeuben","Großen Buseck","Großen Linden","Großenaspe","Großenbrode","Großengottern","Großenhain Cottb Bf","Großenkneten","Großenlüder","Großfurra","Großgeschaidt","Großharthau","Großhelfendorf","Großheringen","Großhesselohe Isartalbf","Großkarolinenfeld","Großkorbetha","Großkrotzenburg","Großkugel","Großlehna","Großneuhausen","Großpösna","Großrudestedt","Großräschen","Großröhrsdorf","Großschwabhausen","Großschönau(Sachs)","Großsteinberg","Großwalbur","Großwudicke","Grub am Forst","Grub(Oberbay)","Grub(Oberpf)","Grunbach","Grunow(Niederlausitz)","Gräfelfing","Gräfenberg","Gräfendorf","Gräfenhainichen","Gräfenroda","Gräfenstuhl-Klippmühle","Gräfentonna","Gräveneck","Grävenwiesbach","Gröbenzell","Gröbers","Gröbming","Gröditz(Riesa)","Grötzingen","Grötzingen Krappmühlenweg","Grötzingen Oberausstraße","Grüna(Sachs)Hp","Grünbach(Vogtl)","Grünberg(Oberhess)","Grünebach Ort","Grünebacherhütte","Grüneberg","Grünhainichen-Borstendorf","Grünsfeld","Grünstadt","Grünstadt Nord","Grüntal-Wittlensweiler","Gstadt(Wanderbahn)","Guben","Guldager st","Gummersbach","Gummersbach-Dieringhausen","Gumpenried-Asbach","Gundelfingen(Bay)","Gundelfingen(Breisgau)","Gundelsdorf","Gundelshausen","Gundelsheim(Neckar)","Gundersheim(Rheinhess)","Guntersblum","Guntramsdorf Kaiserau","Gunzenhausen","Gurten OÖ","Gussenstadt","Gustorf","Gutach Freilichtmuseum","Gutach(Breisgau)","Gutenfürst","Guthmannshausen","Guxhagen","Györ","Gänserndorf","Gärtringen","Gäufelden","Göbelnrod","Göhrde","Göhren(Rügen)","Göllheim-Dreisen","Gölshausen","Gölshausen Industriegebiet","Göppingen","Görden","Görlitz","Görlitz-Rauschwalde","Görlitz-Weinhübel","Görsbach","Görschnitz","Göschenen","Götschendorf","Göttingen","Götz","Götzendorf/Leitha","Götzis","Gößnitz","Güdingen","Gültstein","Gündlkofen","Güntersberge","Günzach","Günzburg","Güsen(b Genthin)","Güsten","Güstrow","Güterglück","Gütersloh Hbf","Güttingen","Haaltert","Haan","Haan-Gruiten","Haar","Haarhausen","Haarlem","Haarlem Spaarnwoude","Hachenburg","Hadamar","Hademarschen","Hademstorf","Hadmersleben","Haffkrug","Hagebök","Hagelstadt","Hagen Hbf","Hagen(Han)","Hagen(Kr. Stade)","Hagen-Heubing","Hagen-Oberhagen","Hagen-Vorhalle","Hagen-Wehringhausen","Hagen-Westerbauer","Hagenau im Innkreis","Hagenbach","Hagenbüchach","Hagenow Land","Hagenow Stadt","Hagenwerder","Hagondange","Hagsfeld Bahnhof, Karlsruhe","Hagsfeld Geroldsäcker, Karlsruhe","Hagsfeld Jenaer Straße, Karlsruhe","Hagsfeld Reitschulschlag (Schleife), Karlsruhe","Hagsfeld Reitschulschlag, Karlsruhe","Hagsfeld Süd, Karlsruhe","Haguenau","Haidenaab-Göppmannsbühl","Haidkapelle","Haiger","Haiger Obertor","Haigerloch","Hailer-Meerholz","Haiming","Hainburg Hainstadt","Hainewalde","Hainichen","Hainstadt(Baden)","Haitz-Höchst","Halbe","Halberstadt","Halberstadt Oststr","Halberstadt-Spiegelsberge","Halbmeil","Haldensleben","Haldern(Rheinl)","Halen","Halfing","Halfweg-Zwanenburg","Halitplatz, Kassel","Hall in Tirol","Hallbergmoos","Halle Dessauer Brücke","Halle Messe","Halle Rosengarten","Halle Steintorbrücke","Halle Südstadt","Halle Wohnstadt Nord","Halle Zoo","Halle Zscherbener Straße","Halle(S) Heidebf","Halle(Saale)Hbf","Halle(Westf)","Halle(Westf) OWL-Arena","Halle-Ammendorf","Halle-Neustadt","Halle-Nietleben","Halle-Silberhöhe","Halle-Trotha","Hallein","Hallstadt(b Bamberg)","Hallwang-Elixhausen","Halstenbek","Haltern am See","Haltingen","Halver-Oberbrügge","Hamburg Airport","Hamburg Alte Wöhr","Hamburg Berliner Tor","Hamburg Billwerder-Moorfleet","Hamburg Burgwedel","Hamburg Dammtor","Hamburg Diebsteich","Hamburg Elbbrücken","Hamburg Elbgaustraße","Hamburg Friedrichsberg","Hamburg Hasselbrook","Hamburg Hbf","Hamburg Hbf (S-Bahn)","Hamburg Hochkamp","Hamburg Hoheneichen","Hamburg Holstenstraße","Hamburg Jungfernstieg","Hamburg Klein Flottbek","Hamburg Kornweg(Klein Borstel)","Hamburg Königstraße","Hamburg Landungsbrücken","Hamburg Landwehr","Hamburg Mittlerer Landweg","Hamburg Neuwiedenthal","Hamburg Reeperbahn","Hamburg Rübenkamp","Hamburg Stadthausbrücke","Hamburg Wandsbeker Chaussee","Hamburg-Allermöhe","Hamburg-Altona","Hamburg-Altona(S)","Hamburg-Bahrenfeld","Hamburg-Barmbek","Hamburg-Bergedorf","Hamburg-Blankenese","Hamburg-Eidelstedt","Hamburg-Eidelstedt Zentrum","Hamburg-Fischbek","Hamburg-Hammerbrook","Hamburg-Harburg","Hamburg-Harburg Rathaus","Hamburg-Harburg(S)","Hamburg-Heimfeld","Hamburg-Hörgensweg","Hamburg-Iserbrook","Hamburg-Langenfelde","Hamburg-Nettelnburg","Hamburg-Neugraben","Hamburg-Ohlsdorf","Hamburg-Othmarschen","Hamburg-Poppenbüttel","Hamburg-Rahlstedt","Hamburg-Rissen","Hamburg-Rothenburgsort","Hamburg-Schnelsen","Hamburg-Stellingen","Hamburg-Sternschanze","Hamburg-Sülldorf","Hamburg-Tiefstack","Hamburg-Tonndorf","Hamburg-Veddel","Hamburg-Wandsbek","Hamburg-Wellingsbüttel","Hamburg-Wilhelmsburg","Hameln","Hamm(Westf)Hbf","Hamm-Bockum-Hövel","Hamm-Heessen","Hammah","Hammelburg","Hammelburg Ost","Hammelspring","Hammerau","Hammersbach Zugspitzbahn, Grainau","Hammerstein","Hammerunterwiesenthal","Hamminkeln","Hamminkeln-Dingden","Hanau Hbf","Hanau Klein-Auheim","Hanau Nord","Hanau West","Hanau-Wilhelmsbad","Handeloh","Hanfertal","Hangelar Mitte","Hangelsberg","Hann Münden","Hannover Anderten-Misburg","Hannover Bismarckstr.","Hannover Flughafen","Hannover Hbf","Hannover Karl-Wiechert-Allee","Hannover Messe/Laatzen","Hannover-Bornum","Hannover-Kleefeld","Hannover-Ledeburg","Hannover-Leinhausen","Hannover-Linden/Fischerhof","Hannover-Nordstadt","Hannover-Vinnhorst","Hanweiler-Bad Rilchingen","Happurg","Harblek","Harburg(Schwab)","Hard-Fussach","Hardegsen","Hardenberg","Harderwijk","Hardhof","Hardinxveld Blauwe Zoom","Hardinxveld-Giessendam","Haren(Ems)","Haren(NL)","Harlesiel","Harlingen(NL)","Harra","Harra Nord","Harras(Thür)","Harsdorf","Harsefeld","Harsum","Hartenstein","Hartershofen","Harthaus","Hartmannmühle","Hartmannshof","Harzgerode","Hasbergen","Haselbrunn","Haselstauden (Dornbirn)","Haslach","Hasloch(Main)","Hasloh","Haslohfurth","Haspelmoor","Hassel(Saar)","Hasselborn","Hasselfelde","Hasselt","Haste","Hatlerdorf(Dornbirn)","Hattenheim","Hattersheim(Main)","Hattert","Hatting in Tirol","Hattingen(R) Mitte","Hattingen(Ruhr)","Hattorf","Hatzenport","Haubersbronn","Haubersbronn Mitte","Hauenstein Mitte","Hauenstein(Pfalz)","Haunetal-Neukirchen","Haupeltshofen","Hauptfriedhof, Karlsruhe","Hauptfriedhof, Kassel","Hauptstuhl","Hauptwil","Haus Bethlehem, Karlsruhe","Haus im Ennstal","Hausach","Hausen (b Düren)","Hausen i Tal","Hausen(Eichsfeld)","Hausen(Schwab)","Hausen(Taunus)","Hausen-Raitbach","Hausen-Starzeln","Hausham","Havixbeck","Hayange","Haynsburg","Hazebrouck","Haßfurt","Haßloch(Pfalz)","Haßmersheim","Hebertsfelden","Hebertshausen","Hechingen","Hechingen Landesbahn","Hechthausen","Heddesheim/Hirschberg","Hedemünden","Hedersdorf","Hedersleben-Wedderstedt","Heemskerk","Heemstede-Aerdenhout","Heerbrugg","Heerenveen","Heerhugowaard","Heerlen","Heerlen Woonboulevard","Heeze","Hegelsbergstraße, Kassel","Heggen","Hegne","Hegyeshalom","Hegyeshalom(Gr)","Heide(Holst)","Heidelberg Hbf","Heidelberg Orthopädie","Heidelberg-Altstadt","Heidelberg-Kirchheim/Rohrbach","Heidelberg-Pfaffengrund/Wieblingen","Heidelberg-Schlierbach/Ziegelhausen","Heidelberg-Weststadt/Südstadt","Heidelsheim","Heidelsheim Nord","Heidenau","Heidenau Süd","Heidenau-Großsedlitz","Heidenheim","Heidenheim Voithwerk","Heidenheim-Mergelstetten","Heidenheim-Schnaitheim","Heidesheim(Rheinhess)","Heidkrug","Heigenbrücken","Heilbad Heiligenstadt","Heilbr.-Böckingen Berufsschulzentrum","Heilbronn Finanzamt","Heilbronn Friedensplatz","Heilbronn Hans-Rießer-Straße","Heilbronn Harmonie","Heilbronn Harmonie/Hafenmarktpassage","Heilbronn Harmonie/Kunsthalle","Heilbronn Hauptbahnhof/Willy-Brandt-Pl.","Heilbronn Hbf","Heilbronn Industrieplatz","Heilbronn Karlstor","Heilbronn Kaufland","Heilbronn Neckar-Turm/K.-S.-Pl","Heilbronn Pfühlpark","Heilbronn Rathaus","Heilbronn Sülmertor","Heilbronn Technisches Schulzentrum","Heilbronn Theater","Heilbronn Trappensee","Heiligendamm","Heiligengrabe","Heiligenstatt(Obb)","Heiligenstein(Pfalz)","Heiloo","Heilsbronn","Heimbach (Eifel)","Heimbach(Nahe)","Heimbach(Nahe)Ort","Heimenkirch","Heimerdingen","Heimersheim","Heimstetten","Heinebach","Heino","Heinrich-Heine-Straße, Kassel","Heinsberg Kreishaus","Heinsberg(Rheinl)","Heinsberg-Dremmen","Heinsberg-Horst","Heinsberg-Oberbruch","Heinsberg-Porselen","Heinsberg-Randerath","Heinschenwalde","Heinzenhausen","Heitersheim","Heiterwang-Plansee","Heldrungen","Helenesee","Helmbrechts","Helmond","Helmond Brandevoort","Helmond Brouwhuis","Helmond t Hout","Helmsdorf(Pirna)","Helmsheim","Helmstadt(Baden)","Helmstedt","Helpup","Hemmen-Dodewaard","Hemmerde","Hemmersdorf(Saar)","Hemmingen","Hemmoor","Hemsbach","Hemsen(b Soltau)","Hendaye","Hendschiken","Henfenfeld","Hengelo","Hengelo Gezondheidspark","Hengelo Oost","Henin-Beaumont","Henne st","Hennef im Siegbogen","Hennef(Sieg)","Hennen","Hennersdorf(Sachs)","Hennigsdorf (S)","Hennigsdorf(b Berlin)","Henstedt-Ulzburg","Heppenheim(Bergstr)","Herbertingen","Herbertingen Ort","Herbertshofen","Herblingen","Herbolzheim(Breisg)","Herbolzheim(Jagst)","Herborn(Dillkr)","Herbrechtingen","Herchen","Herdecke","Herdorf","Herentals","Herford","Hergatz","Hergenrath","Hergershausen","Heringen(Helme)","Heringsdorf Neuhof","Herlasgrün","Herleshausen Hp","Hermaringen","Hermentingen","Hermsdorf(Dresden)","Hermsdorf-Klosterlausnitz","Herne","Herne-Börnig","Herny","Heroldsberg","Heroldsberg Nord","Herrath","Herrenberg","Herrenberg Zwerchweg","Herrensee","Herrenstraße, Karlsruhe","Herrlingen","Herrlisheim près Colmar","Herrlishöfen","Herrnburg","Herrsching","Hersbruck(l Pegnitz)","Hersbruck(r Pegnitz)","Herstal","Herten(Baden)","Hervest-Dorsten","Herxheim am Berg","Herzberg Schloß","Herzberg(Elster)","Herzberg(Harz)","Herzberg(Mark)","Herzebrock","Herzele","Herzhorn","Herzogenbuchsee","Herzogenburg","Herzogenrath","Herzogenrath-Alt-Merkstein","Herzogenrath-August-Schmidt-Platz","Hesedorf","Heselbach","Hesepe","Hesseln","Hesseneck Kailbach","Hesseneck Schöllenbach","Hessisch Oldendorf","Hetschburg","Hettenhausen","Hettingen(Hohenz)","Hettstedt","Hetzdorf(Flöhatal)","Hetzerath","Heudeber-Danstedt","Heufeld","Heufeldmühle","Heusenstamm","Hiddenhausen-Schweicheln","Hilchenbach","Hildbrandsgrün","Hildburghausen","Hilden","Hilden Süd","Hildesheim Hbf","Hildesheim Ost","Hillegom","Hillnhütten","Hilpertsau","Hilpoltstein","Hilter","Hilversum","Hilversum Media Park","Hilversum Sportpark","Himmelpforten","Himmelreich","Himmelstadt","Hindeloopen","Hinrichssegen","Hinterweidenthal","Hinterweidenthal Ort","Hinterweidenthal Ost","Hinterzarten","Hirsau","Hirschaid","Hirschfelde","Hirschfelden","Hirschhorn(Neckar)","Hirschhorn(Pfalz)","Hirtenweg/Technologiepark, Karlsruhe","Hittfeld","Hitzacker","Hnevice","Hochdahl","Hochdahl-Millrath","Hochdorf(b Horb)","Hochfelden","Hochfilzen","Hochhausen(Tauber)","Hochheim(Main)","Hochneukirch","Hochspeyer","Hochstadt-Marktzeuln","Hochstetten","Hochstetten Altenheim, Linkenheim-Hochstetten","Hochstetten Grenzstraße","Hochstetten(Nahe)","Hochstätten(Pfalz)","Hochwang","Hochzirl","Hockenheim","Hockeroda","Hodenhagen","Hodonin","Hoeilaart","Hoeje Taastrup st","Hoensbroek","Hoevelaken","Hof Hbf","Hof(Münstertal)","Hof-Neuhof","Hofeld","Hofen(b Aalen)","Hoffenheim","Hoffnungsthal","Hofgeismar","Hofgeismar-Hümme","Hofheim (Ried)","Hofheim(Taunus)","Hohegrete","Hohen Neuendorf West","Hohen Neuendorf(b Berlin)","Hohenau","Hohenbrunn","Hohendorf","Hohenebra Ort","Hoheneggelsen","Hohenems","Hohenfichte","Hohenleipisch","Hohenleuben","Hohenlimburg","Hohenpeißenberg","Hohenroda","Hohenschäftlarn","Hohenstadt(Mittelfr)","Hohenstein-Ernstthal","Hohensülzen","Hohenthurm","Hohenwarth","Hohenwarth Campingplatz","Hohenwestedt","Hohenwulsch","Hohndorf Mitte","Holdorf(Meckl)","Holdorf(Oldb)","Hollandsche Rading","Holländische Straße, Kassel","Holländischer Platz/Universität, Kassel","Holm-Seppensen","Holstentherme","Holten","Holtensen/Linderte","Holthusen","Holzdorf(Elster)","Holzdorf(b Weimar)","Holzgerlingen Bf","Holzgerlingen Buch","Holzgerlingen Hülben","Holzhau","Holzhau Skilift","Holzhausen(Kr Siegen)","Holzheim(b Neuss)","Holzkirchen","Holzminden","Holzwickede","Hombourg-Haut","Homburg(Saar)Hbf","Honrath","Hoofddorp","Hoogeveen","Hoogezand-Sappemeer","Hoogkarspel","Hoorn","Hoorn Kersenboogerd","Hopfgarten im Brixental","Hopfgarten im Brixental Berglift","Hopfgarten(Sachs)","Hopfgarten(Weimar)","Hoppecke","Hoppegarten(Mark)","Hoppingen","Hoppstädten(Nahe)","Horb","Horb-Heiligenfeld","Horgen","Horka","Horn(Bodensee)","Horn(Bodensee), SF","Horn-Bad Meinberg","Hornberg(Schwarzw)","Horneburg","Horni Blatna","Horni Dvoriste","Horni Kamenice","Horni Podluzi","Horni Poustevna","Hornstorf","Horovice","Horrem","Horst(Holst)","Horst-Sevenum","Hosena","Houten","Houten Castellum","Houthem-St. Gerlach","Howald","Hoyerswerda","Hoyerswerda-Neustadt","Hoykenkamp","Hradek nad Nisou","Hranice na Morave","Hrebeny","Hubacker","Hubertushöhe","Huchem-Stammeln","Huckstorf","Hude","Hufschlag","Huglfing","Hugstetten","Hulb","Hundsgrün","Hundstadt","Hungen","Huntlosen","Hurdegaryp","Husby","Husum","Huttenheim","Huy(B)","Huzenbach","Hviding st","Hyllerslev st","Häggenschwil-Winden","Hähnichen","Hähnlein-Alsbach","Hämelerwald","Hämerten","Händelstraße, Karlsruhe","Häuserhof","Höchst Hetschbach","Höchst Mümling-Grumbach","Höchst(Odenw)","Höchstädt(Donau)","Höfen(Enz) Bf","Höfen(Enz) Nord","Höfingen","Höhenkirchen-Siegertsbrunn","Höhmühlbach","Höllenthal","Höllriegelskreuth","Höpfling","Hörden","Hörlkofen","Hörpolding","Hörschel Hp","Hörsching","Hörselgau","Hörstel","Hörstmar(Lippe)","Hösbach","Hösel","Höste","Hövelhof","Hövelriege","Höxter Rathaus","Höxter-Godelheim","Höxter-Lüchtringen","Höxter-Ottbergen","Hübschstraße, Karlsruhe","Hückelhoven-Baal","Hüffenhardt","Hüfingen Mitte","Hünfeld","Hüntwangen-Wil","Hürth-Kalscheuren","Hüttau","Hütten","Hüttenbusch","Hüttengrund","Hüttingen","IJlst","Ibach","Ibbenbüren","Ibbenbüren-Esch","Ibbenbüren-Laggenbeck","Ichenhausen","Icking","Idar-Oberstein","Idstein(Taunus)","Iffeldorf","Igel","Igensdorf","Igersheim","Ihringen","Ilawa Glowna","Ilberstedt","Ilfeld","Ilfeld Bad","Ilfeld Neanderklinik","Ilfeld Schreiberwiese","Illertissen","Illesheim","Illingen(Saar)","Illingen(Württ)","Ilmenau","Ilmenau Bad","Ilmenau Pörlitzer Höhe","Ilmenau-Roda","Ilsenburg","Immelborn","Immendingen","Immendingen Mitte","Immendingen Zimmern","Immenhausen","Immenreuth","Immensee","Immensen-Arpke","Immenstadt","Imst-Pitztal","Imsterberg","Imsweiler","Ingelbach","Ingelheim","Ingelmunster","Ingolstadt Audi","Ingolstadt Hbf","Ingolstadt Nord","Ingwiller","Inheiden","Inningen","Innsbruck Hbf","Innsbruck Hötting","Innsbruck Westbahnhof","Inowroclaw","Inselstadt Malchow","Insheim","Interlaken Ost","Interlaken West","Inzing/Inn","Iphofen","Ipsheim","Irfersgrün","Irrenlohe","Is-sur-Tille","Iselle di Trasquera","Iselle transito","Iserlohn","Iserlohnerheide","Isernhagen","Ismaning","Ispringen","Isselhorst-Avenwedde","Istein","Ittersbach Bahnhof","Ittersbach Industrie, Karlsbad","Ittersbach Rathaus","Ittling","Ittlingen","Itzehoe","Itzelberg","Ivanic Grad","Jabel(Meckl)","Jablonne v Podjestedi","Jacobsdorf(Mark)","Jaderberg","Jagdschloß","Jagstzell","Jahnsdorf(Erzgeb)","Janderup st","Jankowa Zaganska","Janovice nad Uhlavou","Jarrenwisch","Jasnitz","Jatznick","Jeber-Bergfrieden","Jechtingen","Jedlova","Jeeser","Jegum st","Jelenia Gora","Jena Paradies","Jena Saalbf","Jena West","Jena-Göschwitz","Jena-Zwätzen","Jenbach","Jenbach Zillertalbahn","Jennersdorf","Jerichow","Jerxheim","Jesenice(Gr)","Jesenice(SL)","Jesewitz(Leipzig)","Jessen(Elster)","Jestetten","Jettenbach","Jettingen","Jeumont","Jever","Jeßnitz(Anh)","Jiretin pod Jedlovou","Jirkov zast.","Joachimsthal","Joachimsthal Kaiserbahnhof","Jocketa","Jockgrim Bf","Joeuf","Johanngeorgenstadt","Joigny(Lar.Migennes)","Jossa","Judenburg","Julbach","Jungingen(Hohenz)","Jungnau","Juvisy","Jägersfreude","Jänschwalde","Jänschwalde Ost","Jävenitz","Jöhlingen","Jöhlingen West","Jößnitz","Jübek","Jüchen","Jülich","Jülich An den Aspen","Jülich Forschungszentrum","Jülich-Broich","Jülich-Nord","Jülich-Selgersdorf","Jünkerath","Jüterbog","Jütrichau","KIT-Campus Nord Bahnhof, Eggenstein-Leopoldshafen","KVG-Betriebshof, Kassel","Kaarst IKEA","Kaarst Mitte/Holzbüttgen","Kaarster Bahnhof","Kaarster See","Kablow","Kadan-Prunerov","Kahl Kopp/Heide","Kahl(Main)","Kahla(Thür)","Kaiseraugst","Kaisersesch","Kaiserslautern Galgenschanze","Kaiserslautern Hbf","Kaiserslautern Pfaffwerk","Kaiserslautern West","Kaiserslautern-Hohenecken","Kaiserstuhl AG","Kalchreuth","Kaldenkirchen","Kalenborn(Westerw)","Kalhausen","Kall","Kalsdorf b.Graz","Kalsow","Kaltenberg","Kaltenbrunnen im Montafon","Kalteneck","Kaltenkirchen Süd","Kaltenkirchen(Holst)","Kalthof(Kr Iserlohn)","Kalwang","Kamen","Kamen-Methler","Kamenz(Sachs)","Kamp-Bornhofen","Kampen Zuid","Kampen(NL)","Kandel","Kandern","Kandersteg","Kanzem","Kapelle-Biezelinge","Kapellen-Drusweiler","Kapellen-Wevelinghoven","Kapen Biosphärenreservat","Kapfenberg","Kappelrodeck","Kappelrodeck Ost","Kapsweyer","Kargow","Karlovy Vary","Karlovy Vary dolni n.","Karlsburg","Karlsdorf","Karlshagen","Karlsruhe Albtalbahnhof","Karlsruhe Bahnhofsvorplatz","Karlsruhe Durlacher Tor / KIT-Campus Süd","Karlsruhe Entenfang","Karlsruhe Hbf","Karlsruhe Hbf Südausgang","Karlsruhe Marktplatz (Kaiserstraße)","Karlsruhe Mühlburger Tor (Kaiserallee)","Karlsruhe West","Karlsruhe-Durlach","Karlsruhe-Hagsfeld","Karlsruhe-Kniel. Rheinbergstr.","Karlsruhe-Knielingen","Karlsruhe-Mühlburg","Karlsruhe-Neureut Kirchfeld","Karlstadt(Main)","Karpfham","Karsdorf","Karstädt","Karthaus","Kasbach","Kasbach Brauerei Steffens","Kassel Hbf","Kassel Hbf (tief)","Kassel-Harleshausen","Kassel-Jungfernkopf","Kassel-Kirchditmold","Kassel-Oberzwehren","Kassel-Wilhelmshöhe","Kastl(Oberbay)","Katharinenheerd","Kating","Katlenburg","Katowice","Kattenes","Kattenvenne","Katzenfurt","Katzhütte","Katzwang","Katzweiler","Kaub","Kaufbeuren","Kaufering","Kaulsdorf(Saale)","Kautenbach","Kavelstorf(Kr Rostock)","Kehl","Kehlen","Kehlhof","Keitum","Kelenföld","Kelkheim","Kelkheim-Hornau","Kelkheim-Münster","Kellmünz","Kelsterbach","Kematen in Tirol","Kemnath-Neustadt","Kempen(Niederrhein)","Kempten(Allgäu)Hbf","Kempten(Allgäu)Ost","Kemtau","Kennelgarten","Kenz","Kenzingen","Kerkerbach","Kerkrade Centrum","Kerkwitz","Kersbach","Kesswil","Kesteren","Kestert","Kettwig","Kettwig Stausee","Kevelaer","Kiebingen","Kiebitzhöhe","Kiefersfelden","Kiel Hbf","Kiel Schulen am Langsee","Kiel-Ellerbek","Kiel-Elmschenhagen","Kiel-Hassee CITTI-PARK","Kiel-Oppendorf","Kiel-Russee","Kierspe","Kilchberg(CH)","Killer","Killwangen-Spreitenbach","Kindberg","Kinding(Altmühltal)","Kindsbach","Kirch Göns","Kirch-Jesar","Kirchanschöring","Kirchberg in Tirol","Kirchberg(Murr)","Kirchbichl","Kirchdorf(Deister)","Kirchdorf/Krems","Kirchehrenbach","Kirchen","Kirchenlaibach","Kirchenlamitz Ost","Kirchentellinsfurt","Kirchgasse, Kassel","Kirchhain(Bz Kassel)","Kirchhammelwarden","Kirchheim(Neckar)","Kirchheim(Teck)","Kirchheim(Teck)-Ötlingen","Kirchheim(Teck)Süd","Kirchheim(Unterfr)","Kirchheim(Weinstr)","Kirchheimbolanden","Kirchhorsten","Kirchhundem","Kirchlengern","Kirchmöser","Kirchscheidungen","Kirchseeon","Kirchweidach","Kirchweyhe","Kirchzarten","Kirkel","Kirn","Kirnbach-Grün","Kirnsulzbach","Kirschbaumwasen","Kissing","Kittsee","Kitzbühel","Kitzbühel Hahnenkamm","Kitzingen","Kißlegg","Klaffenbach Hp","Klagenfurt Hbf","Klais","Klandorf","Klanxbüll","Klarenbeek","Klasdorf Glashütte","Klatovy","Klaus in Vorarlberg","Klecken","Kledering b.Wien","Kleeth","Klein Bünzow","Klein Gerau","Klein Winternheim-Ober Olm","Kleinberghofen","Kleinbettingen","Kleinblittersdorf","Kleinenbroich","Kleinensiel","Kleinfurra","Kleingemünden","Kleinheubach","Kleinjena","Kleinkems","Kleinkötz","Kleinostheim","Kleinröhrsdorf","Kleinschirma","Kleinsteinbach","Kleinwallstadt","Kleve","Klieken","Klimmen-Ransdaal","Klinge","Klingenberg(Main)","Klingenberg-Colmnitz","Klingenbrunn","Klingenthal","Klingnau","Klinikum Bremen-Nord/Beckedorf","Klitschmar","Klitten","Klockow(b Waren/Müritz)","Kloster Bronnbach","Kloster Marienthal","Kloster Oesede","Klosterbuch","Klosterfelde","Klosterlechfeld","Klostermansfeld","Klostermansfeld Randsiedlung","Klosterreichenbach","Kloten","Klotten","Kläden(Stendal)","Knesebeck","Knielingen Eggensteiner Straße, Karlsruhe","Knielingen Herweghstraße, Karlsruhe","Knielingen Siemens, Karlsruhe","Knielinger Allee/Städt. Klinikum, Karlsruhe","Knittelfeld","Knittlingen-Kleinvillars","Knöringen-Essingen","Kobern-Gondorf","Koblenz Dorf","Koblenz Hbf","Koblenz Stadtmitte","Koblenz(CH)","Koblenz-Ehrenbreitstein","Koblenz-Güls","Koblenz-Lützel","Koblenz-Moselweiß","Kochel","Kodersdorf","Koebenhavn H","Koebenhavns Lufthavn st","Kogenheim","Kohlscheid","Kohlstetten","Kolbermoor","Kolbnitz","Kolding st","Kolin(CZ)","Kolkwitz","Kolkwitz Süd","Kollmarsreute","Kollnau","Komarom","Konin","Konstanz","Konstanz Hafen","Konstanz-Fürstenberg","Konstanz-Petershausen","Konstanz-Wollmatingen","Konz","Konz Mitte","Konzerthaus, Karlsruhe","Koog aan de Zaan","Korbach Hbf","Korbach Süd","Kordel","Kork","Korntal","Korntal Gymnasium","Kornwestheim Pbf","Korschenbroich","Korsoer st","Kortenberg","Kortrijk","Koserow","Kothmaißling","Kottenheim","Koudum-Molkwerum","Krabbendijke","Kraftsdorf","Kraftwerk Finkenheerd","Kraghammer","Krakow Glowny","Kralupy nad Vltavou","Kranebitten","Kranichfeld","Kranj","Kraslice","Kraslice predmesti","Kraslice-Pod vlekem","Krasna Lipa","Krasna Lipa mesto","Kratzeburg","Krauthausen","Kredenbach","Krefeld Hbf","Krefeld-Hohenbudberg Chempark","Krefeld-Linn","Krefeld-Oppum","Krefeld-Uerdingen","Kreiensen","Kreimbach-Kaulbach","Kremmen","Krempe","Kremperheide","Krems an der Donau","Krensitz","Kressbronn","Kressbronn Hafen","Kretscham-Rothensehma","Kreuz Konz","Kreuzau Bahnhof","Kreuzau-Eifelstraße","Kreuzberg(Ahr)","Kreuzeck/Alpspitzbahn Bahnhof, Garmisch-Partenkirc","Kreuzlingen","Kreuzlingen Bernrain","Kreuzlingen Hafen","Kreuzstraße","Kreuztal","Kreuztal-Littfeld","Kriftel","Krimmeri-Meinau","Krimov","Krippen","Krommenie-Assendelft","Kronach","Kronberg Süd","Kronberg(Taunus)","Kronenplatz (Fritz-Erler-Str.), Karlsruhe","Kronenplatz (Kaiserstraße), Karlsruhe","Kronshagen","Kronskamp","Kronweiler","Kropswolde","Krsko","Kruft","Kruiningen-Yerseke","Krumbach(Schwab)","Krumbach(Schwab)Schule","Krumhermsdorf","Krumpa","Krumpendorf/Wörthersee","Krupunder","Krzewina Zgorzelecka","Krölpa-Ranis","Kröpelin","Kubschütz","Kuchen","Kuchl","Kufstein","Kullenmühle, Bad Herrenalb","Kulmbach","Kummerow(Stralsund)","Kummersdorf(Storkow)","Kundl","Kunersdorf","Kunowice","Kupfermühle","Kuppenheim","Kurort Altenberg(Erzgebirge)","Kurort Jonsdorf","Kurort Jonsdorf Hst","Kurort Kipsdorf","Kurort Oberwiesenthal","Kurort Oybin","Kurort Oybin-Niederdorf","Kurort Rathen","Kurt-Schumacher-Straße, Karlsruhe","Kusel","Kutenholz","Kutina","Kutno","Kuty","Kutzenhausen","Kyhna","Kyllburg","Kyritz","Kytlice","Kälberau","Kämmereiforst","Köditz","Köfering","Kölleda","Köln Airport-Businesspark","Köln Frankfurter Straße","Köln Geldernstr./Parkgürtel","Köln Hansaring","Köln Hbf","Köln Messe/Deutz","Köln Messe/Deutz Gl. 9-10","Köln Messe/Deutz Gl.11-12","Köln Steinstraße","Köln Süd","Köln Trimbornstr","Köln Volkhovener Weg","Köln West","Köln-Blumenberg","Köln-Buchforst","Köln-Chorweiler","Köln-Chorweiler Nord","Köln-Dellbrück","Köln-Ehrenfeld","Köln-Holweide","Köln-Longerich","Köln-Mülheim","Köln-Müngersdorf Technologiepark","Köln-Nippes","Köln-Stammheim","Köln-Weiden West","Köln-Worringen","Köln/Bonn Flughafen","Kölpinsee","Köndringen","Königs Wusterhausen","Königsbach(Baden)","Königsborn","Königsbronn","Königsbrück","Königschaffhausen","Königshofen(Baden)","Königshofen(Kahl)","Königslutter","Königsplatz, Kassel","Königsstollen","Königstein(Sächs Schw)","Königstein(Taunus)","Königswinter","Königswinter Fähre","Königswinter, Clem.-August-Str.","Könitz(Thür)","Könnern","Köppern","Körle","Körmend","Köthen","Köttewitz","Kötzschau","Kövenig","Kühler Krug, Karlsruhe","Kühnhausen","Kühren","Külte-Wetterburg","Künsebeck","Küntrop","Küps","Kürbitz","Küssnacht am Rigi","Küstrin-Kietz","LAigle","La Bastide-St-Laurent les Bains","La Brigue(F)","La Charité sur Loire","La Plaine","La Roche sur Yon","La Souterraine","Laa/Thaya","Laaber","Laage(Meckl)","Laberweinting","Lachen","Ladenburg","Lage Zwaluwe","Lage(Lippe)","Lagerlechfeld","Lahntal-Sarnau","Lahr(Schwarzw)","Laineck","Lalendorf","Lam","Lamadelaine","Lambach","Lambrecht(Pfalz)","Lambsheim","Lameyplatz, Karlsruhe","Lamone-Cadempino","Lampertheim","Lampertsmühle-Otterbach","Lampertswalde","Lancken","Landau(Isar)","Landau(Pfalz)Hbf","Landau(Pfalz)Süd","Landau(Pfalz)West","Landeck-Zams","Landen","Landgraaf","Landquart","Landry","Landsberg(L)Schule","Landsberg(Lech)","Landsberg(b. Halle/Saale)","Landsberg(b. Halle/Saale) Süd","Landshut(Bay)Hbf","Landshut(Bay)Süd","Landstuhl","Landsweiler-Reden","Lang Göns","Langdorf","Langdorp","Langebrück(Sachs)","Langeln(Holst)","Langelsheim","Langen am Arlberg","Langen(Hess)","Langen-Flugsicherung","Langenargen","Langenau(Württ)","Langenbach(Oberbay)","Langenbrand","Langendorf","Langeneichstädt","Langenfeld(Rhld)","Langenfeld(Rhld)-Berghausen","Langenhagen Mitte","Langenhagen Pferdemarkt","Langenhagen-Kaltenweide","Langenhahn","Langenhorn(Schlesw)","Langenlonsheim","Langenmoor","Langenorla Ost","Langenorla West","Langenprozelten","Langenselbold","Langenstein","Langensteinbach Bahnhof","Langensteinbach Schießhüttenäcker, Karlsbad","Langensteinbach St. Barbara, Karlsbad","Langenthal(CH)","Langenwang(Schwab)","Langenweddingen","Langenwolmsdorf","Langenwolmsdorf Mitte","Langenzenn","Langerwehe","Langhagen","Langkampfen","Langlau","Langsdorf(Oberhess)","Langwedel","Langweid(Lech)","Lansingerland-Zoetermeer","Lathen","Laubendorf","Laubenheim(Nahe)","Laucha(Unstrut)","Lauchhammer","Lauchheim","Lauchringen","Lauchringen West","Lauda","Laudenbach am Main","Laudenbach(Bergstr)","Laudenbach(Württ)","Lauenbrück","Lauenburg(Elbe)","Lauenförde-Beverungen","Lauenstein(Sachs)","Lauf West","Lauf(links Pegnitz)","Lauf(rechts Pegnitz)","Laufach","Laufen(CH)","Laufen(Oberbay)","Laufenburg(Baden)","Laufenburg(Baden)Ost","Laufenburg(CH)","Lauffen(Neckar)","Lauingen","Laupheim Stadt","Laupheim West","Laurenburg(Lahn)","Lausanne","Lausanne-Flon","Lauscha(Thür)","Lausen(CH)","Lauta(Nl)","Lautenbach(Baden)","Lauter(Sachs)","Lauterach","Lauterbach Mole","Lauterbach(Hess)Nord","Lauterbach(Rügen)","Lauterbach-Steinbach","Lauterbourg","Lauterecken-Grumbach","Laußnitz","Laveno Mombello","Le Blanc-Mesnil","Le Bourget","Le Creusot Montceau Montchanin TGV","Le Havre","Le Mans","Le Raincy Villemomble Montferm","Lebach","Lebach-Jabach","Lebbeke","Leer(Ostfriesl)","Leerdam","Leese-Stolzenau","Leeuwarden","Leeuwarden Camminghaburen","Legden","Legefeld","Legelshurst","Legnica","Lehmen","Lehndorf(Altenburg)","Lehnheim","Lehnitz","Lehrte","Leibnitz","Leichlingen","Leiden Centraal","Leiden Lammenschans","Leiferde(b Gifhorn)","Leimstruth","Leinefelde","Leinfelden","Leingarten","Leingarten Mitte","Leingarten Ost","Leingarten West","Leipheim","Leipzig Allee-Center","Leipzig Anger-Crottendorf","Leipzig Bayerischer Bahnhof","Leipzig Coppiplatz","Leipzig Essener Straße","Leipzig Grünauer Allee","Leipzig Hbf","Leipzig Hbf (tief)","Leipzig Karlsruher Str","Leipzig MDR","Leipzig Markt","Leipzig Messe","Leipzig Miltitzer Allee","Leipzig Mockauer Straße","Leipzig Nord","Leipzig Olbrichtstraße","Leipzig Slevogtstraße","Leipzig Völkerschlachtdenkmal","Leipzig Werkstättenstraße","Leipzig Wilhelm-Leuschner-Platz","Leipzig-Connewitz","Leipzig-Engelsdorf","Leipzig-Gohlis","Leipzig-Heiterblick","Leipzig-Holzhausen","Leipzig-Knauthain","Leipzig-Leutzsch","Leipzig-Liebertwolkwitz","Leipzig-Lindenau","Leipzig-Lützschena","Leipzig-Miltitz","Leipzig-Möckern","Leipzig-Mölkau","Leipzig-Paunsdorf","Leipzig-Plagwitz","Leipzig-Rückmarsdorf","Leipzig-Sellerhausen","Leipzig-Stötteritz","Leipzig-Thekla","Leipzig-Wahren","Leipzig/Halle Flughafen","Leipziger Platz, Kassel","Leipziger Straße, Kassel","Leisnig","Leithen b.Seefeld","Leitstade","Leißling","Lelystad Centrum","Lembeck","Lemförde","Lemgo","Lemgo-Lüttfeld","Lemmie","Lend","Lendringsen","Lengede-Broistedt","Lengefeld-Rauenstein","Lengenfeld(Vogtl)","Lengenwang","Lengerich(Westf)","Lenggries","Lenglern","Lengwil","Lennestadt-Altenhundem","Lennestadt-Grevenbrück","Lennestadt-Meggen","Lens(F)","Lensahn","Lentföhrden","Lenzburg","Lenzing","Leoben Hbf","Leogang","Leonberg","Leopoldsburg","Leopoldshafen Frankfurter Straße, Eggenstein-Leopo","Leopoldshafen Leopoldstr.","Leopoldshafen Viermorgen, Eggenstein-Leopoldshafen","Leopoldstal","Lermoos","Lerouville","Les Arcs Draguignan","Les-Aubrais-Orleans","Lesce-Bled","Leschede","Lessingstraße, Karlsruhe","Letmathe","Letmathe Dechenhöhle","Letschin","Lette(Kr Coesfeld)","Letter","Leubingen","Leubsdorf(Rhein)","Leubsdorf(Sachs)","Leudelange","Leuk","Leun/Braunfels","Leuna Werke Nord","Leuna Werke Süd","Leutenberg","Leuterschach","Leutershausen-Wiedersbach","Leutesdorf(Rhein)","Leuthen(Cottbus)","Leutkirch","Leuven","Leverkusen Chempark","Leverkusen Mitte","Leverkusen-Küppersteg","Leverkusen-Rheindorf","Leverkusen-Schlebusch","Lezignan","Liberec","Lich(Oberhess)","Lichtenberg(Erzgeb)","Lichtenfels","Lichtenhain(a d Bergbahn)","Lichtenstein Ernst-Schneller-Siedlung","Lichtenstein Gewerbegebiet","Lichtenstein Hartensteiner Straße","Lichtenstein(Sachs)","Lichtentanne(Sachs)","Lichtentanne(Thür)","Lichtenthal","Lichtenvoorde-Groenlo","Liebenau(Bz Kassel)","Liebenthal(Prignitz)","Lieblos","Liederbach","Liederbach-Süd","Lienz in Osttirol","Liers","Liestal","Lietzow(Rügen)","Liezen","Lille Europe","Lille Flandres","Limbach(Vogtl)","Limbach(b Homburg,Saar)","Limburg Süd","Limburg(Lahn)","Limburgerhof","Limmritz(Sachs)","Limone","Linda(Elster)","Lindach","Lindau-Aeschach","Lindau-Insel","Lindau-Reutin","Lindenberg(Mark)","Lindenberg, Kassel","Lindenholzhausen","Lindern","Lindhorst(Schaumb-Lippe)","Lindow(Mark)","Lindwedel","Lingen(Ems)","Lingenfeld","Linkenheim Friedrichstraße, Linkenheim-Hochstetten","Linkenheim Rathaus","Linkenheim Schulzentrum, Linkenheim-Hochstetten","Linkenheim Süd, Linkenheim-Hochstetten","Linnich Bhf","Linnich-Tetz","Linsburg","Linsenhofen","Linz Hbf","Linz(Rhein)","Linz/Donau Wegscheid","Lipinki Luzyckie","Lipova u Sluknova","Lippstadt","Lispenhausen","Lissendorf","Listerscheid","Litija","Litomerice mesto","Livorno Centrale","Liège-Guillemins","Ljubljana","Lobstädt","Locarno","Lochau-Hörbranz","Lochem","Lochham","Loeftgaard st","Lohgarten-Roth","Lohhof","Lohmen","Lohne(Oldb)","Lohnweiler","Lohr Bahnhof","Lohsa","Loitsch-Hohenleuben","Lollar","Longueau","Longwy","Lons-Le-Saunier","Lonsee","Loosdorf b.Melk","Loppenhausen","Loppersum","Lorch(Rhein)","Lorch(Württ)","Lorchhausen","Lorraine","Lorsbach","Lorsch","Lorüns","Lottschesee","Lottstetten","Lourches","Lourdes","Lovosice","Loxstedt","Loßburg-Rodt","Luban Sl.","Lubolz","Luckaitztal","Luckau-Uckro","Luckenau","Luckenwalde","Ludersheim","Ludesch","Ludwigsau-Friedlos","Ludwigsburg","Ludwigschorgast","Ludwigsfelde","Ludwigsfelde-Struveshof","Ludwigshafen(Bodensee)","Ludwigshafen(Rh)Hbf","Ludwigshafen(Rhein) BASF Mitte","Ludwigshafen(Rhein) BASF Nord","Ludwigshafen(Rhein) BASF Süd","Ludwigshafen(Rhein) Mitte","Ludwigshafen(Rhein) Oppau","Ludwigshafen-Mundenheim","Ludwigshafen-Oggersheim","Ludwigshafen-Rheingönheim","Ludwigshöhe","Ludwigslust","Ludwigsstadt","Ludwigsthal","Lugano","Luh nad Svatavou","Luhe","Luhe-Wildenau","Luino","Luisenthal(Saar)","Lumes Halte","Lund Central","Lunde J st","Lunden","Lunderskov st","Lunel","Lunestedt","Lunteren","Lunéville","Lupfig","Lustenau","Luterbach-Attisholz","Lutherplatz, Kassel","Lutherstadt Eisleben","Lutherstadt Wittenberg Altstadt","Lutherstadt Wittenberg Hbf","Lutherstadt Wittenberg-Labetz","Lutherstadt Wittenberg-Piesteritz","Lutten","Lutterbach","Lutum","Lutzelbourg","Luxembourg","Luzern","Lyon Part Dieu","Lähn","Läufelfingen","Löbau(Sachs)","Löcherberg","Löcknitz","Lödingsen","Löf","Löffingen","Löhnberg","Löhne(Westf)","Lököshaza","Lörrach Dammstraße","Lörrach Hbf","Lörrach Museum/Burghof","Lörrach Schwarzwaldstraße","Lörrach-Brombach/Hauingen","Lörrach-Haagen/Messe","Lörrach-Stetten","Lörzenbach-Fahrenbach","Lövenich","Löwenberg(Mark)","Löwental","Lößnitz ob Bf","Lößnitz unt Bf","Lößnitzgrund","Lübbecke(Westf)","Lübben(Spreewald)","Lübbenau(Spreewald)","Lübberstedt","Lübeck Flughafen","Lübeck Hbf","Lübeck Hochschulstadtteil","Lübeck St Jürgen","Lübeck-Dänischburg IKEA","Lübeck-Kücknitz","Lübeck-Travem. Skandinavienkai","Lübeck-Travemünde Hafen","Lübeck-Travemünde Strand","Lüblow(Meckl)","Lübs(Magdeburg)","Lübstorf","Lüdenscheid","Lüdenscheid-Brügge","Lüdersdorf(Meckl)","Lüdinghausen","Lügde","Lüneburg","Lünen Hbf","Lünen-Preußen","Lünern","Lüssow(Meckl)","Lütter","Lützel","Lützow","Maarheeze","Maarn","Maarssen","Maasbüll(b Niebüll)","Maastricht","Maastricht Noord","Maastricht Randwyck","Machern(Sachs)","Machnin","Machnin hrad","Magdeburg Hasselbachplatz","Magdeburg Hbf","Magdeburg Herrenkrug","Magdeburg SKET Industriepark","Magdeburg Südost","Magdeburg-Buckau","Magdeburg-Eichenweiler","Magdeburg-Neustadt","Magdeburg-Rothensee","Magdeburg-Salbke","Magdeburg-Sudenburg","Magstadt","Mahlow","Mahlwinkel","Maichingen","Maichingen Nord","Maienfeld","Maikammer-Kirrweiler","Mainaschaff","Mainhausen Zellhausen","Mainleus","Mainroth","Maintal Ost","Maintal West","Mainz Hbf","Mainz Nord","Mainz Römisches Theater","Mainz Waggonfabrik","Mainz-Bischofsheim","Mainz-Gonsenheim","Mainz-Gustavsburg","Mainz-Kastel","Mainz-Laubenheim","Mainz-Marienborn","Mainz-Mombach","Maisach","Maishofen-Saalbach","Mala Velen","Malbork","Malchin","Malching(Oberbay)","Malczyce","Malk Göhren","Mallersdorf","Malliß","Mallnitz-Obervellach","Malmsheim","Malmö Central","Malsch","Malsch Süd","Malsfeld","Malsfeld-Beiseförth","Malter","Mamer","Mamer Lycée","Mammendorf","Mammern URh","Mammern(Bodensee)","Manage","Mandern","Manebach","Manndorf","Mannenbach URh","Mannenbach-Salenstein","Mannheim ARENA/Maimarkt","Mannheim Handelshafen","Mannheim Hbf","Mannheim-Friedrichsfeld Süd","Mannheim-Käfertal","Mannheim-Luzenberg","Mannheim-Neckarau","Mannheim-Neckarstadt","Mannheim-Rheinau","Mannheim-Seckenheim","Mannheim-Waldhof","Mansfeld(Südharz)","Manternach","Mantgum","Marbach Ost (Villingen-Schwenningen)","Marbach West(Villingen-Schwenningen)","Marbach(Neckar)","Marbach(b Münsingen)","Marbach-Grafeneck","Marbeck-Heiden","Marburg Süd","Marburg(Lahn)","Marche-les-Dames","Marchegg","Marchienne au Pont","Marchtrenk","Margertshausen Bf","Maria Rain","Maria Veen","Maribor","Marienberg(NL)","Marienborn","Marienhafe","Marienheide","Markdorf(Baden)","Marke","Markelfingen","Markelsheim","Markkleeberg","Markkleeberg Mitte","Markkleeberg Nord","Markkleeberg-Gaschwitz","Markkleeberg-Großstädteln","Markranstädt","Marksuhl","Markt Bibart","Markt Erlbach","Markt Indersdorf","Markt Schwaben","Marktbreit","Marktl","Marktleuthen","Marktoberdorf","Marktoberdorf Schule","Marktplatz, Karlsruhe","Marktredwitz","Marktschorgast","Markvartice","Marl Mitte","Marl-Hamm","Marl-Sinsen","Marle-sur-Serre","Marlishausen","Marloie","Marne la Vallée-Chessy","Marnheim","Marquardt","Marsberg","Marseille-Blancarde","Marseille-St-Charles","Marstetten-Aitrach","Martensdorf","Martenshoek","Martigny","Martigues","Martinlamitz","Martinroda","Martinstein","Martinszell(Allgäu)","Marxgrün","Marxzell","Marzling","Maschen","Maselheim","Massen","Massing","Mathystraße, Karlsruhe","Matrei am Brenner","Matzenbach","Matzing","Maubach","Maubeuge","Mauer(b Heidelberg)","Maulbronn Stadt/Kloster","Maulbronn West","Maulburg","Mausheim","Mautern im Liesingtal","Mauthaus","Maxau","Maxhütte-Haidhof","Maximiliansau Eisenbahnstraße","Maximiliansau West","Maximiliansau-Im Rüsten","Mayen Ost","Mayen West","Mayrhofen im Zillertal","Mayschoß","Mechelen","Mechernich","Mechterstädt","Meckelfeld","Meckenbeuren","Meckenheim Industriepark","Meckenheim Kottenforst","Meckenheim(Bz Köln)","Meckesheim","Medewitz(Mark)","Medias","Meeder","Meerane","Meerbusch-Osterath","Meerssen","Meeschensee","Mehltheuer","Mehrhoog","Meine","Meinersdorf(Erzgeb)","Meinersen","Meinerzhagen","Meiningen","Meiringen","Meisdorf","Meitingen","Meitzendorf","Meißen","Meißen Altstadt","Meißen Triebischtal","Melbach","Melchow","Meldorf","Melk","Melle","Mellenbach-Glasbach","Mellendorf","Mellikon","Mellingen(Thür)","Mellrichstadt Bf","Mels","Melsdorf","Melsungen","Melsungen Bartenwetzerbrücke","Melsungen-Röhrenfurth","Melun","Memmingen","Menden(Rheinl)","Menden(Sauerland)","Menden(Sauerland)Süd","Mendig","Mendrisio","Mengen","Mengeringhausen","Mengersgereuth-Hämmern","Mengersgereuth-Hämmern Ost","Menningen-Leitishofen","Menton","Menzingen(Baden)","Menznau","Meppel","Meppen","Merano/Meran","Merching","Merchtem","Merchweiler","Merelbeke","Mering","Mering-St Afra","Mersch(LUX)","Mersch(Westf)","Merseburg Bergmannsring","Merseburg Hbf","Merten(Sieg)","Mertert","Mertesheim","Mertingen Bahnhof","Merxheim(Colmar)","Merzenich","Merzig(Saar)","Merzig(Saar) Ost","Merzig(Saar) Stadtmitte","Mesch Neue Mühle","Meschede","Messel","Messinghausen","Metelen Land","Mettenheim","Mettlach","Mettmann Stadtwald","Mettmann Zentrum","Metz Ville","Metzingen(Württ)","Metzingen-Neuhausen","Meuse TGV","Meuselbach-Schwarzmühle","Meyenburg","Meßdorf","Meßkirch","Michelau(LUX)","Michelau(Oberfr)","Michelau(Württ)","Michelaubrück","Michelbach(Unterfr)","Micheldorf","Michelstadt","Michendorf","Middelburg","Miedelsbach-Steinenberg","Miekinia","Miesbach","Miesenbach","Miesenheim","Mieste","Miesterhorst","Mikulasovice dolni nadrazi","Milano Centrale","Milano Greco Pirelli","Milano Porta Garibaldi","Millingen(b Rees)","Millingen(b Rheinb)","Milmersdorf","Milmort","Miltach","Miltenberg","Miltern","Miltzow","Mimberg","Mimon","Mindelaltheim","Mindelheim","Minden(Westf)","Mining","Miramas","Mirow","Mistorf","Mittel Gründau","Mittelherwigsdorf","Mitteloelsnitz","Mittelschmalkalden","Mittelsinn","Mittenwald","Mitterberghütten","Mitterdorf-Veitsch","Mittergars","Mittweida","Mixdorf","Mixnitz Bärenschützklamm","Mlada Boleslav hl.n.","Mlyny(CZ)","Mochenwangen","Mockrehna","Modane","Moers","Moidentin","Mol","Mols","Moltkestraße/Städt. Klinikum, Karlsruhe","Mommenheim","Monaco-Monte-Carlo","Monbach-Neuhausen","Monguelfo-Casies/Welsberg-Gsies","Monreal","Mons","Monsheim","Montabaur","Montbéliard Ville","Montelimar","Monthey","Montluçon Ville","Montmelian","Montpellier Saint-Roch","Montreux","Monza","Monzingen","Mook-Molenhoek","Moorbekhalle","Moosbachtal","Moosbierbaum-Heiligeneich","Moosburg","Moosrain","Moret-Veneux-les-Sablons","Morges","Morhange","Moritzburg","Morlesau","Morsum","Mosbach West","Mosbach(Baden)","Mosbach-Neckarelz","Mosel","Moselkern","Mosonmagyarovar","Most","Mouchard","Moulins-sur-Allier","Mouscron","Moustier","Moutier","Moutiers-Salins-Brides-les-Bains","Moyeuvre-Grande","Mudersbach","Muggensturm","Muggensturm Badesee","Muhr a See","Muizen","Mulda(Sachs)","Muldenberg","Muldenberg Floßplatz","Muldenhütten","Muldenstein","Mulhouse Ville","Mulhouse-Dornach","Mulsum-Essel","Munderkingen","Mundolsheim","Munkzwalm","Munsbach","Munster(Metzeral)","Munster(Örtze)","Muolen","Murg(Baden)","Murg(CH)","Murnau","Murnau Ort","Murrhardt","Musau","Mussidan","Muttenz","Mußbach","Mâcon Ville","Mâcon-Loché TGV","Mägdesprung","Mägerkingen","Märwil","Möckmühl","Mögelin","Mögglingen(Gmünd)","Möhlin","Möhringen Bahnhof","Möhringen Rathaus","Mölln(Lauenb)","Mölln(Meckl)","Mömbris-Mensengesäß","Mömbris-Strötzbach","Mönchengladbach Hbf","Mönchengladbach-Genhausen","Mönchengladbach-Lürrip","Mönchengladbach-Rheindahlen","Mönchhagen","Mönchröden","Mörfelden","Möringen(Altm)","Mörlenbach","Mörsch Am Hang, Rheinstetten","Mörsch Bach-West, Rheinstetten","Mörsch Merkurstraße, Rheinstetten","Mörsch Narzissenstraße, Rheinstetten","Mörsch Rheinaustraße, Rheinstetten","Mörsch Römerstraße, Rheinstetten","Mörsch Rösselsbrünnle, Rheinstetten","Möser","Mössingen","Möttingen","Mötz","Mücheln(Geiseltal)","Mücheln(Geiseltal) Stadt","Mücka","Mücke(Hess)","Müden(Mosel)","Mügeln Bf","Mühlacker","Mühlacker Rößlesweg","Mühlanger","Mühlbach(Pirna)","Mühlburg West, Karlsruhe","Mühlburger Feld, Karlsruhe","Mühlburger Tor (Kaiserallee), Karlsruhe","Mühldorf(Oberbay)","Mühldorf-Möllbrücke","Mühlehorn","Mühlen(Oldb)","Mühlen(b Horb)","Mühlenbeck-Mönchmühle","Mühlhausen(Thür)","Mühlhausen(b Engen)","Mühlheim am Inn","Mühlheim(Main)","Mühlheim(Main)-Dietesheim","Mühlheim(b Tuttlingen)","Mühlstetten","Mühltal","Mühringen","Mülheim(Ruhr)Hbf","Mülheim(Ruhr)Styrum","Mülheim(Ruhr)West","Müllheim(Baden)","Müllrose","Münchberg","Müncheberg(Mark)","Münchehof(Harz)","München Donnersbergerbrücke","München Flughafen Besucherpark","München Flughafen Terminal","München Hackerbrücke","München Harras","München Hbf","München Hbf (tief)","München Hbf Gl.27-36","München Hbf Gl.5-10","München Heimeranplatz","München Hirschgarten","München Isartor","München Karlsplatz","München Leienfelsstr.","München Leuchtenbergring","München Marienplatz","München Ost","München Rosenheimer Platz","München Siemenswerke","München St.Martin-Str.","München(Bad Berka)","München-Allach","München-Aubing","München-Berg am Laim","München-Daglfing","München-Englschalking","München-Fasanerie","München-Fasangarten","München-Feldmoching","München-Freiham","München-Giesing","München-Johanneskirchen","München-Karlsfeld","München-Laim","München-Langwied","München-Lochhausen","München-Mittersendling","München-Moosach","München-Neuaubing","München-Neuperlach Süd","München-Obermenzing","München-Pasing","München-Perlach","München-Riem","München-Solln","München-Trudering","München-Untermenzing","München-Westkreuz","Münchenbuchsee","Münchhausen","Münchingen","Münchingen Rührberg","Münchsmünster","Münchweiler(Alsenz)","Münchweiler(Rodalb)","Münnerstadt","Münsingen","Münsingen(CH)","Münster(Hessen)","Münster(W)Zentrum Nord","Münster(Westf)Hbf","Münster-Albachten","Münster-Amelsbüren","Münster-Hiltrup","Münster-Häger","Münster-Mecklenbeck","Münster-Roxel","Münster-Sarmsheim","Münster-Sprakel","Münster-Wiesing","Münsterlingen-Scherzingen","Münstertal(Schwarzwald)","Münzesheim","Münzesheim Ost","Mürlenbach","Mürzzuschlag","Müssen","Naarden-Bussum","Nabburg","Nachterstedt-Hoym","Nackenheim","Nagold","Nagold Stadtmitte","Nagold-Iselshausen","Nagold-Steinberg","Nagymaros-Visegrad","Naila","Namborn","Namedy","Nammen-Bad","Namur","Nancois Tronville","Nancy","Nantes","Narbonne","Narsdorf","Nassau(Erzgeb)","Nassau(Lahn)","Nassenbeuren","Nassenheide","Natrup-Hagen","Nauen","Nauendorf(Saalkr)","Nauheim(b Gr.Gerau)","Naumburg(Saale)Hbf","Naumburg(Saale)Ost","Naumburg-Roßbach","Naunhof","Neanderthal","Nebikon","Nebitzschen","Nebra","Nechlin","Neckarbischofsheim Helmhof","Neckarbischofsheim Nord","Neckarbischofsheim Stadt","Neckarburken","Neckargemünd","Neckargemünd Altstadt","Neckargerach","Neckarhausen bei Neckarsteinach","Neckarsteinach","Neckarsulm","Neckarsulm Mitte","Neckarsulm Nord","Neckarsulm Süd","Neckarzimmern","Nedlitz","Neef","Neerpelt","Neetzendorf","Neetzka","Neheim-Hüsten","Nehren","Neidenfels","Neidenstein","Neinstedt","Nejdek","Nejdek zastavka","Nejdek-Oldrichov","Nejdek-Sejfy","Nejdek-Sucha","Nejdek-Tisova","Nellmersbach","Nemmenich","Nemours St Pierre","Nemsdorf-Göhrendorf","Nendeln","Nendingen(b Tuttlingen)","Nennhausen","Nennig","Nennigmühle","Nenzing","Nenzingen","Nersingen","Nesselwang","Nessonvaux","Nestedice","Nestemice","Nettersheim","Nettingsdorf","Netzeband","Netzkater","Netzschkau","Neu Pudagla","Neu St Jürgen","Neu Wokern","Neu Wulmstorf","Neu-Anspach","Neu-Edingen/Friedrichsfeld","Neu-Isenburg","Neu-Ulm","Neubiberg","Neubrandenburg","Neubrücke(Nahe)","Neubukow","Neuburg(Donau)","Neuburg(Kammel)","Neuburg(Rhein)","Neubäu","Neuchâtel","Neudenau","Neudietendorf","Neudorf(Erzgeb)","Neue Schenke","Neuenburg(Baden)","Neuenbürg(Enz)","Neuenbürg(Enz) Freibad","Neuenbürg(Enz) Süd","Neuenbürg(Enz)-Rotenbach Eyachbrücke","Neuendettelsau","Neuenhagen(b Berlin)","Neuenhaus","Neuenhaus Süd","Neuenkirchen(Oldb)","Neuenmarkt-Wirsberg","Neuenrade","Neuenstein","Neufahrn(Niederbay)","Neufahrn(b Freising)","Neufchateau(B)","Neufchateau(F)","Neuffen","Neufra(Hohenz)","Neugersdorf","Neugilching","Neuhaus am Rennweg","Neuhaus(Pegnitz)","Neuhaus-Igelshieb","Neuhausen Bad Bf","Neuhausen(CH)","Neuhausen(Cottbus)","Neuhof(Kr Fulda)","Neuhof(b Zossen)","Neukieritzsch","Neukirch(Lausitz)Ost","Neukirch(Lausitz)West","Neukirch-Egnach","Neukirchen(Inn)","Neukirchen(b Sulzb)","Neukirchen-Klaffenbach","Neukirchen-Wyhra","Neukloster(Kr Stade)","Neulußheim","Neumark(Sachs)","Neumarkt(Oberpf)","Neumarkt-Kallham","Neumarkt-St Veit","Neumarkt/Wallersee","Neumühle(Elster)","Neumünster","Neumünster Stadtwald","Neumünster Süd AKN","Neundorf(Anh)","Neunhofen","Neunkirch","Neunkirchen a Sand","Neunkirchen(Kr Siegen)","Neunkirchen(Saar)-Wellesweiler","Neunkirchen(Saar)Hbf","Neuoelsnitz","Neupetershain","Neuratting","Neureut Adolf-Ehrmann-Bad, Karlsruhe","Neureut Bärenweg, Karlsruhe","Neureut Welschneureuter Straße, Karlsruhe","Neuruppin Rheinsberger Tor","Neuruppin Seedamm","Neuruppin West","Neusalza-Spremberg","Neuses(b Kronach)","Neusorg","Neuss Allerheiligen","Neuss Am Kaiser","Neuss Hbf","Neuss Rheinparkcenter","Neuss Süd","Neustadt am Rübenberge","Neustadt(Aisch)Bahnhof","Neustadt(Aisch)Mitte","Neustadt(Donau)","Neustadt(Dosse)","Neustadt(Holst)","Neustadt(Holst)Gbf","Neustadt(Kr Marburg)","Neustadt(Orla)","Neustadt(Sachs)","Neustadt(Schwarzw)","Neustadt(Waldnaab)","Neustadt(Weinstr) Süd","Neustadt(Weinstr)Hbf","Neustadt(b Coburg)","Neustadt-Böbig","Neustadt-Glewe","Neustadt-Hohenacker","Neustift(b Passau)","Neustrelitz Hbf","Neusäß","Neusörnewitz","Neutrebbin","Neuwied","Neuwiesenreben, Ettlingen","Neuwirtshaus(Porscheplatz)","Neuzelle","Neuötting","Nice Ville","Nidda","Nidderau","Nidderau-Eichen","Nidderau-Windecken","Nideggen-Brück","Niebüll","Niebüll Autoverladung","Niebüll neg","Niedaltdorf","Nieder Flörsheim-Dalsheim","Nieder Olm","Nieder Wöllstadt","Nieder-Ohmen","Niederarnbach","Niederau","Niederau-Tuchmühle","Niederbiegen","Niederbipp","Niederbobritzsch","Niederbrechen","Niederdollendorf","Niederdorf(Erzgeb)","Niederdorfelden","Niederdreisbach","Niederdresselndorf","Niedererbach","Niederfinow","Niederglatt","Niedergörsdorf","Niederhadamar","Niederheimbach","Niederhöchstadt","Niederhövels","Niederjosbach","Niederkorn","Niederlahnstein","Niederlehme","Niederlindhart","Niederlinxweiler","Niedermittlau","Niedermohr","Niederndodeleben","Niedernhausen(Taunus)","Niederoderwitz","Niederpöllnitz","Niederraunau","Niederroth","Niedersachswerfen","Niedersachswerfen Herkulesmarkt","Niedersachswerfen Ilfelder Straße","Niedersachswerfen Ost","Niederscheld(Dillkr)Süd","Niederschelden","Niederschelden Nord","Niederschlag","Niederschlottwitz","Niederschmalkalden","Niederselters","Niederspier","Niedersteinbach","Niederstetten","Niederstotzingen","Niedertrebra","Niederwalgern","Niederwalluf","Niederwartha","Niederweimar","Niederwiesa","Niederwillingen","Niederwinden","Niederwürschnitz","Niederzeuzheim","Niederzissen","Niederzwönitz","Niefern","Niemberg","Nienburg(Saale)","Nienburg(Weser)","Nienhagen(Halberst)","Nierstein","Niesky","Nieukerk","Nieuw Amsterdam","Nieuw Vennep","Nieuwerkerk a. d. Ijssel","Nievenheim","Nievern","Nijkerk","Nijmegen","Nijmegen Dukenburg","Nijmegen Goffert","Nijmegen Heyendaal","Nijmegen Lent","Nijverdal","Niklashausen","Nimburg(Baden)","Nistertal-Bad Marienberg","Nittel","Noerre Nebel st","Noerreport st","Noertzange","Nogent-le-Rotrou","Nohen","Nohfelden","Nohra(Weimar)","Nohra(Wipper)","Noisy-le-Sec","Nonnenhorn","Norddeich","Norddeich Mole","Norden","Nordendorf","Nordenham","Norderstedt Mitte","Nordhalben Bf","Nordhastedt","Nordhausen","Nordhausen Bahnhofsplatz","Nordhausen Hesseröder Straße","Nordhausen Nord","Nordhausen Ricarda-Huch-Straße","Nordhausen Schurzfell","Nordhausen-Altentor","Nordhausen-Krimderode","Nordhausen-Salza","Nordheim(Württ)","Nordholz","Nordhorn","Nordhorn-Blanke","Nordsode","Nordstemmen","Nordwalde","Norf","Norheim","Norsingen","Northeim(Han)","Nortorf","Nossentin","Notre-Dame-de-Briancon","Nottuln-Appelhülsen","Nova Gradiska","Nova Kapela","Nova Role","Nova Role zastavka","Novara","Nove Hamry","Nove Zamky","Noveant","Novska","Novy Bor","Noyon","Nufringen","Nunspeet","Nuth","Nußberg-Schönau","Ny Ellebjerg st","Nyborg st","Nyiregyhaza","Nymburk hl.n.","Nîmes","Nöbdenitz","Nördlingen","Nörten-Hardenberg","Nörvenich-Binsfeld","Nünchritz","Nürnberg Frankenstadion","Nürnberg Hbf","Nürnberg Nordost","Nürnberg Ost","Nürnberg Ostring","Nürnberg Rothenburger Str.","Nürnberg-Dutzendteich","Nürnberg-Dürrenhof","Nürnberg-Eibach","Nürnberg-Erlenstegen","Nürnberg-Gleißhammer","Nürnberg-Laufamholz","Nürnberg-Mögeldorf","Nürnberg-Rehhof","Nürnberg-Reichelsdorf","Nürnberg-Sandreuth","Nürnberg-Schweinau","Nürnberg-Stein","Nürnberg-Steinbühl","Nürtingen","Nürtingen-Roßdorf","Nürtingen-Vorstadt","Nützen","Nüziders","Ober Ramstadt","Ober Widdersheim","Oberachern","Oberachern Bindfadenfabrik","Oberaichen","Oberalm","Oberammergau","Oberasbach","Oberau","Oberaudorf","Oberbettingen-Hillesheim","Oberbillig","Oberbimbach","Oberboihingen","Oberbrechen","Oberburg","Obercarsdorf","Oberdachstetten","Oberderdingen-Flehingen Industrie","Oberelchingen","Oberelsungen","Obererbach","Oberesslingen","Oberferrieden","Obergimpern","Oberglatt","Obergries","Obergriesbach","Obergrunstedt","Oberhaid","Oberharmersbach Dorf","Oberharmersbach-Riersbach","Oberhausen Hbf","Oberhausen-Holten","Oberhausen-Osterfeld Süd","Oberhausen-Sterkrade","Oberhofen im Inntal","Oberholz","Oberkirch","Oberkirch-Köhlersiedlung","Oberkochen","Oberkorn","Oberkotzau","Oberkrozingen","Oberlahnstein","Oberlauscha","Oberlenningen","Oberlichtenau","Oberlindhart","Oberlinxweiler","Obermaubach","Obermodern","Obermohr","Obernau","Obernberg-Altheim","Obernburg-Elsenfeld","Oberndorf(Neckar)","Oberndorf(Wittgenstein)","Oberneuschönberg","Obernhof(Lahn)","Oberoderwitz","Oberoderwitz Oberdorf","Oberottmarshausen","Oberrieden(CH)","Oberriet","Oberrohn","Oberrothenbach","Oberrotweil","Oberröblingen","Oberschefflenz","Oberschleißheim","Oberschlottwitz","Obersdorf","Obersinn","Oberstaufen","Oberstdorf","Obertraubling","Obertshausen(Kr Of)","Obertsrot","Oberursel(Taunus)","Oberursel-Stierstadt","Oberursel-Weißkirchen/Steinbach","Obervogelgesang","Oberweimar","Oberweißbach-Deesbach","Oberwerrn","Oberwesel","Oberwinden","Oberwinter","Oberzell","Oberzissen","Oberöwisheim","Obing","Obourg","Obstfelderschmiede","Ochenbruck","Ochsenfurt","Ochsenhausen","Ochtmersleben","Ochtrup","Ockenheim","Odenheim Bf","Odenheim West","Odense st","Oderin","Oebisfelde","Oederan","Oegeln","Oehna","Oelde","Oelsnitz Bahnhofstraße","Oelsnitz(Erzgeb)","Oelsnitz(Vogtl)","Oerel","Oerlenbach","Oerlinghausen","Oermingen","Oertzenhof","Oese","Oesede","Oesterport st","Oestrich-Winkel","Oetrange","Oettingen(Bay)","Oeventrop","Offenau","Offenbach(Main) Kaiserlei","Offenbach(Main) Ledermuseum","Offenbach(Main) Marktplatz","Offenbach(Main)Hbf","Offenbach(Main)Ost","Offenbach-Bieber","Offenbach-Waldhof","Offenburg","Offenburg Kreisschulzentrum","Offenhausen","Offensen(Kr North)","Offingen","Oftersheim","Ohlstadt","Oisterwijk","Okarben","Oker","Oksboel st","Olbernhau","Olbernhau West","Olbernhau-Grünthal","Olbersdorf Niederdorf","Olbersdorf Oberdorf","Olbersleben-Ellersleben","Olching","Oldenburg(Holst)","Oldenburg(Oldb)","Oldenburg-Wechloy","Oldenbüttel","Oldentrup","Oldenzaal","Olen(Belgien)","Olovi","Olpe","Olsberg","Olsbrücken","Olst(NL)","Olten","Ommen","Onville","Oostende","Oosterbeek","Opfikon","Opheusden","Opladen","Opole Glowne","Oppenau","Oppenheim","Oppenweiler(Württ)","Oppikon","Oppurg","Opwijk","Orange(Avignon)","Oranienbaum(Anh)","Oranienburg","Oranienburg (S)","Orchies","Orlamünde","Orléans","Orschweier","Ortrand","Oschatz","Oschersleben(Bode)","Osnabrück Altstadt","Osnabrück Hbf","Osnabrück-Sutthausen","Oss","Oss West","Ostbevern","Ostendstraße, Karlsruhe","Osterburg","Osterburken","Osterhofen(Nby)","Osterhofen(Oberbay)","Osterholz-Scharmbeck","Ostermundigen","Ostermünchen","Osternienburg","Osterode am Harz Leege","Osterode am Harz Mitte","Ostersode","Osterspai","Osterstedt","Osterteich","Osterwald","Osterweddingen","Ostheim(Kr Hanau)","Ostheim(b Butzbach)","Osthofen","Ostrach Bahnhof","Ostrau","Ostrava hl.n.","Ostrava-Svinov","Ostseebad Binz","Ostseebad Kühlungsborn Mitte","Ostseebad Kühlungsborn Ost","Ostseebad Kühlungsborn West","Othmarsingen","Otrokovice","Ottenau","Ottendorf(Mittweida)","Ottendorf-Okrilla Hp","Ottendorf-Okrilla Nord","Ottendorf-Okrilla Süd","Ottenhofen(Oberbay)","Ottenhofen-Bergel","Ottenhöfen","Ottenhöfen West","Ottensoos","Otterfing","Otterndorf","Ottersberg(Han)","Otterwisch","Otting","Otting-Weilheim","Otto-Sachs-Straße, Karlsruhe","Ottobeuren","Ottobrunn","Ottweiler(Saar)","Otzberg Lengfeld","Otze","Otzing","Oudenbosch","Outrup st","Ovelgünne","Overath","Overveen","Owen(Teck)","Owschlag","Oy-Mittelberg","Oßmannstedt","Padborg st","Paderborn Hbf","Paderborn Kasseler Tor","Paderborn Nord","Paderborn-Schloss Neuhaus","Paderborn-Sennelager","Padova","Paffendorf","Pagny-sur-Moselle","Paindorf","Palzem","Pankofen","Pansdorf","Pantin","Papenburg(Ems)","Papendorf","Papierfabrik, Kaufungen","Papiermühle(Stadtr)","Pappenheim","Parchim","Pardubice hl.n.","Paris Austerlitz","Paris Est","Paris Gare de Lyon","Paris Montparnasse","Paris Nord","Paris St Lazare","Parkentin","Parndorf","Parsberg","Partenstein","Pasewalk","Pasewalk Ost","Passau Hbf","Passow(Uckermark)","Paternion-Feistritz","Patersdorf","Patsch","Pau","Paulinenaue","Paulinzella","Pavia","Pechbrunn","Peenemünde","Pegau","Peggau-Deutschfeistritz","Pegnitz","Peine","Peiting Nord","Peiting Ost","Peitz Ost","Peiß","Peißen","Peißenberg","Peißenberg Nord","Peltre","Penig","Penzberg","Pepinster","Perigueux","Perkam","Perl","Perleberg","Pernink","Perpignan","Peschiera del Garda","Petange","Petergrube","Petersaurach","Petersaurach Nord","Petershagen Nord","Petershagen(Uckerm)","Petershagen-Lahde","Petershain","Petershausen(Obb)","Peterskirchen","Petersroda","Petit Croix","Pfaffenhain","Pfaffenhausen","Pfaffenhofen(Ilm)","Pfalzel","Pfarrkirchen","Pfarrwerfen","Pflach","Pflaumloch","Pforzheim Hbf","Pforzheim Maihälden","Pforzheim-Weißenstein","Pfraundorf(Inn)","Pfreimd","Pfronten-Ried","Pfronten-Steinach","Pfronten-Weißbach","Pfullendorf","Pfungstadt","Pfäffikon SZ","Pfäffingen","Philipp-Reis-Straße, Karlsruhe","Philippsburg(Baden)","Philippshagen","Philippsheim","Philippstraße, Karlsruhe","Pichl b.Schladming","Piding","Piensk","Pill-Vomperbach","Pillgram","Pinneberg","Pinnow(Uckermark)","Pino transito","Pinzberg","Pirk","Pirmasens Hbf","Pirmasens Nord","Pirna","Pirna-Copitz","Pirna-Copitz Nord","Pisa Centrale","Pittenhart","Plaaz","Plaidt","Planegg","Plate(Meckl)","Plattling","Platz der Deutschen Einheit, Kassel","Plau am See Bahnhof","Plaue(Thür)","Plauen(V) unt Bf","Plauen(Vogtl) Mitte","Plauen(Vogtl) ob Bf","Plauen(Vogtl)-Straßberg","Plauen(Vogtl)West","Pleinfeld","Plesna(CZ)","Plessa","Plettenberg","Plochingen","Ploiesti Vest","Plzen hl.n.","Plön","Plüderhausen","Plüschow","Pockau-Lengefeld","Pocking","Pogeez","Poggenhagen","Poikam","Poing","Poitiers","Pomezi nad Ohri","Pommelsbrunn","Pommern(Mosel)","Pommritz","Ponitz","Pont St Vincent","Pont-Ste-Maxence","Pont-a-Mousson","Ponte Gardena-Laion/Waidbruck-Lajen","Pontresina","Poppenhausen","Pordenone","Porschdorf(Pirna)","Porstendorf","Port Bou","Port Vendres Ville","Porta Westfalica","Porz(Rhein)","Porz-Wahn","Posewald","Possenhofen","Postbauer-Heng","Poststraße, Karlsruhe","Potsdam Charlottenhof","Potsdam Griebnitzsee","Potsdam Griebnitzsee (S)","Potsdam Hbf","Potsdam Hbf (S)","Potsdam Medienstadt Babelsberg","Potsdam Park Sanssouci","Potsdam Pirschheide","Potsdam-Babelsberg","Potsdam-Rehbrücke","Potucky","Potucky zastavka","Pougues les Eaux","Poznan Gl.","Praest","Praha hl.n.","Praha-Holesovice","Praha-Smichov","Pram-Haag","Pratau","Pratteln","Predeal","Preetz","Pregarten","Premnitz Nord","Premnitz Zentrum","Prenzlau","Prerov","Pressath","Pressig-Rothenkirchen","Pretzfeld","Pretzier(Altm)","Pretzsch","Priemerburg","Prien a Chiemsee","Priestewitz","Prinzersdorf","Priort","Prisdorf","Prittitz","Pritzerbe","Pritzier","Pritzwalk","Pritzwalk Hainholz","Pritzwalk West","Probsteierhagen","Probstzella","Profen","Profondsart","Prora","Prora Ost","Prosselsheim","Przylep","Prödel","Prösen","Prösen Ost","Prösen West","Puch bei Hallein","Puchheim","Pulheim","Pullach","Pulling(b Freising)","Pulsnitz","Pulsnitz Süd","Purmerend","Purmerend Overwhere","Purmerend Weidevenne","Pusarnitz","Puschendorf","Putbus","Putten","Puttgarden","Putzkau","Pöchlarn","Pölchow","Pölling","Pöllwitz","Pönitz(Holst)","Pönitz(Leipzig)","Pörtschach am Wörther See","Pösing","Pößneck ob Bf","Pößneck unt Bf","Quadrath-Ichendorf","Quakenbrück","Quedlinburg","Quedlinburg-Quarmbeck","Quelle","Quelle-Kupferheide","Quendorf","Querfurt","Quevy","Quickborn","Quickborn Süd","Quickborner Straße","Quierschied","Quimper","Quint","Raaba","Raalte","Rabenau","Rackith(Elbe)","Rackwitz(Leipzig)","Radbruch","Raddusch","Radeberg","Radebeul Ost","Radebeul-Kötzschenbroda","Radebeul-Naundorf","Radebeul-Weintraube","Radebeul-Zitzschewig","Radeburg","Radersdorf","Radis","Radldorf(Niederbay)","Radolfzell","Radstadt","Raestrup-Everswinkel","Rafz","Raguhn","Rahden","Rain","Raindorf","Raisdorf","Raisting","Raitersaich","Rakow","Rambin(Rügen)","Ramerberg","Rammelsbach","Rammingen(Bay)","Rammingen(Württ)","Ramsbach Birkhof","Ramsbach Höfle","Ramsberg","Ramsen","Ramsenthal","Ramstein","Rangendingen","Rangsdorf","Rankweil","Ranstadt","Ranzo-S. Abbondio","Rastatt","Rastatt Beinle","Rastede","Rastow","Rathaus, Kassel","Rathaus/Fünffensterstraße, Kassel","Rathenow","Rathmannsdorf(Kr Pirna)","Ratingen Ost","Rattenberg-Kramsach","Ratzeburg","Raubling","Rauenstein(Thür)","Raumland-Markhausen","Raumünzach","Raun","Raunheim","Ravensburg","Ravenstein","Re(I)","Rebdorf-Hofmühle","Rebstein-Marbach","Rech","Rechenberg","Rechenberg Schule","Rechtenstein","Rechterfeld","Reckendorf","Reckenfeld","Recklinghausen Hbf","Recklinghausen Süd","Reckweilerhof","Reddelich","Rednitzhembach","Redwitz(Rodach)","Regen","Regensburg Hbf","Regensburg-Burgweinting","Regensburg-Prüfening","Regenstauf","Regis-Breitingen","Rehau","Rehfeld(Falkenberg)","Rehfelde","Rehna","Rehweiler","Reichelsdorfer Keller","Reichelsheim(Wett)","Reichenau(Baden)","Reichenbach Kurpark, Waldbronn","Reichenbach im Kandertal","Reichenbach(Fils)","Reichenbach(Oberlausitz)","Reichenbach(Vogtl) ob Bf","Reichenbach(b. Ettlingen)","Reichenberg(Unterfr)","Reichenburg","Reichenschwand","Reichersbeuern","Reichertshausen(Ilm)","Reichertshofen(Schwab) Bf","Reicholzheim","Reifland-Wünschendorf","Reihen","Reil","Reilsheim","Reims","Reinbek","Reinfeld(Holst)","Reinhardsbrunn-Friedrichroda","Reinheim(Odenw)","Reinsbüttel","Reinsdorf(Artern)","Reinsdorf(bei Nebra)","Reinstetten","Reisen(Hess)","Reiskirchen(Kr Gi)","Reith b.Seefeld","Rejsby st","Rekawinkel","Reken","Reken-Klein Reken","Rekingen AG","Remagen","Remiremont","Remscheid Hbf","Remscheid-Güldenwerth","Remscheid-Lennep","Remscheid-Lüttringhausen","Renchen","Rendsburg","Rennes","Renningen","Renningen Süd","Rennsteig","Rentrisch","Rentweinsdorf","Rentwertshausen","Rentzschmühle","Retenice","Rethen(Leine)","Retz","Retzbach-Zellingen","Reurieth","Reuterstadt Stavenhagen","Reuth(b Erbendorf)","Reuth(b Plauen,Vogtl)","Reutlingen Hbf","Reutlingen West","Reutlingen-Betzingen","Reutlingen-Sondelfingen","Reutte in Tirol","Reutte in Tirol Schulzentrum","Reuver","Reußen","Rhade","Rheda-Wiedenbrück","Rheden(NL)","Rheinbach","Rheinbach Römerkanal","Rheinberg(Rheinl)","Rheinbrohl","Rheine","Rheine-Mesum","Rheineck","Rheinfelden(Baden)","Rheinfelden(CH)","Rheinhafen, Karlsruhe","Rheinhafenstraße, Karlsruhe","Rheinhausen","Rheinhausen Ost","Rheinsberg(Mark)","Rheinsheim","Rheinweiler","Rheinzabern Alte Römerstraße","Rheinzabern Bf","Rheinzabern Rappengasse","Rhenen","Rhens","Rheydt Hbf","Rheydt-Odenkirchen","Rhöndorf","Ribe Noerremark st","Ribe st","Ribnitz-Damgarten Ost","Ribnitz-Damgarten West","Richen(b Eppingen)","Richterswil","Rickling","Ried","Ried im Innkreis","Riederau","Riedlingen","Riedrode","Riedstadt-Goddelau","Riedstadt-Wolfskehlen","Riegel am Kaiserstuhl Ort","Riegel-Malterdingen","Riegel-Malterdingen NE","Riehen","Riehen Niederholz","Rieneck","Riesa","Rieschweiler","Rieseby","Rieste","Riestedt","Rietheim(CH)","Rietheim(Württ)","Rietschen","Rietz in Tirol","Riffelriß, Grainau","Rijssen","Rijswijk","Rilland-Bath","Rimbach","Rimini","Ringenwalde(Templin)","Ringleben-Gebesee","Ringsheim","Ringsted st","Rinkerode","Rinklingen","Rinnthal","Rinteln","Rintheim Sinsheimer Straße, Karlsruhe","Rio di Pusteria/Mühlbach","Rippberg","Ritschenhausen","Ritterhude","Rivera-Bironico","Rivesaltes","Roanne","Robilante","Roccavione","Rochefort-Jemelle","Rochlitz(Sachs)","Rockenhausen","Rodalben","Rodange","Rodenbach(Dillkr)","Rodenbach(b Hanau)","Rodenkirchen(Oldb)","Rodewisch","Rodgau-Dudenhofen","Rodgau-Hainhausen","Rodgau-Jügesheim","Rodgau-Nieder Roden","Rodgau-Rollwald","Rodgau-Weiskirchen","Rodheim v d Höhe","Roding","Rodleben","Roedekro st","Roermond","Roeschwoog","Roggentin","Roggwil-Berg","Roggwil-Wynau","Rohr(Thür)","Rohr-Bad Hall","Rohrbach(Ilm)","Rohrbach(Oberbay)","Rohrbach(Pfalz)","Rohrbach(Saar)","Rohrdorf(Oberbay)","Rohrenfeld","Roigheim","Roisdorf","Roitzsch(Bitterf)","Rokycany","Rolandseck","Rollhofen","Roma Termini","Romanshorn","Romanshorn (See)","Rombas-Clouange","Rommelshausen","Rommerskirchen","Ronet","Ronneburg(Thür)","Ronnenberg","Ronshausen","Roodeschool","Roodt/Syre","Roosendaal","Roppen","Rorschach","Rorschach Hafen","Rorschach Hafen (See)","Rosbach v d Höhe","Rosbach(Sieg)","Rosenau(b Grafenau)","Rosenbach bei Villach","Rosenberg(Baden)","Rosendahl-Holtwick","Rosenheim","Rosenheim Aicherpark","Rosenheim Hochschule","Rosenwinkel","Roskilde st","Rosmalen","Rostock Hbf","Rostock Holbeinplatz","Rostock Parkstraße","Rostock Seehafen Nord","Rostock Thierfelder Str.","Rostock-Bramow","Rostock-Evershagen","Rostock-Kassebohm","Rostock-Lichtenhagen","Rostock-Lütten Klein","Rostock-Marienehe","Rostock-Torfbrücke","Rot am See","Rot-Malsch","Rotava","Rotenbach(Enz)","Rotenburg a.d. Fulda","Rotenburg(Wümme)","Rotenhain","Roth","Rothenburg ob der Tauber","Rothenburg(CH)","Rothenbürg","Rothenstein(Saale)","Rothenthurm(CH)","Rothrist","Rotkreuz","Rott(Inn)","Rottenacker","Rottenbach","Rottenburg(Neckar)","Rottendorf","Rotterdam Alexander","Rotterdam Blaak","Rotterdam Centraal","Rotterdam Lombardijen","Rotterdam Noord","Rotterdam Zuid","Rottershausen","Rottweil","Rottweil Göllsdorf","Rottweil Neufra","Rottweil Saline","Roudnice nad Labem","Rouffach","Rovereto","Rovigo","Roßbach(Pfalz)","Roßla","Roßlau(Elbe)","Roßtal","Roßtal Wegbrücke","Rudersberg","Rudersberg Nord","Rudersberg-Oberndorf","Rudolstadt(Thür)","Rudolstadt-Schwarza","Ruhland","Ruhlsdorf-Zerpenschleuse","Ruhmannsfelden","Ruhpolding","Ruhstorf","Rum b.Innsbruck","Rumburk","Rumeln","Rummenohl","Runding","Runkel","Rupperswil","Ruppertsgrün","Rupprechtstegen","Ruschberg","Ruschwedel","Rutesheim","Ruthenbeck","Ruurlo","Rybniste","Rzepin","Rätzlingen","Réding(F)","Rémilly","Röblingen am See","Rödental","Rödental Mitte","Rödermark-Ober Roden","Rödermark-Urberach","Rödlitz-Hohndorf","Röhrmoos","Röhrnbach","Rönshausen","Röntgental","Röslau","Rösrath","Rösrath-Stümpen","Röt","Rötenbach(Baden)","Rötgesbüttel","Röthenbach(Allgäu)","Röthenbach(Oberpf)","Röthenbach(Pegnitz)","Röthenbach-Seespitze","Röthenbach-Steinberg","Rövershagen","Rückersbacher Schlucht","Rückersdorf","Rückersdorf(Mfr)","Rüdesheim(Rhein)","Rüdnitz","Rülzheim Bf","Rülzheim Freizeitzentrum","Rümikon AG","Rümlang","Rümmingen","Ründeroth","Rüppurr Battstraße, Karlsruhe","Rüppurr Ostendorfplatz, Karlsruhe","Rüppurr Tulpenstraße, Karlsruhe","Rüppurrer Tor, Karlsruhe","Rüschlikon","Rüsselbach","Rüsselsheim","Rüsselsheim Opelwerk","Rüthi SG","Saal(Donau)","Saalburg(Taunus)","Saalfeld(Saale)","Saalfelden","Saarbrücken Hbf","Saarbrücken Ost","Saarbrücken-Burbach","Saarburg(Bz Trier)","Saarhölzbach","Saarlouis Hbf","Saarmund","Saasen","Saatel","Sachsen(b Ansbach)","Sachsendorf(Calbe)","Sachsenhausen(Nordb)","Sachsenheim","Safenwil","Sagard","Sagehorn","Saincaize","Saint Ghislain","Saintes","Salach","Salem","Salez-Sennwald","Sallach","Salmtal","Salzbergen","Salzburg Aigen","Salzburg Aiglhof","Salzburg Gnigl","Salzburg Hbf","Salzburg Liefering","Salzburg Mülln-Altstadt","Salzburg Parsch","Salzburg Sam","Salzburg Süd","Salzburg Taxham Europark","Salzgitter-Bad","Salzgitter-Immendorf","Salzgitter-Lebenstedt","Salzgitter-Ringelheim","Salzgitter-Thiede","Salzgitter-Watenstedt","Salzkotten","Salzwedel","Samedan","Samstagern","Samtens","San Candido/Innichen","San Remo","Sand(Niederbay)","Sande","Sandebeck","Sanderbusch","Sandersdorf(Bitterf)","Sandershäuser Straße, Kassel","Sandersleben(Anh)","Sandförde","Sandhagen(b Bad Dob)","Sandkrug","Sandwehle","Sandweiler-Contern","Sangerhausen","Sanitz(b Rostock)","Sankt Augustin Zentrum","Sanry-sur-Nied","Sanssouci","Santpoort Noord","Santpoort Zuid","Sapjane(Gr)","Sargans","Sarnow","Sarrebourg","Sarreguemines","Sarstedt","Sasbach am Kaiserstuhl","Sassenheim","Sassenroth","Sassnitz","Sathonay Rillieux","Satteldorf","Satzvey","Sauerlach","Sauldorf","Saulgrub","Saulheim","Saumur Rive Droit","Sauwerd","Saverne","Savona","Schaan-Vaduz","Schaerbeek","Schafbrücke","Schaffhausen","Schaftenau","Schaftlach","Schagen","Schaidt(Pfalz)","Schalchen","Schalkau","Schalkau Mitte","Schalksmühle","Schalkstetten","Schallstadt","Schameder","Schandelah","Scharbeutz","Scharfenstein","Scharmede","Scharnitz","Scharstorf","Schechen","Scheemda","Scheeßel","Scheibenberg","Scheidemannplatz, Kassel","Scheidt(Saar)","Schelklingen","Schemmerberg","Schenkenzell","Scheppach","Scherfede","Scheuerfeld(Sieg)","Scheven","Schiedam Centrum","Schieder","Schierbrok","Schierke","Schierstedt","Schifferstadt","Schifferstadt Süd","Schifflange","Schiffweiler","Schillerstraße, Karlsruhe","Schiltach","Schiltach Mitte","Schimborn","Schin op Geul","Schindellegi-Feusisberg","Schinnen","Schiphol (Airport)","Schirgiswalde-Kirschau","Schirnding","Schkeuditz","Schkeuditz West","Schkopau","Schladen(Harz)","Schladern(Sieg)","Schladming","Schlatt(Hohenz)","Schlechtbach","Schleife","Schleswig","Schliengen","Schlierbach(Schwalm-Eder-Kr.)","Schliersee","Schlins-Beschling","Schloss Gottesaue, Karlsruhe","Schloss Rüppurr, Karlsruhe","Schloß Holte","Schluchsee","Schlüchtern","Schmachtenhagen","Schmalkalden","Schmalkalden-Fachhochschule","Schmalnau","Schmidtheim","Schmiechen","Schmiechen Albbahn","Schmiechen(Schwab)","Schmiedeberg (Dresden)","Schmiedeberg-Naundorf","Schmilka-Hirschmühle","Schmollensee","Schmölln(Ol)","Schmölln(Thür)","Schnabelwaid","Schnaittach Markt","Schneeberg im Odenwald","Schneeberg(Mark)","Schnega","Schneidhain","Schnelldorf","Schneverdingen","Schney","Schnitzmühle","Schoden-Ockfen","Schondorf(Bay)","Schongau","Schonungen","Schopfheim","Schopfheim West","Schopfheim-Schlattholz","Schopfloch(b Freudenstadt)","Schopp","Schorndorf","Schorndorf-Hammerschlag","Schortens-Heidmühle","Schouweiler","Schrezheim","Schrobenhausen","Schrozberg","Schruns","Schulen","Schutzbach","Schwaan","Schwabach","Schwabach-Limbach","Schwabhausen(b Dachau)","Schwabmünchen","Schwabsberg","Schwaig","Schwaigern Ost","Schwaigern(Württ)","Schwaigern(Württ) West","Schwaikheim","Schwalbach(Taunus)Limes","Schwalbach(Taunus)Nord","Schwallungen","Schwalmstadt-Wiera","Schwandorf","Schwanheide","Schwante","Schwarmstedt","Schwarzach i Vorarl.","Schwarzach-St.Veit","Schwarzburg","Schwarzenbach(Saale)","Schwarzenbach(b Pressath)","Schwarzenbek","Schwarzenberg","Schwarzenberg Hp","Schwarzenberg(Erzg)","Schwarzenberg-Neuwelt","Schwarzenfeld(Opf)","Schwarzheide Ost","Schwarzkollm","Schwaz","Schwechat","Schwedt(Oder)","Schwedt(Oder)Mitte","Schweich(DB)","Schweighofen","Schweikershain","Schweinfurt Hbf","Schweinfurt Mitte","Schweinfurt Stadt","Schweinsburg-Culten","Schweinsdorf","Schwelm","Schwelm West","Schwenningen(Bay)","Schwenningen(Neckar)","Schwenzin","Schweppenburg-Heilbrunnen","Schwerin Hbf","Schwerin Mitte","Schwerin Süd","Schwerin-Görries","Schwerin-Lankow","Schwerin-Margaretenhof","Schwerin-Warnitz","Schwerin-Wüstmark","Schwerte(Ruhr)","Schweta Bf","Schwetzingen","Schwieberdingen","Schwindebeck","Schwindegg","Schwindratzheim","Schwyz","Schwäbisch Gmünd","Schwäbisch Hall","Schwäbisch Hall-Hessental","Schwörstadt","Schärding","Schöllkrippen","Schömberg Stausee","Schömberg(b Balingen)","Schöna","Schönau(Hörsel)","Schönberg(Holstein)","Schönberg(Meckl)","Schönberg(Vogtl)","Schönberger Strand","Schönbichl in Tirol","Schönborn(Doberl)","Schönebeck Süd","Schönebeck(Elbe)","Schönebeck-Bad Salzelmen","Schönebeck-Felgeleben","Schönebeck-Frohse","Schöneck(Vogtl)","Schöneck(Vogtl) Ferienpark","Schöneck-Büdesheim","Schöneck-Kilianstädten","Schöneck-Oberdorfelden","Schönerlinde","Schönewörde","Schönfließ(Mark) Dorf","Schönfließ(b Oranienburg)","Schöngeising","Schönhausen(Elbe)","Schönkirchen Bf","Schönmünzach","Schönow(Angerm)","Schönstedt","Schönwald(Oberfr)","Schönwalde(Barnim)","Schönwalde(Spreewald)","Schönwies","Schöppenstedt","Schötmar","Schübelbach-Buttikon","Schülldorf","Schüptitz","Schüttorf","Scuol-Tarasp","Sebnitz(Sachs)","Sebuzin","Sechshelden","Sechtem","Seckach","Seddin","Sedlitz Ost","Seebach(Mühlhausen)","Seebad Ahlbeck","Seebad Heringsdorf","Seebad Lubmin","Seebergen","Seebrugg","Seefeld in Tirol","Seefeld(Mark)","Seefeld-Hechendorf","Seeg","Seegefeld","Seehausen(Altm)","Seehausen(Uckermark)","Seekirchen am Wallersee","Seeleiten-Berggeist","Seelow(Mark)","Seelow-Gusow","Seelvitz","Seelze","Seerhausen","Seesen","Seeshaupt","Sehlem(Kr Wittlich)","Sehma","Sehnde","Seiboldsdorf","Seifersdorf","Seifhennersdorf","Seitschen","Sejstrup st","Selb Nord","Selb Stadt","Selb-Plößberg","Selbitz","Selhausen","Seligenstadt Mainschleifenbahn","Seligenstadt(Hess)","Seligenstadt(b Würzburg)","Sellin(Rügen) Ost","Sellin(Rügen) West","Sellstedt","Selm","Selm-Beifang","Seltendorf","Selzthal","Senden","Senden-Bösensell","Senftenberg","Sennfeld","Serams","Seregno","Serrig","Sersheim","Sesto S. Giovanni","Sete","Seubersdorf","Seulberg","Seulbitz","Sevelen","Sevnica","Seybothenreuth","Siebeldingen-Birkweiler","Siebnen-Wangen","Siedenlangenbeck","Siedlinghausen","Siegburg Bahnhof","Siegburg/Bonn","Siegelsbach","Siegelsdorf","Siegen Hbf","Siegen-Geisweid","Siegen-Weidenau","Siegershausen","Siegsdorf","Sieniawa Zarska","Sierck-les-Bains","Sierksdorf","Sierre/Siders","Siersburg","Siershahn","Sieversdorf(Neust/D)","Siggenthal-Würenlingen","Sighisoara","Siglingen","Sigmaringen","Sigmaringendorf","Silbach","Silberhausen","Silberhütte NE","Silberstraße","Sillian","Silz im Oberinntal","Simbach(Inn)","Simeria","Simmelsdorf-Hüttenbach","Simtshausen","Sinaia","Sindelfingen","Sindorf","Singen Industriegebiet","Singen Landesgartenschau","Singen(Hohentwiel)","Singen(Thür)","Singlis","Sinn","Sinsheim Museum/Arena","Sinsheim(Elsenz) Hbf","Sint-Denijs-Boekel","Sinzheim","Sinzheim Nord","Sinzig(Rhein)","Sinzing","Sion","Sipplingen","Sissach","Sittard","Sitzendorf-Unterweißbach","Skaerbaek st","Slagelse st","Slavonski Brod","Sliedrecht","Sliedrecht Baanhoek","Slubice","Sluknov","Sluknov zast.","Sneek","Sneek Noord","Soest","Soest Zuid","Soest(NL)","Soestdijk","Sohl","Sohland","Sokolov","Solingen Grünewald","Solingen Hbf","Solingen Mitte","Solingen Vogelpark","Solingen-Schaberg","Sollstedt","Solms","Solnhofen","Solothurn","Solpke","Soltau Nord","Soltau(Han)","Soltendieck","Somain","Sondern","Sondernach","Sondernheim","Sondershausen","Sonneberg(Thür)Hbf","Sonneberg(Thür)Nord","Sonneberg(Thür)Ost","Sonneberg(Thür)West","Sontheim(Schwab)","Sontheim-Brenz","Sonthofen","Sontra","Sophienhof","Sopot","Sopron","Sorge","Soroe st","Sosnowiec Glowny","Sottrum","Soyen","Spa","Spaichingen","Spaichingen Mitte","Spangsbjerg st","Sparrieshoop","Spaubeek","Spay","Spechtritz","Speele","Speicher","Speikern","Speyer Hbf","Speyer Nord-West","Spicak","Spich","Spiegelau","Spielberg","Spielfeld-Straß","Spiez","Spinnerei, Ettlingen","Spital am Pyhrn","Spittal-Millstättersee","Sponholz","Spornitz","Spremberg","Sprendlingen(Rheinhess)","Springe","Sprötze","Spöck Hochhaus, Stutensee","Spöck Richard-Hecht-Schule, Stutensee","St Alban","St Avold","St Dalmas de Tende","St Egidien","St Georgen(Schwarzw)","St Goar","St Goarshausen","St Ilgen-Sandhausen","St Ingbert","St Koloman","St Malo","St Mang","St Michaelisdonn","St Ottilien","St Thomas","St Wendel","St-Amour","St-Avre-la-Chambre","St-Germain-des-Fosses","St-Gervais-les-Bains","St-Jean-de-Luz-Ciboure","St-Jean-de-Maurienne Arvan","St-Jory(Toulouse)","St-Louis (Haut-Rhin)","St-Maurice(CH)","St-Michel-Valloire","St-Pierre-dAlbigny","St-Pierre-des-Corps","St-Priest","St-Quentin(Aisne)","St-Raphael-Valescure","St-Sulpice-Lauriere","St. Anton am Arlberg","St. Anton im Montafon","St. Gallen(CH)","St. Gallen(CH) Haggen","St. Gallen(CH) Winkeln","St. Johann im Pongau","St. Johann in Tirol","St. Margrethen SG","St. Moritz","St. Valentin","St.Jodok am Brenner","St.Michael in Obersteiermark","St.Peter-Seitenstetten","St.Pölten Hbf","St.Veit/Glan","Staad","Stade","Stadt Rottenmann","Stadt Wehlen(Sachs)","Stadtallendorf","Stadthagen","Stadtilm","Stadtoldendorf","Stadtprozelten","Stadtroda","Staffel","Staffelfelden","Stahringen","Stainach-Irdning","Stambach","Stammbach","Stams","Stans bei Schwaz","Stapelburg","Stara Role","Starckstraße, Karlsruhe","Starnberg","Starnberg Nord","Statte","Stauchitz","Staudernheim","Staufen","Staufen Süd","Stavoren","Staßfurt","Steckborn","Steckborn URh","Stederdorf(Kr Uelzen)","Stedum","Steenwijk","Stegenwaldhaus","Steilküste/Wittenbeck","Stein(Traun)","Stein-Säckingen","Steina","Steinach in Tirol","Steinach(Baden)","Steinach(Thür)","Steinach(Thür)Süd","Steinach(b Rothenburg ob der Tauber)","Steinalben","Steinau(Straße)","Steinbach am Wald","Steinbach-Hallenberg","Steinbourg","Steindorf bei Straßwalchen","Steinebach","Steinebrunn(CH)","Steinefrenz","Steinen","Steinerne Renne","Steinfeld(Oldb)","Steinfeld(Pfalz)","Steinfeld(Stendal)","Steinfurt-Borghorst","Steinfurt-Burgsteinfurt","Steinfurt-Grottenkamp","Steinhagen(Westf)","Steinhagen(Westf) Bielef. Str.","Steinhausen-Neuburg","Steinheim(Main)","Steinheim(Westf)","Steinhöring","Steinpleis","Steinsfurt","Steinweiler","Steinwenden","Stelle","Stelle DHE","Stendal Hbf","Stendal Vorbf","Stendal-Stadtsee","Stenn","Stephansfeld","Sterbfritz","Sternfeld","Sternhaus-Haferfeld","Sternhaus-Ramberg","Sterzhausen","Stettbach","Stetten (b. Haigerloch)","Stetten am Heuchelberg","Stetten(Donau)","Stetten(Schwab)","Stetten-Beinstein","Stettfeld(Baden)","Stettfeld-Weiher","Steyr","Stiege","Stift Keppel-Allenbach","Stockach NE","Stockau","Stockdorf","Stockerau","Stockhausen(Lahn)","Stockheim(Oberfr)","Stockheim(Unterfr)","Stockholm Central","Stockstadt(Main)","Stockstadt(Rhein)","Stolberg(Harz)","Stolberg(Rheinl)Gbf","Stolberg(Rheinl)Hbf","Stolberg(Rheinl)Hbf Gl.27","Stolberg(Rheinl)Hbf Gl.44","Stolberg-Altstadt","Stolberg-Mühlener Bahnhof","Stolberg-Rathaus","Stolberg-Schneidmühle","Stollberg Schlachthofstraße","Stollberg(Sachs)","Stolpen","Stommeln","Storkow(Mark)","Storzingen","Stotternheim","Stralsund Hbf","Stralsund Rügendamm","Stralsund-Grünhufe","Strasbourg","Strasburg(Uckerm)","Strasshof","Straubing","Straubing-Ost","Strausberg","Strausberg (S)","Strausberg Nord","Strausberg Stadt","Strausberg-Hegermühle","Straußfurt","Straß-Moos","Straßberg(Harz)","Straßberg-Glasebach","Straßberg-Winterlingen","Straßgräbchen-Bernsdorf","Straßkirchen","Straßwalchen","Stresa","Strizivojna-Vrpolje","Strohkirchen","Strullendorf","Struthütten","Stubben","Stubbenfelde","Stubersheim","Stumsdorf","Sturovo","Stuttgart Ebitzweg","Stuttgart Feuersee","Stuttgart Flughafen/Messe","Stuttgart Hbf","Stuttgart Hbf (tief)","Stuttgart Neckarpark","Stuttgart Nord","Stuttgart Nürnberger Str.","Stuttgart Schwabstr.","Stuttgart Stadtmitte","Stuttgart Universität","Stuttgart-Bad Cannstatt","Stuttgart-Feuerbach","Stuttgart-Münster","Stuttgart-Obertürkheim","Stuttgart-Rohr","Stuttgart-Sommerrain","Stuttgart-Untertürkheim","Stuttgart-Vaihingen","Stuttgart-Zazenhausen","Stuttgart-Zuffenhausen","Stuttgart-Österfeld","Stühlingen","Stützerbach","Subzin-Liessow","Suchsdorf","Suderburg","Suerhop","Suhl","Suhl-Heinrichs","Sukow(b Schwerin)","Sulmingen","Sulz(Neckar)","Sulz-Röthis","Sulzbach(Inn)","Sulzbach(Main)","Sulzbach(Murr)","Sulzbach(Saar)","Sulzbach(Saar)Altenwald","Sulzbach(Taunus)","Sulzbach(Taunus)Nord","Sulzbach-Rosenberg","Sulzbach-Rosenberg Hütte","Sulzbachtal","Sulzberg","Sulzfeld(Baden)","Summerau","Sursee","Survilliers Fosses","Susteren","Svatava","Svatava zastavka","Svor","Swalmen","Swiebodzin","Swinoujscie Centrum","Swisttal-Odendorf","Syke","Syrau","Sythen","Szczecin Glowny","Szczecin Gumience","Szentgotthárd","Szob","Szob(Gr)","Szolnok","Sättelstädt","Sélestat","Söllingen Kapellenstraße","Söllingen Reetzstr.","Söllingen(b Karlsr)","Sömmerda","Sörup","Süderbrarup","Süderdeich","Süderlügum","Sülstorf","Sülzbach","Sülzbach Schule","Sülzenbrücken","Sünching","Süßen","TGV Haute Picardie","Taben","Tabor","Tacherting","Tamines","Tamm(Württ)","Tangerhütte","Tangermünde","Tangermünde West","Tanndorf","Tanneneck","Tannheim(Württ)","Tannroda","Tantow","Tapfheim","Tarascon sur Rhone","Tarp","Tarvisio Boscoverde","Tata","Tatabanya","Tating","Taubenheim(Spree)","Tauberbischofsheim","Tauberfeld","Taucha(Leipzig)","Taufkirchen","Taufkirchen an der Pram","Taulov st","Tautenhain","Taverne-Torricella","Taxenbach-Rauris","Tczew","Tecknau","Tegelen","Tegernsee","Teicha","Teichland","Teichwolframsdorf","Teisendorf","Teisnach","Teisnach Rohde+Schwarz","Telfs-Pfaffenhofen","Telgte","Teltow","Teltow Stadt","Temmels","Templeuve","Templin","Templin Stadt","Templin-Ahrensdorf","Tende(F)","Teningen-Mundingen","Tenneck","Teplice v Cechach","Terborg","Terespol","Terfens-Weer","Tergnier","Teschenhagen","Teschow","Tessin","Tessin West","Testelt","Teterow","Teting (Moselle)","Teuchern","Teufelsmühle","Teutschenthal","Teutschenthal Ost","Thale Hbf","Thale Musestieg","Thaleischweiler-Fröschen","Thalfingen(b Ulm)","Thalheim(Erzgeb)","Thalheim(b Oschatz)","Thalwil","Thann-Matzbach","Thansüß","Tharandt","Thayngen","Theisbergstegen","Theißen","Themar","Thermalbad Wiesenbad","Thesdorf","Thiergarten(Hohenz)","Thionville","Thoßfell","Thun","Thusis","Thyrow","Thüngersheim","Thür","Tiebensee","Tiefenau","Tiefenbach(b Passau)","Tiefenbachmühle","Tiefenort","Tieffenbach-Struth","Tiel","Tiel Passewaaij","Tienen","Tiengen(Hochrhein)","Tilburg","Tilburg Reeshof","Tilburg Universiteit","Timmendorfer Strand","Tinglev st","Tisis","Titisee","Tittmoning-Wiesmühl","Tivoli, Karlsruhe","Tjaereborg st","Tobel-Affeltrangen","Toender Nord st","Toender st","Tongeren","Torgau","Torgelow","Torino Porta Susa","Tornesch","Tostedt","Toul","Toulon","Toulouse-Matabiau","Tourcoing","Tournai","Tournan","Traben-Trarbach","Trabitz","Trais-Horloff","Trasadingen","Trassenheide","Trassenmoor","Traun","Traun OÖ","Traundorf","Traunreut","Traunstein","Traunstein Klinikum","Trbovlje","Trebbin","Treben-Lehma","Trebgast","Trebitz(Elbe)","Trebnitz(Mark)","Trebusice","Trechtingshausen","Treibach-Althofen","Treis-Karden","Trelleborg F","Trento","Treuchtlingen","Treuen","Treuenbrietzen","Treuenbrietzen Süd","Treviso Centrale","Treysa","Triangel","Triberg","Trieben","Triebes","Triefenried","Trier Hbf","Trier Süd","Triesdorf","Triptis","Trochtelfingen ALB-GOLD","Trochtelfingen(Hohenz)","Trochtelfingen(b Bopfingen)","Troisdorf","Troisvierges","Trompet","Trooz","Trossingen Bahnhof","Trossingen Stadt","Trostberg","Tschagguns","Tullastraße/Verkehrsbetriebe, Karlsruhe","Tulling","Tulln a.d.Donau","Tullnerfeld","Tuplice","Tuplice Debinka","Turgi","Tuttlingen","Tuttlingen Gänsäcker","Tuttlingen Nord","Tuttlingen Schulen","Tuttlingen Zentrum","Tutzing","Twello","Twiste","Twistringen","Tychy","Töging(Inn)","Tönning","Töppeln","Tübingen Hbf","Tübingen West","Tübingen-Derendingen","Tübingen-Lustnau","Türkenfeld","Türkheim(Bay)Bf","Türkismühle","Tüßling","Ubbedissen","Ubstadt Ort","Ubstadt Salzbrunnenstr","Ubstadt Uhlandstr.","Ubstadt-Weiher","Uchtspringe","Uckange","Uder","Udine","Uebigau","Ueckermünde","Ueckermünde Stadthafen","Uelzen","Uffenheim","Uffing a Staffelsee","Uhingen","Uhldingen-Mühlhofen","Uhlerborn","Uhlstädt","Uhsmannsdorf","Uhyst","Uitgeest","Uithuizen","Uithuizermeeden","Ulberndorf","Ulbersdorf","Ulm Hbf","Ulm Ost","Ulm-Donautal","Ulm-Söflingen","Ulmerfeld-Hausmening","Ulrichsbrücke-Füssen","Ulzburg Süd","Umrathshausen Ort","Unadingen","Undorf","Unfriedsdorf","Ungedanken","Unkel","Unna","Unna West","Unna-Königsborn","Unnau-Korb","Unterammergau","Unterasbach","Unteraschau","Unterberg-Stefansbrücke","Unterelchingen","Unterföhring","Untergimpern","Untergrainau","Untergriesheim","Untergrombach","Unterhaching","Unterharmersbach","Unterhausen(Bay)","Unterheckenhofen","Unterjesingen Mitte","Unterjesingen Sandäcker","Unterkochen","Unterlemnitz","Unterlenningen","Unterloquitz","Unterlüß","Untermaubach-Schlagstein","Untermaßfeld","Unterneudorf","Unterneustädter Kirchplatz, Kassel","Unterreichenbach","Unterschleißheim","Untersteinach(Bayr)","Untersteinach(b Stadtsteinach)","Unterterzen","Unterwellenborn","Unterwiesenthal","Unteröwisheim Bf","Unteröwisheim M.-Luther-Str.","Unzmarkt","Uphusum","Urbach(b Schorndorf)","Urft","Urmersbach","Urmitz","Urmitz Rheinbrücke","Urschalling","Urspring","Usch-Zendscheid","Usingen","Uslar","Usquert","Usseln","Usti nad Labem hl.n.","Usti nad Labem zapad","Usti nad Labem-Strekov","Utrecht Centraal","Utrecht Leidsche Rijn","Utrecht Lunetten","Utrecht Maliebaan","Utrecht Overvecht","Utrecht Terwijde","Utrecht Vaartsche Rijn","Utrecht Zuilen","Utting","Uttwil","Utzedel","Vac","Vach","Vacha","Vachdorf","Vachendorf","Vahldorf","Vaihingen(Enz)","Vaihingen(Enz)Nord","Vaires Torcy","Val-de-Reuil","Valby(Koebenhavn)","Valdaora-Anterselva/Olang-Antholz","Valdek","Valence TGV","Valence Ville","Valenciennes","Valkenburg(NL)","Vallendar","Vamdrup st","Vandans","Varangeville-St-Nicolas","Varde Kaserne st","Varde Vest st","Varde st","Varel(Oldb)","Varnsdorf","Varnsdorf Pivovar Kocour","Varnsdorf stare nadr","Varsseveld","Vastorf","Vaterstetten","Vatterode","Vatteröder Teich","Vechelde","Vechta","Vechta-Stoppelmarkt","Veendam","Veenendaal Centrum","Veenendaal West","Veenendaal-De Klomp","Vehlefanz","Veilsdorf","Veitshöchheim","Velbert Rosenhügel","Velbert-Langenberg","Velbert-Neviges","Velbert-Nierenhof","Velden am Wörther See","Velden(b Hersbruck)","Velgast","Velke Zernoseky","Velky Senov","Velky Senov zast.","Vellmar-Niedervellmar","Vellmar-Obervellmar","Vellmar-Osterberg/EKZ","Velp","Velten(Mark)","Vendenheim","Venezia Mestre","Venezia Santa Lucia","Venissieux","Venlo","Venray","Ventimiglia","Ventschow","Vercelli","Verden(Aller)","Veringendorf","Veringenstadt","Vernante","Vernawahlshausen","Verneuil lEtang","Verneuil sur Avre","Vernon(Eure)","Verona Porta Nuova","Verviers Central","Verviers-Palais","Vesele pod Rabstejnem","Vetschau","Vettweiß","Vettweiß-Jakobwüllesheim","Vicenza","Viechtach","Vienenburg","Vienne","Vierenstraße","Vierkirchen-Esterhofen","Vierlingsbeek","Viernau","Viersen","Vieselbach","Vievola","Vilemov u Sluknova","Villabassa-Braies/Niederdorf-Prags","Villach Hbf","Villach Warmbad","Villach Westbf","Villars les Dombes","Villedieu les Poeles","Villers Cotterets","Villiers-le-Bel-Gonesse","Villingen(Schwarzw)","Villingen-Schwenningen Eisstadion","Villingen-Schwenningen Hammerstatt","Villmar","Vils in Tirol","Vilsbiburg","Vilseck","Vilshofen(Niederbay)","Vilvoorde","Vinkovci","Vinzelberg","Vipiteno-Val di Vizze/Sterzing-Pfitsch","Visby st","Vise","Visp","Visselhövede","Vitry le François Gare","Vittel","Vleuten","Vlissingen","Vlissingen Souburg","Vlotho","Voerde(Niederrhein)","Voerendaal","Vogelsang(Gransee)","Vogelweh","Voghera","Vohburg","Vohren","Voigtsgrün","Voigtstedt","Vojens st","Vojtanov","Voldagsen","Volders-Baumkirchen","Volkach-Astheim","Volkmarsen","Volkringhausen","Volkswohnung/Staatstheater, Karlsruhe","Volpriehausen","Voorburg","Voorhout","Voorschoten","Voorst-Empe","Vorden","Vorhop","Vormwald","Vormwald Dorf","Vorra(Pegnitz)","Voßloch","Vriezenveen","Vroegum st","Vroomshoop","Vught","Vysoka Pec","Vöcklabruck","Vöcklamarkt","Vöhl-Ederbringhausen","Vöhl-Herzhausen","Vöhl-Schmittlotheim","Vöhl-Thalitter","Vöhringen","Vöhrum","Völklingen","Völksen/Eldagsen","Völs","Wabern(Bz Kassel)","Wachenheim(Pfalz)","Wackershofen","Waddinxveen","Waddinxveen Noord","Waddinxveen Triangel","Waffenbrunn","Wagersrott","Waghäusel","Waging","Wahlbach(Kr Siegen)","Wahlheim","Wahlitz","Wahlstedt","Wahlwies","Wahrenholz","Waiblingen","Waibstadt","Waigolshausen","Wakendorf","Wald am Schoberpass","Walddrehna","Waldenburg(Sachs)","Waldenburg(Württ)","Waldershof","Waldfischbach","Waldhausen(b Geislingen)","Waldhausen(b Schorndorf)","Waldheim","Waldkirch","Waldkirchen(Erzgeb)","Waldkirchen(Niederbay.)","Waldkraiburg-Kraiburg","Waldmünchen","Waldshut","Walenstadt","Walferdange","Walhausen(Saar)","Walheim(Württ)","Walkenried","Wallau(Lahn)","Walldorf(Hess)","Walldorf(Werra)","Walldürn","Wallenrod","Wallersdorf","Wallertheim","Walleshausen","Wallhausen(Helme)","Wallhausen(Württ)","Wallisellen","Wallwitz(Saalkr)","Walpertskirchen","Walporzheim","Walschleben","Walsleben","Walsrode","Waltershausen","Waltershausen Schnepfenthal","Wandersleben","Wandlitz","Wandlitzsee","Wangen(Allgäu)","Wangen(Unstrut)","Wangerooge","Wanne-Eickel Hbf","Wannweil","Wansleben am See","Warburg(Westf)","Waren(Müritz)","Warendorf","Warendorf-Einen-Müssingen","Warenshof","Warffum","Warmbad","Warnemünde","Warnemünde Werft","Warngau","Warnitz(Uckermark)","Warszawa Centralna","Warszawa Wschodnia","Warszawa Zachodnia","Wartberg im Mürztal","Wartberg/Krems","Warthausen","Wasbek","Wasen, Ettlingen","Wasenweiler","Wasseralfingen","Wasserbillig","Wasserburg(Bodensee)","Wasserburg(Günz)","Wasserburg(Inn)Bf","Wasserliesch","Wasserthaleben","Wassertrüdingen","Wasserzell(b Eichstätt)","Wasungen","Watenstedt","Waterloo","Watermael/Watermaal","Wattenscheid","Wattenscheid-Höntrop","Watzelsteg","Watzenborn-Steinberg","Waßmannsdorf","Webau","Wecker","Weckesheim","Weddel(Braunschw)","Wedel(Holst)","Weener","Weert","Weesenstein","Weesp","Weetzen","Weeze","Wefensleben","Wega","Wegberg","Wegeleben","Wegenstedt","Wegliniec","Wehdel","Wehl","Wehr(Mosel)","Wehr-Brennet","Wehretal-Reichensachsen","Wehrheim","Weibhausen","Weichering","Weickersdorf(Sachs)","Weickersgrüben","Weida","Weida Altstadt","Weida Mitte","Weiden(Oberpf)","Weidenbach","Weidenberg","Weidenthal","Weiding","Weiherhammer","Weiherhof","Weikersheim","Weil am Rhein","Weil am Rhein Ost","Weil am Rhein-Gartenstadt","Weil am Rhein-Pfädlistraße","Weil der Stadt","Weil im Schönbuch Röte","Weil im Schönbuch Troppel","Weil im Schönbuch Untere Halde","Weilbach(Unterallg)","Weilbach(Unterfr)","Weilburg","Weiler (Brohltal)","Weiler(Rems)","Weilerswist","Weilerswist-Derkum","Weilheim(Oberbay)","Weilheim(Württ)","Weilimdorf","Weimar","Weimar Berkaer Bf","Weimar West","Weinbrennerplatz, Karlsruhe","Weinböhla Hp","Weinfelden","Weingarten Berg","Weingarten(Baden)","Weinheim(Bergstr)Hbf","Weinheim-Lützelsachsen","Weinsberg","Weinsberg West","Weinsberg/Ellhofen Gewerbegebiet","Weinweg, Karlsruhe","Weischlitz","Weisen","Weisenbach","Weisenheim(Sand)","Weiterstadt","Weixdorf","Weixdorf Bad","Weizen","Weizern-Hopferau","Weißandt-Gölzau","Weißenau","Weißenburg(Bay)","Weißenfels","Weißenfels West","Weißenhorn","Weißenhorn-Eschach","Weißenohe","Weißenthurm","Weißer See","Weißes Roß","Weißwasser(Oberlausitz)","Welgesheim-Zotzenheim","Welkenraedt","Welkers","Wellen(Magdeburg)","Wellen(Mosel)","Wellendorf","Wellmitz","Wels Hbf","Welschen Ennest","Welschingen-Neuhausen","Welver","Wemmetsweiler Rathaus","Wendisch Evern","Wendisch-Rietz","Wendling b.Haag","Wendlingen(Neckar)","Wennedach","Wennigsen(Deister)","Wensickendorf","Werbig","Werdau","Werdau Nord","Werder(Havel)","Werderstraße, Karlsruhe","Werdohl","Werdorf","Werfen","Werl","Wernau(Neckar)","Wernberg","Werne a d Lippe","Werneuchen","Wernfeld","Wernigerode Elmowerk","Wernigerode Hbf","Wernigerode Hochschule Harz","Wernigerode Westerntor","Wernigerode-Hasserode","Wernshausen","Wernstein","Wertach-Haslach","Wertheim","Wertheim-Bestenheid","Werther","Wesel","Wesel Feldmark","Wesel-Blumenkamp","Wesenberg","Wespelaar-Tildonk","Wesselburen","Wesseln","Westbarthausen","Westbevern","Westendorf","Westendorf in Tirol","Westerburg","Westerham","Westerhausen","Westerland (Sylt) Autoverladung","Westerland(Sylt)","Westerstede-Ocholt","Westerstetten","Westervoort","Westewitz-Hochweitzschen","Westhausen","Westheim(Schwab)","Westheim(Westf)","Westheim-Langendorf","Westönnen","Wetter(Hessen)","Wetter(Ruhr)","Wetterzeube","Wettingen","Wetzlar","Wezep","Weßling(Oberbay)","Wickede(Ruhr)","Wicklesgreuth","Wickrath","Wiebelskirchen","Wiemersdorf","Wien Floridsdorf","Wien Franz-Josefs-Bahnhof","Wien Hbf","Wien Hbf (Autoreisezuganlage)","Wien Hernals","Wien Hütteldorf","Wien Jedlersdorf","Wien Kaiserebersdorf","Wien Meidling","Wien Mitte","Wien Penzing","Wien Praterstern","Wien Simmering","Wien Stadlau","Wien Süßenbrunn","Wien Westbahnhof","Wiener Neustadt Hbf","Wiener Straße, Kassel","Wierden","Wieren","Wiesa(Erzgeb)","Wiesau(Oberpf)","Wiesbaden Hbf","Wiesbaden Ost","Wiesbaden-Biebrich","Wiesbaden-Erbenheim","Wiesbaden-Igstadt","Wiesbaden-Schierstein","Wiesenau","Wiesenburg(Mark)","Wiesenburg(Sachs)","Wiesenfeld","Wiesenfeld(b Coburg)","Wiesental","Wiesenthau","Wieslensdorf","Wiesloch-Walldorf","Wiesmühl(Alz)","Wiesthal","Wijchen","Wijhe","Wil SG","Wilburgstetten Bf","Wilchingen-Hallau","Wildau","Wildberg(Württ)","Wildeck-Bosserode","Wildeck-Hönebach","Wildeck-Obersuhl","Wildeshausen","Wildon","Wilferdingen-Singen","Wilgartswiesen","Wilhelmsdorf","Wilhelmshaven","Wilhelmshorst","Wilhelmshütte(Lahn)","Wilhelmsstraße/Stadtmuseum, Kassel","Wilhermsdorf","Wilhermsdorf Mitte","Wilischthal","Wilkau-Haßlau","Willebadessen","Willingen","Willmenrod","Willmering","Willsbach","Wilmersdorf(Angerm)","Wilnsdorf-Rudersdorf","Wilsenroth","Wilster","Wilthen","Wiltingen(Saar)","Wilwerwiltz","Wilwisheim","Wincheringen","Winden(Pfalz)","Windischeschenbach","Windischgarsten","Windsbach","Wingen-sur-Moder","Wingerode","Wingst","Winkelhaid","Winnenden","Winningen(Mosel)","Winninghausen","Winnweiler","Winschoten","Winsen(Luhe)","Winsum","Winterbach(b Schorndorf)","Winterberg(Westf)","Winterhausen","Wintermoor","Winterswijk","Winterswijk West","Winterthur","Wipperdorf","Wippra","Wirges","Wirtheim","Wismar","Wissembourg","Wissen(Sieg)","Wissingen","Wittbräucke","Witten Hbf","Witten-Annen Nord","Wittenbach","Wittenberge","Wittenhagen","Wittgensdorf Mitte","Wittgensdorf ob Bf","Wittighausen","Wittingen","Wittlich Hbf","Wittlingen","Wittmund","Wittstock(Dosse)","Witzenhausen Nord","Witzighausen","Witzschdorf","Witzwort","Wjasma","Woerden","Woffleben","Wohlen AG","Wohltorf","Woippy","Wolfach","Wolfartsweierer Straße, Karlsruhe","Wolfegg","Wolfen(Bitterfeld)","Wolfenbüttel","Wolferode","Wolfgang(Kr Hanau)","Wolfhagen","Wolfheze","Wolfratshausen","Wolfsburg Hbf","Wolfsgefärth","Wolfsmünster","Wolfstee","Wolfstein","Wolfurt","Wolgast","Wolgast Hafen","Wolgaster Fähre","Wolkenstein","Wolkersdorf im Weinviertel","Wolkramshausen","Wollbach(Baden)","Wolmirstedt","Wolterdingen(Han)","Woltersdorf/Nuthe-Urstromtal","Woltwiesche","Wolvega","Workum","Wormerveer","Worms Hbf","Worms-Pfeddersheim","Worpswede","Wremen","Wriezen","Wrist","Wroclaw Glowny","Wroclaw Lesnica","Wroclaw Nowy Dwor","Wulfen(Anh)","Wulfen(Westf)","Wulften","Wullenstetten","Wunsiedel-Holenbrunn","Wunstorf","Wuppertal Hbf","Wuppertal-Barmen","Wuppertal-Hahnenfurth/Düssel","Wuppertal-Langerfeld","Wuppertal-Oberbarmen","Wuppertal-Ronsdorf","Wuppertal-Sonnborn","Wuppertal-Steinbeck","Wuppertal-Unterbarmen","Wuppertal-Vohwinkel","Wuppertal-Zoologischer Garten","Wurlitz","Wurmlingen Mitte","Wurmlingen Nord","Wurzbach(Thür)","Wurzen","Wusterhausen(Dosse)","Wustermark","Wusterwitz","Wustrau-Radensleben","Wustweiler","Wutha","Wutike","Wutöschingen","Wyhlen","Wächterhof","Wächtersbach","Wädenswil","Wölfershausen","Wölfersheim-Södel","Wörgl Hbf","Wörlitz","Wörnitzstein","Wörrstadt","Wörsdorf","Wörth(Isar)","Wörth(Main)","Wörth(Rhein)","Wörth(Rhein) Alte Bahnmeisterei","Wörth(Rhein) Badallee","Wörth(Rhein) Badepark","Wörth(Rhein) Bienwaldhalle","Wörth(Rhein) Bürgerpark","Wörth(Rhein) Mozartstraße","Wörth(Rhein) Rathaus","Wörth(Rhein) Zügelstraße","Wössingen","Wössingen Ost","Wülfrath-Aprath","Wülknitz","Wünschendorf","Wünschendorf Nord","Wünsdorf-Waldstadt","Würgendorf","Würgendorf (Ort)","Würzbach(Saar)","Würzburg Hbf","Würzburg Süd","Würzburg-Zell","Wüstenbrand","Wüstenfelde","Wüstenselbitz","Wüsting","Xanten","Ybbs a.d. Donau","Yorckstraße, Karlsruhe","Yverdon-les-Bains","Yves-Gomezee","ZOB, Duderstadt","Zaandam","Zaandam Kogerveld","Zaandijk Zaanse Schans","Zabeltitz","Zachun","Zagan","Zagorje","Zagreb Glavni kolodvor","Zahna","Zainhammer","Zaisenhausen","Zaltbommel","Zandvoort aan Zee","Zapfendorf","Zarrendorf","Zary","Zasieki","Zawiercie","Zbaszynek","Zedelgem","Zeebrugge-Dorp","Zeesen","Zehdenick(Mark)","Zehdenick-Neuhof","Zeil","Zeithain","Zeitz","Zelezna Ruda centrum","Zelezna Ruda mesto","Zell am See","Zell am Ziller","Zell(Harmersbach)","Zell(Wiesental)","Zell-Romrod","Zella-Mehlis","Zella-Mehlis West","Zellendorf","Zellerthal","Zeltweg","Zempin","Zennern","Zepernick(Bernau)","Zeppelinheim","Zerbst/Anhalt","Zerkall","Zermatt","Zernsdorf","Zerrenthin","Zetten-Andelst","Zeulenroda unt Bf","Zeutern Bf","Zeutern Ost","Zeutern Sportplatz","Zeuthen","Zeutsch","Zevenaar","Zevenbergen","Zgorzelec","Zgorzelec Miasto","Zichem","Zidani Most","Ziegelbrücke","Zielitz","Zielitz Ort","Zielona Gora Gl.","Zierenberg","Zierenberg-Rosental","Ziesar","Zieverich","Zillendorf","Ziltendorf","Zimmern(Main-Tauber)","Zimmern(b Seckach)","Zimmersrode","Zinnowitz","Zirl","Zirndorf","Zirndorf Kneippallee","Zirovice-Seniky","Zirtow-Leussow","Zittau","Zittau Hp","Zittau Süd","Zittau Vorstadt","Zizers","Zoblitz","Zoetermeer","Zoetermeer Oost","Zofingen","Zolder","Zollhaus(Villingen-Schwenningen)","Zollhaus-Petersthal","Zopten","Zorneding","Zossen","Zotzenbach","Zschaitz","Zscherben","Zschopau","Zschopau Ost","Zschortau","Zug(CH)","Zuidbroek","Zuidhorn","Zusenhofen","Zutphen","Zuzenhausen","Zweibrücken Hbf","Zweidlen","Zwenkau-Großdalzig","Zwickau Stadthalle","Zwickau Zentrum","Zwickau(Sachs)Hbf","Zwickau-Pölbitz","Zwickau-Schedewitz","Zwiesel(Bay)","Zwieselau","Zwijndrecht(NL)","Zwingenberg(Baden)","Zwingenberg(Bergstr)","Zwolle","Zwolle Stadshagen","Zwota","Zwota-Zechenbach","Zwotental","Zwönitz","Zöberitz","Zörnigall","Zühlsdorf","Zülpich","Zürich Altstetten","Zürich Enge","Zürich Flughafen","Zürich HB","Zürich Hardbrücke","Zürich Oerlikon","Zürich Stadelhofen","Zürich Wiedikon","Zürich Wollishofen","Züssow","Züttlingen","s-Hertogenbosch","s-Hertogenbosch Oost","t Harde","Äpfingen","Öhringen Hbf","Öhringen West","Öhringen-Cappel","Ölbronn-Dürrn","Ötigheim","Ötisheim","Ötztal","Übach-Palenberg","Überlingen","Überlingen Therme","Überlingen-Nußdorf","Übersee","Ückeritz","Üdingen","Ürzig(DB)"];
- $('input.station').autocomplete({
- delay: 0,
- minLength: 3,
- source: stations
- });
-});
diff --git a/public/static/js/collapse.js b/public/static/js/collapse.js
index 9763f26..2db1089 100644
--- a/public/static/js/collapse.js
+++ b/public/static/js/collapse.js
@@ -1,9 +1,22 @@
/*
- * Copyright (C) 2020 Daniel Friesel
+ * Copyright (C) 2020-2023 Birte Kristina Friesel
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+function setLang(lang) {
+ document.cookie = 'lang=' + lang + ';SameSite=None;Secure';
+ location.reload();
+}
+
+function setTheme(theme) {
+ localStorage.setItem('theme', theme);
+ if (!otherTheme.hasOwnProperty(theme)) {
+ theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
+ }
+ addStyleSheet(theme, 'theme');
+}
+
function reload_app() {
// TODO use a variable instead of window.location.href, as
// window.location.href may be /z/...
@@ -29,7 +42,7 @@ function dbf_show_moreinfo(trainElem, keep_old) {
$('.moreinfo').each(function() {
const infoElem = $(this);
if (!keep_old) {
- $('.moreinfo .train-line').removeClass('bahn sbahn fern ext').addClass(trainElem.data('linetype'));
+ $('.moreinfo .train-line').removeClass('sbahn fern ext ubahn bus tram').addClass(trainElem.data('linetype'));
$('.moreinfo .train-line').text(trainElem.data('line'));
$('.moreinfo .train-no').text(trainElem.data('no'));
$('.moreinfo .train-origin').text(trainElem.data('from'));
@@ -80,7 +93,7 @@ function dbf_show_moreinfo(trainElem, keep_old) {
}
$('.moreinfo .mfooter').append('Fahrtverlauf: <ul class="mroute">' + routebuf + '</ul>');
}
- $.get(window.location.href, {train: trainElem.data('train'), ajax: 1}, function(data) {
+ $.get(window.location.href, {train: trainElem.data('train'), jid: trainElem.data('jid'), ajax: 1}, function(data) {
$('.moreinfo').html(data);
}).fail(function() {
$('.moreinfo .mfooter').append('Der Zug ist abgefahren (Zug nicht gefunden)');
@@ -94,17 +107,60 @@ function dbf_reg_handlers() {
$('div.app > ul > li').click(function(event) {
const trainElem = $(this);
const station = $('div.app').data('station');
+ const param = new URLSearchParams(window.location.search);
event.preventDefault();
var suffix = '?';
- if (window.location.href.includes('detailed=1')) {
+ if (param.get('detailed')) {
suffix += '&detailed=1';
}
- if (window.location.href.includes('past=1')) {
+ if (param.get('hafas')) {
+ suffix += '&hafas=' + param.get('hafas') + '&highlight=' + trainElem.data('station');
+ }
+ if (param.get('past')) {
suffix += '&past=1';
}
- history.pushState({'page':'traindetail','station':station,'train':trainElem.data('no')}, 'test', '/z/' + trainElem.data('train') + '/' + trainElem.data('station') + suffix);
+ if (param.get('rt') || param.get('show_realtime')) {
+ suffix += '&rt=1';
+ }
+ if (param.get('hafas')) {
+ history.pushState({'page':'traindetail','jid':trainElem.data('jid')}, 'test', '/z/' + trainElem.data('jid') + suffix);
+ } else {
+ history.pushState({'page':'traindetail','station':station,'train':trainElem.data('no')}, 'test', '/z/' + trainElem.data('train') + '/' + trainElem.data('station') + suffix);
+ }
dbf_show_moreinfo(trainElem, false);
});
+ const trainid = $(location).attr('hash').substr(1);
+ if (trainid) {
+ var found = false;
+ $('div.app > ul > li').each(function(index) {
+ if (found) {
+ return;
+ }
+ $(this).find('.anchor').each(function() {
+ if ($(this).attr('id') == trainid) {
+ found = true;
+ }
+ });
+ });
+ if (found) {
+ found = false;
+ $('div.app > ul > li').each(function(index) {
+ if (found) {
+ return;
+ }
+ $(this).find('.anchor').each(function() {
+ if ($(this).attr('id') == trainid) {
+ found = true;
+ }
+ });
+ if (found) {
+ $(this).addClass('selected');
+ } else {
+ $(this).addClass('past');
+ }
+ });
+ }
+ }
}
$(function() {
diff --git a/public/static/js/dbf.min.js b/public/static/js/dbf.min.js
index 64e3367..c1f81d4 100644
--- a/public/static/js/dbf.min.js
+++ b/public/static/js/dbf.min.js
@@ -1 +1 @@
-function reload_app(){0==$(".expanded-moreinfo").length?$.get(window.location.href,{ajax:1},function(e){$("div.app > ul").html(e),dbf_reg_handlers(),setTimeout(reload_app,6e4)}).fail(function(){setTimeout(reload_app,1e4)}):setTimeout(reload_app,3e4)}function dbf_show_moreinfo(t,l){const s=t.data("routeprev").split("|"),h=t.data("routenext").split("|"),o=t.data("moreinfo").split("|");$(".moreinfo").each(function(){const e=$(this);if(!l){$(".moreinfo .train-line").removeClass("bahn sbahn fern ext").addClass(t.data("linetype")),$(".moreinfo .train-line").text(t.data("line")),$(".moreinfo .train-no").text(t.data("no")),$(".moreinfo .train-origin").text(t.data("from")),$(".moreinfo .train-dest").text(t.data("to")),$(".moreinfo .minfo").text(""),$(".moreinfo .mfooter").html(""),$(".moreinfo .verbose").html(""),$(".moreinfo .mroute").html(""),$(".moreinfo ul").html("");var n="";if(""!=t.data("arrival")?n+='<div><div class="arrival">An: '+t.data("arrival")+"</div></div>":n+='<div><div class="arrival"></div></div>',""!=t.data("platform")?n+='<div><div class="platform">Gleis '+t.data("platform")+"</div></div>":n+='<div><div class="platform"></div></div>',""!=t.data("departure")?n+='<div><div class="departure">Ab: '+t.data("departure")+"</div></div>":n+='<div><div class="departure"></div></div>',$(".moreinfo .mfooter").append('<div class="dataline">'+n+"</div>"),0==$(".moreinfo .loading").length&&$(".moreinfo .mfooter").append('<div class="loading">Lade Daten, bitte warten...</div>'),""!=t.data("moreinfo")){var r="";for(i in o)r+="<li>"+o[i]+"</li>";$(".moreinfo .mfooter").append("Meldungen: <ul>"+r+"</ul>")}var a="";if(""!=t.data("routeprev"))for(var i in s)a+="<li>"+s[i]+"</li>";if(a+="<li><strong>"+document.title+"</strong></li>",""!=t.data("routenext"))for(var i in h)a+="<li>"+h[i]+"</li>";$(".moreinfo .mfooter").append('Fahrtverlauf: <ul class="mroute">'+a+"</ul>")}$.get(window.location.href,{train:t.data("train"),ajax:1},function(e){$(".moreinfo").html(e)}).fail(function(){$(".moreinfo .mfooter").append("Der Zug ist abgefahren (Zug nicht gefunden)")}),e.removeClass("collapsed-moreinfo"),e.addClass("expanded-moreinfo")})}function dbf_reg_handlers(){$("div.app > ul > li").click(function(e){const n=$(this);var r=$("div.app").data("station");e.preventDefault();e="?";window.location.href.includes("detailed=1")&&(e+="&detailed=1"),window.location.href.includes("past=1")&&(e+="&past=1"),history.pushState({page:"traindetail",station:r,train:n.data("no")},"test","/z/"+n.data("train")+"/"+n.data("station")+e),dbf_show_moreinfo(n,!1)})}$(function(){$("input.station").autocomplete({delay:0,minLength:3,source:["Aachen Hbf","Aachen Schanz","Aachen West","Aachen-Rothe Erde","Aalen Hbf","Aalten","Aalter","Aarau","Aarburg-Oftringen","Abcoude","Abenden","Abensberg","Achern","Achern Stadt","Achiet","Achim","Achkarren","Achmer","Achterwehr","Adelebsen","Adelschlag","Adelsdorf(Mittelfr)","Adelsheim Nord","Adelsheim Ost","Adorf(Erzgeb)","Adorf(Vogtl)","Affaltrach","Affoltern am Albis","Agatharied","Agathenburg","Agde","Aglasterhausen","Aha","Ahaus","Ahlbeck Grenze","Ahlbeck Ostseetherme","Ahlen(Westf)","Ahlhorn","Ahlten","Ahnatal Casselbreite","Ahnatal-Heckershausen","Ahnatal-Weimar","Ahrbrück","Ahrensburg","Ahrensburg-Gartenholz","Ahrensfelde","Ahrensfelde (S)","Ahrensfelde Friedhof","Ahrensfelde Nord","Ahrweiler","Ahrweiler Markt","Aich(Niederbay)","Aichach","Aichstetten","Aigle","Aime-la-Plagne","Aindorf","Ainring","Airolo","Aix-en-Provence TGV","Aix-les-Bains-le-Revard","Akkrum","Alassio","Alba Iulia","Albate-Camerlata","Albbruck","Albenga","Albersdorf","Albersweiler(Pfalz)","Albertville","Albgaubad, Ettlingen","Albig","Albrechtshaus","Albrechtshof","Albshausen","Albsheim(Eis)","Albstadt-Ebingen","Albstadt-Ebingen West","Albstadt-Laufen Ort","Albstadt-Lautlingen","Aldekerk","Aldingen(b Spaichingen)","Alençon","Ales","Aletshausen","Alexisbad","Alfeld(Leine)","Alfter-Impekoven","Alfter-Witterschlick","Algermissen","Aligse","Alken(B)","Alkmaar","Alkmaar Noord","Allendorf(Dillkr)","Allendorf(Eder) Bf","Allensbach","Allerheiligenhöfe","Allersberg(Rothsee)","Allmendingen","Almelo","Almelo de Riet","Almere Buiten","Almere Centrum","Almere Muziekwijk","Almere Oostvaarders","Almere Parkwijk","Almere Poort","Alpen","Alphen aan den Rijn","Alpirsbach","Alsdorf Poststraße","Alsdorf(Westerw)","Alsdorf-Annapark","Alsdorf-Busch","Alsdorf-Kellersberg","Alsdorf-Mariadorf","Alsenz","Alsfeld(Oberhess)","Alsheim","Alt Hüttendorf","Alt Rosenthal","Alt Schwerin","Altach","Altbach","Altdorf West","Altdorf(CH)","Altdorf(Niederbay)","Altdorf(b Nürnberg)","Altdöbern","Alte Veste","Altefähr","Altena(Westf)","Altenahr","Altenau(Bay)","Altenbach","Altenbamberg","Altenbeken","Altenberge","Altenburg","Altendorf(CH)","Altenerding","Altenfeld(Rhön)","Altenglan","Altengörs","Altenhasungen","Altenkirchen(Westerwald)","Altenmarkt im Pongau","Altenmarkt(Alz)","Altenseelbach","Altenstadt(Hess)","Altenstadt(Iller)","Altenstadt(Waldnaab)","Altenstadt-Höchst","Altenstadt-Lindheim","Altentreptow","Altenwillershagen","Altersbach","Altes Lager","Altglashütten-Falkau","Althegnenberg","Altheim(Hess)","Althof","Altingen(Württ)","Altmarkt/Regierungspräsidium, Kassel","Altmittweida","Altmorschen","Altnau","Altomünster","Altoschatz-Rosenthal","Altranft","Altshausen","Altstädten(Allgäu)","Altstätten SG","Alttann","Altötting","Alveslohe","Alvesta station","Alzenau Burg","Alzenau Nord","Alzenau(Unterfr)","Alzey","Alzey Süd","Alzey West","Am Kupferhammer, Kassel","Am Stern, Kassel","Am Weinberg, Kassel","Amberg","Amberieu","Amerang","Amersfoort Centraal","Amersfoort Schothorst","Amersfoort Vathorst","Ammern","Amorbach","Ampfing","Amriswil","Amsdorf","Amsterdam Amstel","Amsterdam Bijlmer ArenA","Amsterdam Centraal","Amsterdam Holendrecht","Amsterdam Lelylaan","Amsterdam Muiderpoort","Amsterdam RAI","Amsterdam Science Park","Amsterdam Sloterdijk","Amsterdam Zuid","Amstetten NÖ","Amstetten(W) Lokalbahn","Amstetten(Württ)","Amtshainersdorf","Andelfingen","Andermatt","Andernach","Andorf","Angermund","Angermünde","Angern-Rogätz","Angersbach","Angersdorf","Angleur","Angouleme","Anklam","Anna Paulowna","Annaberg-Buchholz Mitte","Annaberg-Buchholz Süd","Annaberg-Buchholz unterer Bf","Annaburg","Annweiler am Trifels","Annweiler-Sarnstall","Anrath","Ans(B)","Ansbach","Antibes","Antonsthal","Antwerpen Centraal","Antwerpen-Berchem","Antwerpen-Zuid","Anwanden","Anzefahr","Anzenkirchen","Apach(Moselle)","Apeldoorn","Apeldoorn De Maten","Apeldoorn Osseveld","Apensen","Apolda","Appenweier","Appingedam","Arad","Arbon","Arbon (See)","Arbste","Ardey","Arensdorf(Köthen)","Arenshausen","Arfurt(Lahn)","Argeles-sur-Mer","Arkel","Arles","Arlon","Armsheim","Arnbach","Arnemuiden","Arnhem Centraal","Arnhem Presikhaaf","Arnhem Velperpoort","Arnhem Zuid","Arnoldstein","Arnsberg(Westf)","Arnschwang","Arnsdorf(Dresden)","Arnstadt Hbf","Arnstadt Süd","Arosa","Arrach","Arras(F)","Arsbeck","Artenay(Loiret)","Artern","Arth-Goldau","Arvant","Arzberg(Oberfr)","As(CZ)","Aschaffenburg Hbf","Aschaffenburg Hochschule","Aschaffenburg Süd","Aschau(Chiemgau)","Ascheberg(Holst)","Ascheberg(Westf)","Aschendorf","Aschersleben","Ashausen","Ashford(Kent)","Ashford(Kent) Int.","Asperg","Asse","Asselheim","Assen","Assenheim(Oberhess)","Assmannshausen","Attendorn","Attendorn-Hohen Hagen","Attnang-Puchheim","Au SG","Au ZH","Au im Murgtal","Au(Sieg)","Aue(Sachs)","Aue(Sachs) Erzgebirgsstadion","Aue-Wingeshausen","Auehütte","Auerbach(V) ob Bf","Auerbach(V) unt Bf","Auerbach(Vogtl) Hp","Auerbach(b Mosbach, Baden)","Auersmacher","Auestadion, Kassel","Aufhausen(Württ)","Aufhausen(b Erding)","Auggen","Augsburg Haunstetterstraße","Augsburg Hbf","Augsburg Messe","Augsburg Morellstr.","Augsburg-Hochzoll","Augsburg-Oberhausen","August-Bebel-Straße, Karlsruhe","Augustfehn","Augustusburg Bergstation","Aukrug","Aulendorf","Aulnoye Aymeries","Aumenau","Aumühle","Auneau(Dourdan)","Auringen-Medenbach","Auvelais","Auw an der Kyll","Außenried","Avesnes-sur-Helpe","Avignon Centre","Avignon TGV","Aying","Aßlar","Aßling(Oberbay)","Baabe","Baalberge","Baar(CH)","Baar-Ebenhausen","Baarn","Babenhausen Langstadt","Babenhausen(Hess)","Babstadt","Babylon","Bacharach","Bachern","Bachfeld","Bachheim","Backnang","Bad Abbach","Bad Aibling","Bad Aibling Kurpark","Bad Arolsen","Bad Aussee","Bad Bellingen","Bad Belzig","Bad Bentheim","Bad Bergzabern","Bad Berka","Bad Berka Zeughausplatz","Bad Berleburg","Bad Bevensen","Bad Birnbach","Bad Blankenburg(Thüringerw)","Bad Blumau","Bad Bodendorf","Bad Bodenteich","Bad Brambach","Bad Bramstedt","Bad Bramstedt Kurhaus","Bad Breisig","Bad Camberg","Bad Doberan","Bad Doberan Goethestraße","Bad Doberan Stadtmitte","Bad Driburg(Westf)","Bad Dürkheim","Bad Dürkheim-Trift","Bad Dürrenberg","Bad Elster","Bad Ems","Bad Ems West","Bad Endorf","Bad Fallingbostel","Bad Freienwalde","Bad Friedrichshall Hbf","Bad Friedrichshall-Kochendorf","Bad Gandersheim","Bad Gastein","Bad Griesbach(Schwarzwald)","Bad Grönenbach","Bad Harzburg","Bad Herrenalb","Bad Hersfeld","Bad Hofgastein","Bad Holzhausen","Bad Homburg","Bad Honnef Stadtbahn","Bad Honnef(Rhein)","Bad Höhenstadt","Bad Hönningen","Bad Imnau","Bad Ischl","Bad Karlshafen","Bad Kissingen","Bad Kleinen","Bad Kohlgrub","Bad Kohlgrub Kurhaus","Bad Kreuznach","Bad Krozingen","Bad Krozingen Ost","Bad König","Bad König Zell","Bad Kösen","Bad Köstritz","Bad Kötzting","Bad Laasphe","Bad Laasphe-Niederlaasphe","Bad Langensalza","Bad Lausick","Bad Lauterberg im Harz Barbis","Bad Liebenwerda","Bad Liebenzell","Bad Lobenstein","Bad Malente-Gremsmühlen","Bad Mergentheim","Bad Münder(Deister)","Bad Münster a Stein","Bad Münstereifel","Bad Münstereifel-Arloff","Bad Münstereifel-Iversheim","Bad Nauheim","Bad Nenndorf","Bad Neuenahr","Bad Neustadt(Saale)","Bad Niedernau","Bad Nieuweschans","Bad Oeynhausen","Bad Oeynhausen Süd","Bad Oldesloe","Bad Peterstal","Bad Pyrmont","Bad Ragaz","Bad Rappenau","Bad Rappenau Kurpark","Bad Reichenhall","Bad Reichenhall-Kirchberg","Bad Rodach","Bad Rotenfels Bf","Bad Rotenfels Schloss","Bad Rotenfels Weinbrennerstraße","Bad Saarow","Bad Saarow Klinikum","Bad Sachsa","Bad Salzdetfurth","Bad Salzdetfurth Solebad","Bad Salzhausen","Bad Salzschlirf","Bad Salzuflen","Bad Salzuflen-Sylbach","Bad Salzungen","Bad Sassendorf","Bad Saulgau","Bad Schallerbach-Wallern","Bad Schandau","Bad Schlema","Bad Schmiedeberg","Bad Schmiedeberg Kurzentrum","Bad Schussenried","Bad Schwartau","Bad Schönborn Süd","Bad Schönborn-Kronau","Bad Sebastiansweiler-Belsen","Bad Segeberg","Bad Sobernheim","Bad Soden(Taunus)","Bad Soden-Salmünster","Bad Sooden-Allendorf","Bad St Peter Süd","Bad St Peter-Ording","Bad Staffelstein","Bad Steben","Bad Suderode","Bad Sulza","Bad Säckingen","Bad Teinach-Neubulach","Bad Tölz","Bad Tönisstein","Bad Urach","Bad Urach Ermstalklinik","Bad Urach Wasserfall","Bad Vigaun","Bad Vilbel","Bad Vilbel Süd","Bad Vilbel-Gronau","Bad Waldsee","Bad Wildbad Bf","Bad Wildbad Kurpark","Bad Wildbad Nord","Bad Wildbad Uhlandplatz","Bad Wildungen","Bad Wilsnack","Bad Wimpfen","Bad Wimpfen Im Tal","Bad Wimpfen-Hohenstadt","Bad Windsheim","Bad Wurzach","Bad Wörishofen","Bad Zurzach","Bad Zwischenahn","Baddeckenstedt","Baden(CH)","Baden(Verden)","Baden-Baden","Baden-Baden Haueneberstein","Baden-Baden Rebland","Baflo","Bagenz","Bahlingen Riedlen","Bahlingen am Kaiserstuhl","Bahnbrücken","Bahnhof Niederzwehren, Kassel","Bahnhof, Gönnheim","Bahnsdorf","Baierbrunn","Baiersbronn Bf","Baiersbronn Schule","Baiersdorf","Baisieux","Baitz","Balbersdorf","Baldham","Balduinstein","Balerna","Balgheim","Balgstädt","Balingen Süd","Balingen(Württ)","Ballersbach","Ballstädt(Gotha)","Baltersweiler","Balve","Bamberg","Bammental","Bannemin-Mölschow","Banova Jaruga","Bansin Seebad","Banteln","Bantin","Bantorf","Bantzenheim","Banyuls-sur-Mer","Bar-le-Duc","Barabein","Barbelroth","Barby","Barcelona Sants","Barchel","Bardowick","Barendrecht","Bargstedt","Bargteheide","Barleben","Barleber See","Barmstedt","Barmstedt Brunnenstr","Barneveld Centrum","Barneveld Noord","Barneveld Zuid","Barnstorf(Han)","Barnten","Barrien","Barsinghausen","Barth","Barthmühle","Baruth(Mark)","Bascharage-Sanem","Basdahl Kluste","Basdorf","Basel Bad Bf","Basel Dreispitz","Basel SBB","Basel St Johann","Bassersdorf","Bassum","Batzenhäusle","Batzhausen","Bauerbach","Baumholder","Baunach","Baunatal-Guntershausen","Baunatal-Rengershausen","Baunhoej","Bautzen","Bavendorf","Bayerbach","Bayerisch Eisenstein","Bayerisch Gmain","Bayonne","Bayreuth Hbf","Bayreuth-St Georgen","Bayrischzell","Bebitz","Bebra","Bechstedt-Trippstein","Beckingen(Saar)","Beckum-Neubeckum","Bedburg(Erft)","Bedburg-Hau","Bedum","Beek-Elsloo","Beelen","Beelitz Stadt","Beelitz-Heilstätten","Beerfelden Hetzbach","Beernem","Beesd","Beeskow","Beetz-Sommerfeld","Behringersdorf","Beienheim","Beilen","Beilrode","Beimerstetten","Bekescsaba","Bela pod Bezdezem","Beldorf","Belfort Ville","Belgershain","Belleben","Bellegarde(Ain)","Bellenberg","Belleville Meurthe et Moselle","Bellheim Am Mühlbuckel","Bellheim Bf","Bellinzona","Belp","Belval Lycée","Belval-Rédange","Belval-Université","Belvaux-Soleuvre","Bempflingen","Benediktbeuern","Benesov n. Ploucnici","Benestroff","Benfeld(Selestat)","Bengel","Bening","Benneckenstein","Bennemühlen","Bennewitz","Bennigsen","Benningen(Neckar)","Bennungen","Benshausen","Bensheim","Bensheim-Auerbach","Bentwisch","Beratzhausen","Berbisdorf","Berbisdorf Anbau","Berchem(LUX)","Berchtesgaden Hbf","Berg(CH)","Berg(Pfalz)","Berga(Elster)","Berga-Kelbra","Bergen auf Rügen","Bergen op Zoom","Bergen(Oberbay)","Bergenweiler","Bergfelde(b Berlin)","Berghausen Am Stadion","Berghausen Hummelberg","Berghausen Pfinzbrücke","Berghausen(Baden)","Berghausen(Pfalz)","Berghausen(b Wittgenstein)","Bergheim(Erft)","Bergheim-Giflitz","Bergisch Gladbach","Bergsdorf","Bergtheim","Bergues(Coudek)","Bergwitz","Bergün/Bravuogn","Beringen Bad Bf","Beringerfeld","Beringhausen","Beringstedt","Berka(Wipper)","Berkenbrück","Berlin Alexanderplatz","Berlin Alexanderplatz (S)","Berlin Alt-Reinickendorf","Berlin Anhalter Bf","Berlin Attilastr.","Berlin Baumschulenweg","Berlin Bellevue","Berlin Betriebsbf Rummelsburg","Berlin Beusselstraße","Berlin Bornholmer Str.","Berlin Botanischer Garten","Berlin Brandenburger Tor","Berlin Buckower Chaussee","Berlin Bundesplatz","Berlin Charlottenburg (S)","Berlin Eichborndamm","Berlin Feuerbachstr.","Berlin Frankfurter Allee","Berlin Friedrichstraße","Berlin Friedrichstraße (S)","Berlin Gehrenseestraße","Berlin Gesundbrunnen","Berlin Gesundbrunnen(S)","Berlin Greifswalder Str","Berlin Grünbergallee","Berlin Hackescher Markt","Berlin Hbf","Berlin Hbf (S-Bahn)","Berlin Hbf (tief)","Berlin Heerstraße","Berlin Heidelberger Platz","Berlin Hermannstraße","Berlin Hohenzollerndamm","Berlin Humboldthain","Berlin Innsbrucker Platz","Berlin Jannowitzbrücke","Berlin Julius-Leber-Brücke","Berlin Jungfernheide","Berlin Jungfernheide (S)","Berlin Karl-Bonhoeffer-Nervenklinik","Berlin Köllnische Heide","Berlin Landsberger Allee","Berlin Mehrower Allee","Berlin Messe Nord/ICC (Witzleben)","Berlin Messe Süd (Eichkamp)","Berlin Mexikoplatz","Berlin Nordbahnhof","Berlin Nöldnerplatz","Berlin Olympiastadion","Berlin Oranienburger Straße","Berlin Osdorfer Straße","Berlin Ostbahnhof","Berlin Ostbahnhof (S)","Berlin Ostkreuz","Berlin Ostkreuz (S)","Berlin Plänterwald","Berlin Poelchaustr.","Berlin Potsdamer Platz","Berlin Potsdamer Platz (S)","Berlin Prenzlauer Allee","Berlin Priesterweg","Berlin Raoul-Wallenberg-Str.","Berlin Rathaus Steglitz","Berlin Savignyplatz","Berlin Schichauweg","Berlin Schönhauser Allee","Berlin Sonnenallee","Berlin Springpfuhl","Berlin Storkower Str","Berlin Sundgauer Str","Berlin Südende","Berlin Südkreuz","Berlin Südkreuz (S)","Berlin Treptower Park","Berlin Wannsee","Berlin Wannsee (S)","Berlin Warschauer Straße","Berlin Westend","Berlin Westhafen","Berlin Westkreuz","Berlin Wollankstraße","Berlin Wuhletal","Berlin Yorckstr.(S1)","Berlin Yorckstr.(S2)","Berlin Zoologischer Garten","Berlin Zoologischer Garten (S)","Berlin-Adlershof","Berlin-Altglienicke","Berlin-Biesdorf","Berlin-Blankenburg","Berlin-Buch","Berlin-Charlottenburg","Berlin-Friedenau","Berlin-Friedrichsfelde Ost","Berlin-Friedrichshagen","Berlin-Frohnau","Berlin-Grunewald","Berlin-Grünau","Berlin-Halensee","Berlin-Heiligensee","Berlin-Hermsdorf","Berlin-Hirschgarten","Berlin-Hohenschönhausen","Berlin-Hohenschönhausen (S)","Berlin-Johannisthal","Berlin-Karlshorst","Berlin-Karlshorst (S)","Berlin-Karow","Berlin-Kaulsdorf","Berlin-Köpenick","Berlin-Lankwitz","Berlin-Lichtenberg","Berlin-Lichtenberg (S)","Berlin-Lichtenrade","Berlin-Lichterfelde Ost","Berlin-Lichterfelde Ost (S)","Berlin-Lichterfelde Süd","Berlin-Lichterfelde West","Berlin-Mahlsdorf","Berlin-Mahlsdorf (S)","Berlin-Marienfelde","Berlin-Marzahn","Berlin-Neukölln","Berlin-Nikolassee","Berlin-Oberspree","Berlin-Pankow","Berlin-Pankow-Heinersdorf","Berlin-Pichelsberg","Berlin-Rahnsdorf","Berlin-Rummelsburg","Berlin-Schlachtensee","Berlin-Schulzendorf","Berlin-Schöneberg","Berlin-Schöneweide","Berlin-Schöneweide (S)","Berlin-Schönholz","Berlin-Spandau","Berlin-Spandau (S)","Berlin-Spindlersfeld","Berlin-Staaken","Berlin-Stresow","Berlin-Tegel (S)","Berlin-Tempelhof","Berlin-Tiergarten","Berlin-Waidmannslust","Berlin-Wartenberg","Berlin-Wedding","Berlin-Wilhelmshagen","Berlin-Wilhelmsruh","Berlin-Wittenau (Wilhelmsruher Damm)","Berlin-Wuhlheide","Berlin-Zehlendorf","Berlingen URh","Berlingen(CH)","Bermatingen-Ahausen","Bern","Bernau (S)","Bernau a Chiemsee","Bernau(b Berlin)","Bernau-Friedenstal","Bernay","Bernburg Hbf","Bernburg-Friedenshall","Bernburg-Roschwitz","Bernburg-Strenzfeld","Bernburg-Waldau","Berne","Bernried","Bernterode","Beroun","Bersenbrück","Berthelming","Berthelsdorf(Erzgeb)","Berthelsdorf(Erzgebirge) Ort","Bertrange-Strassen","Bertrix","Bertsdorf","Berzhahn","Besançon-Mouillère","Besançon-Viotte","Besch","Besigheim","Besseringen","Best","Bestensee","Bestwig","Bettembourg","Bettembourg(fr)","Bettmannsäge","Bettwiesen","Betzdorf(LUX)","Betzdorf(Sieg)","Beucha","Beuchow","Beuggen","Beuna(Geiseltal)","Beuren","Beuron","Beutelsbach","Beutersitz","Beverungen-Wehrden","Beverwijk","Bex","Bexbach","Beyendorf","Beziers","Biarritz","Biasca","Bibelöd","Biberach(Baden)","Biberach(Riß)","Biberach(Riß) Süd","Biberist Ost","Biberist RBS","Biblis","Bibra","Bichl","Bichlbach Almkopfbahn","Bichlbach-Berwang","Bickenbach(Bergstr)","Biebesheim","Biedenkopf","Biedenkopf Campus","Biederitz","Biel/Bienne","Bielefeld Hbf","Bielefeld Ost","Bielefeld-Brackwede","Bielefeld-Senne","Bielefeld-Sennestadt","Bielefeld-Windelsbleiche","Biendorf","Bienenbüttel","Bienenmühle","Bierbach","Bieren-Rödinghausen","Bieringen","Biersdorf(Westerw)","Biersdorf-Ort(Ww)","Bierset-Awans","Biesenrode","Biesenthal","Biessenhofen","Bietigheim(Baden)","Bietigheim-Bissingen","Bietingen","Bigge","Bildstock","Bilfingen","Bilina","Billenhausen","Billerbeck","Billum st","Bilten","Bilthoven","Bily Kostel nad Nisou","Binau","Bindfelde","Bindlach","Bingen(Rhein) Hbf","Bingen(Rhein) Stadt","Bingen-Gaulsheim","Binolen","Binz LB","Binzen","Birach","Birkelbach","Birkenau","Birkenbringhausen","Birkenfeld(Enz)","Birkengrund","Birkenmoor","Birkenstein","Birkenwerder(b Berlin)","Birkungen","Birmensdorf ZH","Birresborn","Bischheim-Gersdorf","Bischofshofen","Bischofswerda","Bischofswiesen","Bischweier","Bisingen","Bissendorf","Bitburg-Erdorf","Bittelbronn","Bitterfeld","Bitzfeld","Blaibach(Oberpf)","Blaichach(Allgäu)","Blainville-Damelevieres","Blaj","Blankenbach","Blankenberg(Meckl)","Blankenberg(Sieg)","Blankenburg(Harz)","Blankenfelde (S)","Blankenfelde(Teltow-Fläming)","Blankenheim(Sangerhausen)","Blankenheim(Wald)","Blankenloch","Blankenloch Kirche, Stutensee","Blankenloch Mühlenweg, Stutensee","Blankenloch Nord, Stutensee","Blankenloch Süd, Stutensee","Blankenloch Tolna-Platz, Stutensee","Blankensee(Meckl)","Blankenstein(Saale)","Blaubeuren","Blaufelden","Blausee-Mitholz","Blaustein","Blechhammer(Thür)","Bleibach","Bleichenbach(Oberh)","Bleicherode Ost","Blens","Blerick","Blieskastel-Lautzkirchen","Blindenmarkt","Blindheim","Bloemendaal","Bludenz","Bludenz Brunnenfeld","Bludenz-Moos","Blumberg(b Berlin)","Blumberg-Rehhahn","Blumberg-Riedöschingen","Blumberg-Zollhaus","Blumenau","Blumenhagen","Blumenthal(Mark)","Blönsdorf","Bobenheim","Bobingen","Bobitz","Bobstadt","Bobzin","Bocholt","Bochum Hbf","Bochum West","Bochum-Dahlhausen","Bochum-Ehrenfeld","Bochum-Hamme","Bochum-Langendreer","Bochum-Langendreer West","Bochum-Riemke","Bockenheim-Kindenheim","Bodegraven","Bodelsberg","Bodelshausen","Bodenburg","Bodenfelde","Bodenheim","Bodenmais","Bodenrode","Bodenwöhr Nord","Bodio TI","Boen(F)","Bogen","Bohmte","Bohumin","Boisheim","Boizenburg(Elbe)","Bokholt","Bollwiller(Lutterb)","Bologna Centrale","Bolzano/Bozen","Bondorf(b Herrenberg)","Bonn Brühler Str.","Bonn Hbf","Bonn Hbf (tief)","Bonn Helmholtzstraße","Bonn Heussallee/Museumsmeile","Bonn Konrad-Adenauer-Platz","Bonn Stadthaus","Bonn UN Campus","Bonn-Bad Godesberg","Bonn-Bad Godesberg Stadthalle","Bonn-Beuel","Bonn-Duisdorf","Bonn-Endenich Nord","Bonn-Mehlem","Bonn-Oberkassel","Bonn-Oberkassel Mitte","Bonn-Ramersdorf","Bookholzberg","Boondael/Boondaal","Boostedt","Bopfingen","Boppard Hbf","Boppard Süd","Boppard-Bad Salzig","Boppard-Buchholz","Boppard-Fleckertshöhe","Boppard-Hirzenach","Bordeaux-St-Jean","Bordesholm","Borgeln","Borgholzhausen","Borgo S. Dalmazzo","Borgsdorf","Bork(Westf)","Borken(Hess)","Borken(Westf)","Borkheide","Borna(Leipzig)","Borne(NL)","Bornholte(b Verl)","Borsdorf(Hess)","Borsdorf(Sachs)","Boskoop","Boskoop Snijdelwijk","Bottighofen","Bottrop Hbf","Bottrop-Boy","Bottrop-Vonderort","Boulevarden st","Bourg-St.Maurice","Bourg-en-Bresse","Bourges","Bous(Saar)","Boven-Hardinxveld","Bovenkarspel Flora","Bovenkarspel-Grootebroek","Boxberg-Wölchingen","Boxmeer","Boxtel","Brachbach","Brachelen","Brahlstorf","Brake(Unterweser)","Brake(b Bielefeld)","Brakel(Höxter)","Bramming st","Bramsche","Bramstedt(b Syke)","Brand Tropical Islands","Brandenburg Altstadt","Brandenburg Hbf","Brandoberndorf","Brandstätt","Brannenburg","Brasov","Bratislava hl.st.","Bratislava-Petrzalka","Braubach","Braunau/Inn","Braunsbedra","Braunsbedra Ost","Braunschweig Hbf","Braunschweig-Gliesmarode","Braunsdorf-Lichtenwalde","Brebach","Breclav","Breclav(Gr)","Breda","Breda-Prinsenbeek","Breddin","Bredebro st","Bredelar","Bredenbek","Bredstedt","Brefeld","Bregenz","Bregenz Hafen","Bregenz Riedenburg","Brehna","Breil-sur-Roya","Breinig","Breisach","Breitenbrunn(Erzg)","Breitenbrunn(Schwab)","Breitendiel","Breitendorf","Breitengüßbach","Breitscheidt(Altenkirchen, Ww)","Breitungen(Werra)","Bremen Hbf","Bremen Kreinsloger","Bremen Mühlenstraße","Bremen Neustadt","Bremen Turnerstraße","Bremen-Aumund","Bremen-Blumenthal","Bremen-Burg","Bremen-Farge","Bremen-Hemelingen","Bremen-Lesum","Bremen-Mahndorf","Bremen-Oberneuland","Bremen-Oslebshausen","Bremen-Schönebeck","Bremen-Sebaldsbrück","Bremen-St Magnus","Bremen-Vegesack","Bremen-Walle","Bremerhaven Hbf","Bremerhaven-Lehe","Bremerhaven-Wulsdorf","Bremervörde","Brenk","Brennero/Brenner","Brescia","Bressanone/Brixen","Bressoux","Brest(F)","Brest-Aspe","Breternitz","Bretleben","Bretten","Bretten Kupferhälde","Bretten Rechberg","Bretten Schulzentrum","Bretten Stadtmitte","Bretten Wannenweg","Bretten-Ruit","Brettorf","Bretzenheim(Nahe)","Bretzfeld","Breukelen","Breyell","Breziny u Decina","Brieselang","Briesen(Mark)","Brig","Brigachtal Kirchdorf","Brigachtal Klengen","Brilon Stadt","Brilon Wald","Britz","Brixen im Thale","Brixlegg","Brocken","Brockhöfe","Broderstorf","Broens st","Brohl","Brokstedt","Bronschhofen","Bruchenbrücken","Bruchhausen(b Ettlingen)","Bruchköbel","Bruchmühlbach-Miesau","Bruchmühlen","Bruchsal","Bruchsal Am Mantel","Bruchsal Bildungszentrum","Bruchsal Schlachthof","Bruchsal Schloßgarten","Bruchsal Sportzentrum","Bruchsal Stegwiesen","Bruchsal Tunnelstraße","Bruchweiler","Bruck-Fusch","Bruck/Leitha","Bruck/Mur","Bruckberg","Brucken","Bruckmühl","Brugg AG","Brugge","Brumath","Brummen","Brunau-Packebusch","Brunico/Bruneck","Brunnen(CH)","Brunnen(Oberbay)","Brussels Airport - Zaventem","Bruxelles Midi","Bruxelles-Central","Bruxelles-Luxembourg","Bruxelles-Midi Eurostar","Bruxelles-Nord","Bräunlingen Bahnhof","Bräunlingen Industriegebiet","Brötzingen Mitte","Brötzingen Sandweg","Brötzingen Wohnlichstraße","Brück(Mark)","Brügge(Prign)","Brühl","Brühl-Kierberg","Bubach","Bubenheim","Bubenreuth","Buchbrunn-Mainstockheim","Buchen Ost","Buchen(Odenw)","Buchenau(Lahn)","Buchenau(Oberbay)","Buchenhain","Buchenhorst","Buchholz(Baden)","Buchholz(Nordheide)","Buchholz(Zauche)","Buchloe","Buchs SG","Buckow(Beeskow)","Bucuresti Nord Gara A","Budapest-Ferencváros","Budapest-Keleti","Budapest-Nyugati","Buddenhagen","Budenheim","Bufleben","Buggingen","Buir","Buitenpost","Buldern","Bullay(DB)","Bully-Grenay","Bunde","Bundenthal-Rumbach","Bunnik","Burbach Mitte","Burbach(Kr Siegen)","Burg Stargard(Meckl)","Burg(Dillkr) Nord","Burg(Dithm)","Burg(Magdeburg)","Burg-u. Nieder Gemünden","Burgau(Schwab)","Burgbernheim","Burgbernheim-Wildbad","Burgdorf","Burgfried b.Gnas","Burghaun(Hünfeld)","Burghausen","Burgheim","Burgholzhausen v d H","Burgkemnitz","Burgkirchen","Burgkunstadt","Burglauer","Burgsinn","Burgstall(Murr)","Burgstädt","Burgthann","Burgweiler","Burhafe(Ostfriesl)","Burkhardswalde-Maxen","Burkhardtsdorf","Burkhardtsdorf Mitte","Burkheim-Bischoffingen","Burladingen","Burladingen West","Buschmühle","Buschow","Busenbach","Busenberg-Schindhard","Busigny","Bussnang","Bussum Zuid","Busto Arsizio","Buttenheim","Buttstädt","Butzbach","Buxtehude","Bydgoszcz Glowna","Bäch","Bärenhecke-Johnsbach","Bärenklau","Bärenstein(Annaberg)","Bärenstein(b Glashütte, Sachs)","Bärnsdorf","Bäumenheim","Böbingen(Rems)","Böblingen","Böblingen Danziger Str","Böblingen Heusteigstr","Böblingen Südbf","Böblingen Zimmerschlag","Böbrach","Böckingen Sonnenbrunnen","Böckingen West","Böckstein","Bödigheim","Böheimkirchen","Böhl-Iggelheim","Böhlen Werke","Böhlen(Leipzig)","Böhmhof","Böhringen-Rickelshausen","Bölzke","Bönen","Bönen-Nordbögge","Bönningstedt","Börnecke(Harz)","Börßum","Bösdorf(Sachs-Anh)","Bösperde","Bötzingen","Bötzingen Mühle","Bübingen","Büchen","Büchenbach","Büches-Düdelsheim","Büchig, Stutensee","Bückeburg","Büdingen(Oberhess)","Büdingen(Westerw)","Bühl(Baden)","Bülach","Bülzig","Bünde(Westf)","Bürgeln","Bürgerhaus, Hessisch Lichtenau","Bürglen","Bürstadt","Büsenbachtal","Büsum","Büttgen","Bützow","Cadenazzo","Cadenberge","Cadolzburg","Cainsdorf","Calais Ville","Calais-Fréthun","Calau(Nl)","Calbe(Saale) Ost","Calbe(Saale) Stadt","Calbe(Saale) West","Calberlah","Caldern","Caldes de Malavella","Calmbach Bahnhof","Calmbach Süd","Calw","Camburg(Saale)","Cammin(Meckl)","Campo di Trens/Freienfeld","Cannes","Cannes-la-Bocca","Capelle Schollevaar","Capelle(Westf)","Capellen","Capolago-Riva S. Vitale","Caputh Schwielowsee","Caputh-Geltow","Carbonne(Boussens)","Carcassonne","Carimate","Carnoules(Toulon)","Casekow","Casteldarne/Ehrenburg","Castelnaudary","Castione-Arbedo","Castricum","Castrop-Rauxel Hbf","Castrop-Rauxel Süd","Castrop-Rauxel-Merklinde","Cavaillon(Avignon)","Celle","Centallo","Cents-Hamm","Cerbère","Ceska Kamenice","Ceska Kubice","Ceska Lipa hl.n.","Ceska Lipa strelnice","Ceske Budejovice","Ceske Velenice","Chalon sur Saône","Chalons en Champagne","Cham(Oberpf)","Chambery-Challes-E","Chamerau","Champigneulles","Charleroi Sud","Chateau-Thierry","Chauny(Tergnier)","Cheb","Cheb-Skalka","Chelles Gournay","Chemnitz Alt Chemnitz Center","Chemnitz Annenstraße","Chemnitz Bernsbachplatz","Chemnitz Brückenstraße/Freie Presse","Chemnitz Erdmannsdorfer Straße","Chemnitz Erfenschlag","Chemnitz Friedrichstraße","Chemnitz Gustav-Freytag-Straße","Chemnitz Hbf","Chemnitz Hbf (Bahnhofstraße)","Chemnitz Kinderwaldstätte","Chemnitz Küchwald","Chemnitz Mitte","Chemnitz Moritzhof","Chemnitz Omnibusbahnhof","Chemnitz Riemenschneiderstraße","Chemnitz Rosenbergstraße","Chemnitz Roter Turm","Chemnitz Rösslerstraße","Chemnitz Scheffelstraße","Chemnitz Schneeberger Straße","Chemnitz Schule Altchemnitz","Chemnitz Stadlerplatz","Chemnitz Stefan-Heym-Platz","Chemnitz Süd","Chemnitz TU Campus","Chemnitz Technopark","Chemnitz Theaterplatz","Chemnitz Treffurthstraße","Chemnitz Uhlestraße","Chemnitz Zentralhaltestelle","Chemnitz-Altchemnitz","Chemnitz-Borna Hp","Chemnitz-Harthau","Chemnitz-Hilbersdorf","Chemnitz-Reichenhain","Chemnitz-Schönau","Chemnitz-Siegmar","Chenay Gagny","Chenee","Cherbourg","Chevremont(NL)","Chiasso","Chiusa/Klausen","Chomutov","Chomutov mesto","Chorin","Chotyne","Chrastava","Chrastava-Andelska Hora","Chribska","Chur","Château du Loir","Château-Arnoux-St-Auban","Châteauroux","Châtelet","Cintegabelle","Clarholz","Clausnitz","Clermont-Ferrand","Clerval","Clervaux","Cloppenburg","Coburg","Coburg Nord","Coburg-Beiersdorf","Coburg-Neuses","Cochem(Mosel)","Coesfeld Schulzentrum","Coesfeld(Westf)","Coevorden","Colle Isarco/Gossensass","Collenberg","Collioure","Colmar","Combs la Ville Quincy","Como S. Giovanni","Compiegne","Conegliano","Conflans-Jarny","Contwig","Coppenbrügge","Corbehem(Douai)","Corbeil Essonnes","Cornaux","Coschen","Cosne","Cossebaude","Cossonay-Penthalaz","Coswig(Anh)","Coswig(b Dresden)","Cottbus Hbf","Cottbus-Merzdorf","Cottbus-Sandow","Cottbus-Willmersdorf Nord","Coulommiers","Courcelles-sur-Nied","Coutras","Crailsheim","Cranzahl","Creidlitz","Creil","Creußen(Oberfr)","Crimmitschau","Crivitz","Crossen Ort","Crossen a d Elster","Cuijk","Culemborg","Culmont-Chalindrey","Culoz","Cuneo","Cunnertswalde","Cursdorf","Curtici","Cuxhaven","Czerwiensk","Cölbe","Daaden","Daarlerveen","Dabendorf","Dachau Bahnhof","Dachau Stadt","Dachrieden","Dachsen","Dachwig","Dagebüll Kirche","Dagebüll Mole","Dagmersellen","Dahl","Dahlbruch","Dahlem(Eifel)","Dahlen(Sachs)","Dahlenburg","Dahlerbrück","Dahlewitz","Dahn","Dahn Süd","Dalen(NL)","Dalfsen","Dalheim","Dallau","Dallgow-Döberitz","Dambeck(Altm)","Dammerstock, Karlsruhe","Dannenberg Ost","Dannenwalde(Gransee)","Darching","Darlingerode","Darmstadt Hbf","Darmstadt Nord","Darmstadt Ost","Darmstadt Süd","Darmstadt TU-Lichtwiese","Darmstadt-Arheilgen","Darmstadt-Eberstadt","Darmstadt-Kranichstein","Darmstadt-Wixhausen","Dasing","Dattenfeld(Sieg)","Dauenhof","Daufenbach","Dausenau","Davensberg","Davos Dorf","Davos Platz","Dax","Daxlanden Dornröschenweg, Karlsruhe","Daxlanden Karl-Delisle-Straße, Karlsruhe","Daxlanden Nussbaumweg, Karlsruhe","Daxlanden Thomas-Mann-Straße, Karlsruhe","De Vink","Debrecen","Decin hl.n.","Decin vychod","Decin-Certova voda","Decin-Priper","Decin-Prostredni Zleb","Dedenhausen","Dedensen-Gümmer","Dedinghausen","Deezbüll","Deggendorf Hbf","Deidesheim","Deining(Oberpf)","Deinste","Deinum","Deisenhofen","Deißlingen Mitte","Delden","Delft","Delft Campus","Delfzijl","Delfzijl West","Delitzsch ob Bf","Delitzsch unt Bf","Dellfeld","Dellfeld Ort","Delmenhorst","Delmenhorst Hasporter Damm","Delémont","Demitz-Thumitz","Demker","Demmin","Den Dolder","Den Haag Centraal","Den Haag HS","Den Haag Laan van Nieuw Oost Indie","Den Haag Mariahoeve","Den Haag Moerwijk","Den Haag Ypenburg","Den Helder","Den Helder Zuid","Denderleeuw","Densborn","Denzlingen","Dernau","Dernbach(Westerw)","Derneburg(Han)","Desenice","Desenzano del Garda/Sirmione","Desio","Dessau Adria","Dessau Hbf","Dessau Süd","Dessau-Alten","Dessau-Mosigkau","Dessau-Waldersee","Detmold","Dettelbach Bahnhof","Dettenhausen","Dettingen Freibad","Dettingen Gsaidt","Dettingen Lehen","Dettingen(Main)","Dettingen(Teck)","Dettingen-Mitte","Dettum","Dettwiller","Deuben(Zeitz)","Deuerling","Deurne","Deuten","Deutzen","Deva","Deventer","Deventer Colmschate","Devinska Nova Ves","Diano Marina","Didam","Diebach","Dieburg","Diedelsheim","Diedorf(Schwab)","Diemen","Diemen Zuid","Diemeringen","Dienheim","Diepenbeek","Diepholz","Dieren","Dieskau","Diessenhofen","Diessenhofen URh","Dietersheim","Dietlikon","Dietmannsried","Dietzelbach","Dietzenbach Bahnhof","Dietzenbach Mitte","Dietzenbach-Steinberg","Dietzhausen","Dieulouard","Diez","Diez Ost","Dießen","Differdange","Dijon Porte Neuve","Dijon Ville","Dillbrecht","Dillenburg","Dillingen(Donau)","Dillingen(Saar)","Dingolfing","Dinkelsbühl Bf","Dinkelscherben","Dinslaken","Dippach-Reckange","Dippoldiswalde","Dirmingen","Dissen-Bad Rothenfelde","Distelhausen","Ditfurt","Dittersbach","Dittersdorf","Dittigheim","Ditzingen","Dobbiaco/Toblach","Doberlug-Kirchhain","Doberschütz","Dobova","Dobova(Gr)","Dodendorf","Dodenhof","Doestrup(Soenderjylland) st","Doetinchem","Doetinchem De Huet","Dogern","Dohna(Sachs)","Doksy","Dole Ville","Dolhain-Gileppe","Dollbergen","Dollern","Dollnstein","Dolni Habartice","Dolni Podluzi","Dolni Poustevna","Dolni Zleb","Dolni Zleb zast.","Domazlice","Dombühl","Dommeldange","Domnitz(Saalkr)","Domodossola","Domsühl","Donaueschingen","Donaueschingen Allmendshofen","Donaueschingen Aufen","Donaueschingen Grüningen","Donaueschingen Mitte/Siedlung","Donauwörth","Dordrecht","Dordrecht Stadspolders","Dordrecht Zuid","Dorf Mecklenburg","Dorfchemnitz","Dorfen Bahnhof","Dorfgastein","Dorfmark","Dorfprozelten","Dorheim(Wetterau)","Dormagen","Dormagen Chempark","Dornbirn","Dornbirn Schoren","Dornburg(Saale)","Dornstetten","Dornstetten-Aach","Dorsten","Dortelweil","Dortmund Hbf","Dortmund Knappschaftskrankenhaus","Dortmund Möllerbrücke","Dortmund Signal Iduna Park","Dortmund Stadthaus","Dortmund Tierpark","Dortmund Universität","Dortmund West","Dortmund-Aplerbeck","Dortmund-Aplerbeck Süd","Dortmund-Asseln Mitte","Dortmund-Barop","Dortmund-Brackel","Dortmund-Bövinghausen","Dortmund-Derne","Dortmund-Dorstfeld","Dortmund-Dorstfeld Süd","Dortmund-Germania","Dortmund-Huckarde","Dortmund-Huckarde Nord","Dortmund-Hörde","Dortmund-Kirchderne","Dortmund-Kirchhörde","Dortmund-Kley","Dortmund-Kruckel","Dortmund-Kurl","Dortmund-Körne","Dortmund-Körne West","Dortmund-Löttringhausen","Dortmund-Lütgendortmund","Dortmund-Lütgendortmund Nord","Dortmund-Marten","Dortmund-Marten Süd","Dortmund-Mengede","Dortmund-Nette/Oestrich","Dortmund-Oespel","Dortmund-Rahm","Dortmund-Scharnhorst","Dortmund-Somborn","Dortmund-Sölde","Dortmund-Westerfilde","Dortmund-Wickede","Dortmund-Wickede West","Dortmund-Wischlingen","Dorum(Weserm)","Dossow(Prign)","Dottenheim","Dotternhausen-Dormettingen","Dottikon-Dintikon","Dourges","Drahnsdorf","Drahtzug","Drauffelt","Drebkau","Drei Annen Hohne","Dreieich-Buchschlag","Dreieich-Dreieichenhain","Dreieich-Götzenhain","Dreieich-Offenthal","Dreieich-Sprendlingen","Dreieich-Weibelfeld","Dreikirchen","Dreileben-Drackenstedt","Drensteinfurt","Dresden Bischofsplatz","Dresden Flughafen","Dresden Freiberger Straße","Dresden Grenzstraße","Dresden Hbf","Dresden Industriegelände","Dresden Mitte","Dresden-Cotta","Dresden-Dobritz","Dresden-Friedrichstadt","Dresden-Kemnitz","Dresden-Klotzsche","Dresden-Neustadt","Dresden-Niedersedlitz","Dresden-Pieschen","Dresden-Plauen","Dresden-Reick","Dresden-Stetzsch","Dresden-Strehlen","Dresden-Trachau","Dresden-Zschachwitz","Dreye","Driebergen-Zeist","Driehuis","Drohndorf-Mehringen","Dronryp","Dronten","Duchcov","Ducherow","Duckterath","Dudweiler","Dugo Selo","Duisburg Entenfang","Duisburg Hbf","Duisburg-Buchholz","Duisburg-Großenbaum","Duisburg-Hochfeld Süd","Duisburg-Meiderich Ost","Duisburg-Meiderich Süd","Duisburg-Obermeiderich","Duisburg-Rahm","Duisburg-Ruhrort","Duisburg-Schlenk","Duisburg-Wedau","Duiven","Duivendrecht","Dunkerque","Durach","Durlach Hubstraße, Karlsruhe","Durlach Untermühlstraße, Karlsruhe","Durlacher Tor/KIT-Campus Süd, Karlsruhe","Durmersheim","Durmersheim Nord","Dutenhofen(Wetzlar)","Dußlingen","Dyreby st","Däniken","Döbeln Hbf","Döberitz","Döggingen","Döhlau","Döllstädt","Dörfles-Esbach","Dörpen","Dörrberg","Dörverden","Döttingen","Dülken","Dülmen","Düren","Düren Annakirmesplatz","Düren Im Großen Tal","Düren Renkerstraße","Düren-Kuhbrücke","Düren-Lendersdorf","Dürrenbüchig","Dürrnhaar","Dürrröhrsdorf","Düsseldorf Flughafen","Düsseldorf Flughafen Terminal","Düsseldorf Friedrichstadt","Düsseldorf Hbf","Düsseldorf Volksgarten","Düsseldorf Völklinger Str.","Düsseldorf Wehrhahn","Düsseldorf-Benrath","Düsseldorf-Bilk","Düsseldorf-Derendorf","Düsseldorf-Eller","Düsseldorf-Eller Mitte","Düsseldorf-Eller Süd","Düsseldorf-Flingern","Düsseldorf-Garath","Düsseldorf-Gerresheim","Düsseldorf-Hamm","Düsseldorf-Hellerhof","Düsseldorf-Oberbilk","Düsseldorf-Rath","Düsseldorf-Rath Mitte","Düsseldorf-Reisholz","Düsseldorf-Unterrath","Düsseldorf-Zoo","Dütschow","Ebbsfleet International Eurostar","Ebelsbach-Eltmann","Eben im Pongau","Ebenfurth","Ebenhausen(Unterfr)","Ebenhausen-Schäftlarn","Ebenhofen","Ebensfeld","Eberbach","Ebermannstadt","Ebermergen","Ebern","Ebersbach(Fils)","Ebersbach(Sachs)","Ebersberg(Oberbay)","Ebersbrunn","Ebersdorf(b Coburg)","Ebersheim","Eberswalde Hbf","Ebertsheim","Ebing","Ebringen","Ebstorf(Uelzen)","Echem","Eching","Echt","Echterdingen","Echzell","Eckardtsleben","Eckartsberga(Thür)","Eckartshausen-Ilshofen","Eckenerstraße, Karlsruhe","Eckernförde","Eckersmühlen","Eddersheim","Ede Centrum","Ede(B)","Ede-Wageningen","Edelfingen","Edenkoben","Edermünde-Grifte","Edesheim(Pfalz)","Ediger-Eller","Edingen(Wetzlar)","Edle Krone","Edling","Eemshaven","Effelder(Thür)","Effolderbach","Effretikon","Efringen-Kirchen","Egelsbach","Egersdorf","Egestorf(Deister)","Eggenfelden","Eggenfelden Mitte","Eggenstein Bf","Eggenstein Schweriner Straße, Eggenstein-Leopoldsh","Eggenstein Spöcker Weg, Eggenstein-Leopoldshafen","Eggenstein Süd, Eggenstein-Leopoldshafen","Eggersdorf","Eggesin","Eggingen","Egglkofen","Eggmühl","Eggolsheim","Eglharting","Egling","Eglisau","Egnach","Ehingen(Donau)","Ehlenbruch","Ehlershausen","Ehningen(b Böblingen)","Ehr","Ehrang","Ehrang Ort","Ehringen","Ehringhausen(Kr Lippstadt)","Ehringshausen(Kr Wetzlar)","Ehringshausen(Oberhess)","Ehrwald Zugspitzbahn","Eibau","Eich(Sachs)","Eichen(Kr Siegen)","Eichenau(Oberbay)","Eichenberg","Eichenzell","Eichhagen","Eicholzheim","Eichstedt(Altm)","Eichstetten am Kaiserstuhl","Eichstätt Bahnhof","Eichstätt Stadt","Eichwalde","Eickendorf","Eijsden","Eilenburg","Eilenburg Ost","Eilendorf","Eilsleben(b Magdeburg)","Eilvese","Eimeldingen","Einbeck Mitte","Einbeck Otto-Hahn-Straße","Einbeck-Salzderhelden","Eindhoven Centraal","Eindhoven Strijp-S","Einfeld","Einsiedel","Einsiedel Brauerei","Einsiedel Hp Gymnasium","Einsiedeln","Einsiedlerhof","Einöd(Saar)","Eisemroth","Eisenach","Eisenach Opelwerke Hp","Eisenach West","Eisenberg(Pfalz)","Eisenheim","Eisenhüttenstadt","Eisenärzt","Eiserfeld(Sieg)","Eisfeld","Eisfelder Talmühle","Eislingen(Fils)","Eiswoog","Eitensheim","Eitorf","Elend","Elfershausen-Trimberg","Elgersburg","Ellefeld","Ellental","Ellerau","Ellhofen","Ellingen(Bay)","Ellrich","Ellwangen","Ellzee","Elmenhorst","Elmshorn","Elne","Elpersheim","Elsbethen","Elsfleth","Elsholz","Elsnigk(Anh)","Elst","Elstal","Elster(Elbe)","Elsterberg","Elsterberg-Kunstseidenwerk","Elsterwerda","Elsterwerda-Biehla","Eltersdorf","Eltville","Elxleben","Elz(Limburg/Lahn)","Elz(Limburg/Lahn) Süd","Elzach","Elze(Han)","Emden Außenhafen","Emden Hbf","Emmelshausen","Emmen Zuid","Emmen(NL)","Emmenbrücke","Emmendingen","Emmerich","Emmerich-Elten","Emmerke","Emmerthal","Empel-Rees","Empelde","Emsdetten","Emskirchen","Endersbach","Endingen am Kaiserstuhl","Endingen(Württ)","Engeln","Engelskirchen","Engen","Engers","Engertsham","Engis","Engstingen","Engstingen Schulzentrum","Engstlatt","Enkenbach","Enkhuizen","Ennepetal","Enns","Enschede","Enschede De Eschmarke","Enschede Kennispark","Ensdorf(Saar)","Enspel","Entenfang, Karlsruhe","Entringen","Enzberg","Enzisweiler","Epe(Westf)","Epernay","Epierre-St Leger","Epinal","Eppelborn","Eppelsheim(Rheinhess)","Eppertshausen","Eppingen","Eppingen West","Eppstein","Eppstein-Bremthal","Erbach(Odenw)","Erbach(Odenw) Nord","Erbach(Rheingau)","Erbach(Württ)","Erbprinz/Schloss, Ettlingen","Erdeborn","Erding","Erdmannhausen","Erdmannsdorf-Augustusburg","Erdweg","Erftstadt","Erfurt Hbf","Erfurt Nord","Erfurt Ost","Erfurt-Bischleben","Erfurt-Gispersleben","Ergenzingen","Ergoldsbach","Ergste","Eriskirch","Erkelenz","Erkersreuth","Erkner","Erkner (S)","Erkrath","Erkrath-Nord","Erla","Erlabrunn(Erzgeb)","Erlangen","Erlangen Paul-Gossen-Straße","Erlangen-Bruck","Erlau(Sachs)","Erlen","Erlenbach(Main)","Ermatingen","Ermatingen URh","Ermelo","Erndtebrück","Ernsgaden","Ernsthausen","Ernstthal am Rennsteig","Erpel(Rhein)","Erpolzheim","Erquelinnes","Ersingen","Ersingen West","Erstein","Erstfeld","Erzhausen","Erzingen(Baden)","Erzingen(Württ)","Esbjerg st","Esch-sur-Alzette","Eschborn","Eschborn Süd","Eschede","Eschelbronn","Eschenau(Mittelfr)","Eschenau(b Heilbronn)","Eschenau/Salzach","Eschenbach(b Markt Erlbach)","Eschenlohe","Escherndorf-Vogelsburg","Eschhofen","Eschwege","Eschwege-Niederhone","Eschweiler Hbf","Eschweiler Talbahnhof","Eschweiler-Nothberg","Eschweiler-St.Jöris","Eschweiler-Weisweiler","Eschweiler-West","Esens(Ostfriesl)","Espelkamp","Espenau-Mönchehof","Essel","Essen Hbf","Essen Stadtwald","Essen Süd","Essen West","Essen(B)","Essen(Oldb)","Essen-Altenessen","Essen-Bergeborbeck","Essen-Borbeck","Essen-Borbeck Süd","Essen-Dellwig","Essen-Dellwig Ost","Essen-Eiberg","Essen-Frohnhausen","Essen-Gerschede","Essen-Holthausen","Essen-Horst","Essen-Hügel","Essen-Kray Nord","Essen-Kray Süd","Essen-Kupferdreh","Essen-Steele","Essen-Steele Ost","Essen-Werden","Essen-Zollverein Nord","Essen-Überruhr","Essenweinstraße, Karlsruhe","Esslingen(Neckar)","Esslingen-Mettingen","Esslingen-Zell","Esting","Etampes","Etelsen","Ettelbruck","Etten-Leur","Ettenhausen","Etterzhausen","Ettlingen Stadt","Ettlingen West","Etzbach","Etzelwang","Etzenbach","Etzenricht","Etzenrot","Etzleben","Etzwilen","Eubigheim","Euerdorf","Eupen","Europaplatz/Postgal. (Kaiser), Karlsruhe","Euskirchen","Euskirchen Zuckerfabrik","Euskirchen-Großbüllesheim","Euskirchen-Kreuzweingarten","Euskirchen-Kuchenheim","Euskirchen-Stotzheim","Eutin","Eutingen Nord","Eutingen im Gäu","Eutingen(Baden)","Evreux Normandie","Eyach","Eygelshoven","Eygelshoven Markt","Eystrup","Eßleben","Faak am See","Fachingen(Lahn)","Fahrenkrug","Fahrnau","Faido","Falkenau(Sachs)Hp","Falkenau(Sachs)Süd","Falkenberg(Elster)","Falkenberg(Mark)","Falkenhagen Gewerbepark Prignitz","Falkensee","Falkenstein(Vogtl)","Fallersleben","Fangschleuse","Farchant","Fasanenpark","Faulbach(Main)","Faulquemont","Faurndau","Favoritepark","Feanwalden","Fegersheim Lipsheim","Fehmarn-Burg","Fehraltorf","Fehring","Feilitzsch","Feldafing","Feldbach/Raab","Feldberg(Meckl)","Feldberg-Bärental","Felde","Feldhausen","Feldkirch","Feldkirch Amberg","Feldkirchen in Kärnten","Feldkirchen(b München)","Feldolling","Felixdorf","Fellbach","Felsberg-Altenbrunslar","Felsberg-Gensungen","Felsberg-Wolfershausen","Ferch-Lienewitz","Ferdinandshof","Fermerswalde","Ferndorf(Siegen)","Ferrara","Feucht","Feucht Ost","Feucht-Moosbach","Feudingen","Fichtenberg","Fieberbrunn","Figueres","Filderstadt","Filisur","Filsen","Finale Ligure Marina","Finkenheerd","Finkenkrug","Finnentrop","Finningerstraße","Finsterwald","Finsterwalde(Niederlausitz)","Firenze S.M.N.","Fischbach(Nürnberg)","Fischbach-Camphausen","Fischbach-Weierbach","Fischbachau","Fischen","Fischhaus","Fischhausen-Neuhaus","Fischweier, Karlsbad","Flamatt","Flassa","Flaurling","Flechtingen","Fleetmark","Flehingen","Flensburg","Flensburg-Weiche","Flers","Flieden","Flintbek","Flintsbach","Flomersheim","Floßmühle","Flughafen BER - Terminal 1-2","Flughafen BER - Terminal 1-2 (S-Bahn)","Flughafen BER - Terminal 5 (Schönefeld)","Flughafen Wien","Flums","Flöha","Flöha-Plaue","Flörsheim(Main)","Flüelen","Fohrde","Fontaine","Fontainebleau-Avon","Fontan Saorge","Forbach(F)","Forbach(Schwarzw)","Forchheim Hallenbad, Rheinstetten","Forchheim Hauptstraße, Rheinstetten","Forchheim Leichtsandstr./Messe Karlsruhe, Rheinste","Forchheim Leichtsandstraße/Messe Karlsruhe, Rheins","Forchheim Oberfeldstraße, Rheinstetten","Forchheim(Oberfr)","Forchheim(b Karlsruhe)","Forest Midi/Vorst Zuid","Fornsbach","Forst(Lausitz)","Forstfeldstraße, Kassel","Forsthaus","Forsting","Fortezza/Franzensfeste","Forth","Fossano","Fourchambault","Frahelsbruck","Fraipont","Franeker","Frankenberg(Eder)","Frankenberg(Sachs)","Frankenberg(Sachs) Süd","Frankenberg-Goßberg","Frankenberg-Viermünden","Frankenmarkt","Frankenstein(Pfalz)","Frankenstein(Sachs)","Frankenthal Hbf","Frankenthal Süd","Frankfurt Hbf (tief)","Frankfurt am Main - Stadion","Frankfurt(M) Flughafen Fernbf","Frankfurt(M) Flughafen Regionalbf","Frankfurt(M)Galluswarte","Frankfurt(M)Hauptwache","Frankfurt(M)Konstablerwache","Frankfurt(M)Lokalbahnhof","Frankfurt(M)Mühlberg","Frankfurt(M)Ostendstraße","Frankfurt(M)Stresemannallee","Frankfurt(M)Taunusanlage","Frankfurt(Main) Stresemannallee/Mörfelder Landstr","Frankfurt(Main)-Gateway Gardens","Frankfurt(Main)Hbf","Frankfurt(Main)Messe","Frankfurt(Main)Ost","Frankfurt(Main)Süd","Frankfurt(Main)West","Frankfurt(Oder)","Frankfurt(Oder)-Neuberesinchen","Frankfurt(Oder)-Rosengarten","Frankfurt-Berkersheim","Frankfurt-Eschersheim","Frankfurt-Frankfurter Berg","Frankfurt-Griesheim","Frankfurt-Höchst","Frankfurt-Höchst Farbwerke","Frankfurt-Louisa","Frankfurt-Mainkur","Frankfurt-Nied","Frankfurt-Niederrad","Frankfurt-Rödelheim","Frankfurt-Sindlingen","Frankfurt-Sossenheim","Frankfurt-Unterliederbach","Frankfurt-Zeilsheim","Frankleben","Frantiskovy Lazne","Frantiskovy Lazne Aquaforum","Frastanz","Frauenalb-Schielberg","Frauenau","Frauenfeld","Frauenhain","Frechen-Königsdorf","Freckleben","Freden(Leine)","Fredenbeck","Fredericia st","Fredersdorf(b Berlin)","Freiberg(Neckar)","Freiberg(Sachs)","Freiburg Klinikum","Freiburg Messe/Universität","Freiburg(Breisgau) Hbf","Freiburg-Herdern","Freiburg-Landwasser","Freiburg-Littenweiler","Freiburg-St Georgen","Freiburg-Wiehre","Freiburg-Zähringen","Freienbach SBB","Freienohl","Freienorla","Freihalden","Freihung","Freihöls","Freilassing","Freilassing-Hofham","Freimersheim(Rheinh)","Freinsheim","Freising","Freital-Coßmannsdorf","Freital-Deuben","Freital-Hainsberg","Freital-Hainsberg West","Freital-Potschappel","Frellstedt","Frelsdorf","Fremdingen Bf","Fremersdorf","Frenkendorf-Füllinsdorf","Frenz","Fresenburg","Fretzdorf","Freudenberg-Kirschfurt","Freudenstadt Hbf","Freudenstadt Industriegebiet","Freudenstadt Schulzentrum","Freudenstadt Stadt","Freusburg Siedlung","Freyburg(Unstrut)","Freyung Bf","Fribourg/Freiburg","Frickenhausen","Frickenhausen Kelterstraße","Frickhofen","Fridingen(b Tuttlingen)","Fridolfing","Friedberg Süd","Friedberg(Augsburg)","Friedberg(Hess)","Friedelhausen","Friedensdorf(Lahn)","Friedersdorf(Königs Wusterhausen)","Friedewald(Kr Dresden) Bad","Friedewald(Kr Dresden)Hp","Friedland(Han)","Friedrich Wilhelmshütte","Friedrichroda","Friedrichsdorf(Taunus)","Friedrichsfeld(Niederrhein)","Friedrichsgabe","Friedrichshafen Flughafen","Friedrichshafen Hafen","Friedrichshafen Landratsamt","Friedrichshafen Ost","Friedrichshafen Stadt","Friedrichshafen-Fischbach","Friedrichshafen-Kluftern","Friedrichshafen-Manzell","Friedrichshöhe","Friedrichsplatz, Kassel","Friedrichsruhe(Meck)","Friedrichssegen","Friedrichstadt","Friedrichstal Mitte, Stutensee","Friedrichstal Nord, Stutensee","Friedrichstal Saint-Riquier-Platz, Stutensee","Friedrichstal b Freudenstadt","Friedrichstal(Baden)","Friedrichsthal(Saar)","Friedrichsthal(Saar) Mitte","Friedrichsthal(b Bayreuth)","Friedrichswalde(bei Eberswalde)","Friesach in Kärnten","Friesack(Mark)","Friesdorf","Friesdorf Ost","Friesenheim(Baden)","Frimmersdorf","Frisvadvej st","Fritzens-Wattens","Fritzlar","Frohburg","Frommern","Fronhausen(Lahn)","Frontenex","Frose","Frouard","Frutigen","Frömern","Fröndenberg","Fröttstädt","Fulda","Fuldatal-Ihringshausen","Furschenbach","Furth im Wald","Furth(b Deisenhofen)","Futuroscope","Fährbrücke","Föderlach","Föhren","Förbau","Förderstedt","Förtha(Eisenach)","Förtschendorf","Fürfurt","Fürnitz","Fürstenberg(Havel)","Fürsteneck","Fürstenfeldbruck","Fürstenwald","Fürstenwalde Süd","Fürstenwalde(Spree)","Fürstenzell","Fürth Westvorstadt","Fürth(Bay)Hbf","Fürth(Odenw)","Fürth-Burgfarrnbach","Fürth-Dambach","Fürth-Unterfarrnbach","Fürth-Unterfürberg","Füssen","Gaanderen","Gablingen","Gadebusch","Gaggenau Bf","Gaggenau Mercedes-Benz Werk","Gagny","Gaildorf West","Gaillon Aubevoye","Gaimersheim","Gaißach","Gallarate","Gamburg(Tauber)","Gammertingen","Gammertingen Europastraße","Gampel-Steg","Ganderkesee","Gandrange-Amneville","Gangloffsömmern","Gannat","Ganzlin","Garbeck","Garbenteich","Garching(Alz)","Gardanne","Gardelegen","Garding","Garftitz","Garmisch-Partenkirchen","Garmisch-Partenkirchen Hausberg","Gars(Inn)","Gatersleben","Gau Algesheim","Gau Bickelheim","Gaubüttelbrunn","Gausbach","Gauselfingen","Gauting","Gdansk Glowny","Gdansk Oliwa","Gdansk Wrzeszcz","Gdynia Glowna","Gebersdorf","Gebra(Hainleite)","Geeste","Geestenseth","Geestgottberg","Gehlberg","Geigant","Geilenkirchen","Geilhausen","Geinberg","Geiselhöring","Geisenbrunn","Geisenhausen","Geisenheim","Geising","Geisingen","Geisingen-Aulfingen","Geisingen-Hausen","Geisingen-Kirchen","Geisingen-Leipferdingen","Geislingen(Steige)","Geislingen(Steige)West","Geitau","Geithain","Gelbensande","Geldermalsen","Geldern","Geldrop","Geleen Oost","Geleen-Lutterade","Gelnhausen","Gelsenkirchen Hbf","Gelsenkirchen Zoo","Gelsenkirchen-Buer Nord","Gelsenkirchen-Buer Süd","Gelsenkirchen-Hassel","Gelsenkirchen-Rotthausen","Geltendorf","Gelterkinden","Gemmingen","Gemmingen West","Gemona del Friuli","Gemünden(Main)","Genderkingen","Gendorf","Gengenbach","Genk","Gennweiler","Genova Piazza Principe","Gensingen-Horrweiler","Gent St Pieters","Gent-Dampoort","Gentbrugge","Genthin","Genève","Genève-Aéroport","Georgensgmünd","Gera Hbf","Gera Süd","Gera-Langenberg","Gera-Zwötzen","Geraberg","Geradstetten","Gerhausen","Gerichshain","Gerlachsheim","Gerlafingen","Gerlenhofen","Gerling im Pinzgau","Germering-Unterpfaffenhofen","Germersheim","Germersheim Mitte/Rhein","Germersheim Süd/Nolte","Gernlinden","Gernrode(Harz)","Gernrode-Niederorschel","Gernsbach Bf","Gernsbach Mitte","Gernsheim","Geroldshausen","Gerolstein","Gersdorf(Görlitz)","Gersfeld(Rhön)","Gerstetten","Gersthofen","Gerstungen","Gertenbach","Gerwisch","Geseke","Gessertshausen","Gettenau-Bingenheim","Gettorf","Gevelsberg Hbf","Gevelsberg West","Gevelsberg-Kipp","Gevelsberg-Knapp","Gevrey-Chambertin","Giengen(Brenz)","Giersleben","Gießen","Gießen Erdkauter Weg","Gießen Licher Str","Gießen Oswaldsgarten","Gießenbach in Tirol","Gifhorn","Gifhorn Stadt","Gilching-Argelsried","Gildenhall","Gilze-Rijen","Gingen(Fils)","Girod","Girona","Gisikon-Root","Gisors Embranchement","Gittelde/Bad Grund(Harz)","Giubiasco","Gjesing st","Gladbeck Ost","Gladbeck West","Gladbeck-Zweckel","Glan-Münchweiler","Glanerbrug","Glanzstoffwerke","Glashütte(Sachs)","Glattbrugg","Glattfelden","Glaubitz(Riesa)","Glauburg-Glauberg","Glauburg-Stockheim","Glauchau(Sachs)","Glauchau-Schönbörnchen","Gleisdorf","Glesch","Gloggnitz","Glossen(b Oschatz)","Glöwen","Glückauf","Glückstadt","Gmund(Tegernsee)","Gmünd NÖ","Gnadau","Gnarrenburg","Gnarrenburg Nord","Gnevkow","Gniezno","Goch","Gochsheim(Baden)","Godramstein","Goebelsmühle","Goes","Gokels","Goldbeck(Osterburg)","Goldberg(Württ)","Goldenstedt(Oldb)","Goldhausen","Goldshöfe","Golling-Abtenau","Gollmitz(Niederlausitz)","Golm","Golzow(Eberswalde)","Golzow(Oderbruch)","Golßen(Niederlausitz)","Gomadingen","Gommern","Gondelsheim Schlossstadion","Gondelsheim(Baden)","Goor","Goppenstein","Gorgast","Gorinchem","Gosberg","Goslar","Gossau SG","Gotha","Gotha Ost","Gottenheim","Gottesauer Platz/BGV, Karlsruhe","Gotteszell","Gottlieben (Schifflände)","Gottmadingen","Gouda","Gouda Goverwelle","Gouvy","Goßdorf-Kohlmühle","Goßfelden","Goßmannsdorf","Graal-Müritz","Graal-Müritz Koppelweg","Graben(Lechfeld)Gewerbepark","Graben-Neudorf","Graben-Neudorf Nord","Grabow(Meckl)","Grafenaschau","Grafenau","Grafenwiesen","Graffenstaden","Grafing Bahnhof","Grafing Stadt","Grafling-Arzting","Grafrath","Gramatneusiedl","Grambow","Gramsbergen","Granollers","Gransee","Gratwein-Gratkorn","Grauschwitz Flocke","Graz Hbf","Graz Ostbahnhof-Messe","Grebenstein","Gredstedbro st","Greifswald","Greifswald Süd","Greiz","Greiz-Dölau","Grenchen Nord","Grenoble","Grenzach","Greppin","Gresy-sur-Isere","Gretz-Armainvilliers","Greußen","Greven","Grevenbroich","Grevesmühlen","Grieben(Meckl)","Griebo","Griefstedt","Gries am Brenner","Gries im Pinzgau","Griesen(Oberbay)","Grieskirchen-Gallspach","Grießen(Baden)","Grijpskerk","Grimma ob Bf","Grimmen","Grimmenthal","Grobau","Groenendaal","Grombach","Gronau(Westf)","Groningen","Groningen Europapark","Groningen Noord","Gronsdorf","Grou-Jirnsum","Groß Ammensleben","Groß Behnitz","Groß Brütz","Groß Düngen","Groß Gerau","Groß Gerau-Dornberg","Groß Gerau-Dornheim","Groß Karben","Groß Kiesow","Groß Kreutz","Groß Köris","Groß Laasch","Groß Lüsewitz","Groß Pankow","Groß Quassow","Groß Rohrheim","Groß Schwaß","Groß Schönebeck","Groß-Umstadt Klein-Umstadt","Groß-Umstadt Mitte","Groß-Umstadt Wiebelsbach","Großarmschlag","Großauheim(Kr Hanau)","Großbeeren","Großbodungen","Großbothen","Großburgwedel","Großdeuben","Großen Buseck","Großen Linden","Großenaspe","Großenbrode","Großengottern","Großenhain Cottb Bf","Großenkneten","Großenlüder","Großfurra","Großgeschaidt","Großharthau","Großhelfendorf","Großheringen","Großhesselohe Isartalbf","Großkarolinenfeld","Großkorbetha","Großkrotzenburg","Großkugel","Großlehna","Großneuhausen","Großpösna","Großrudestedt","Großräschen","Großröhrsdorf","Großschwabhausen","Großschönau(Sachs)","Großsteinberg","Großwalbur","Großwudicke","Grub am Forst","Grub(Oberbay)","Grub(Oberpf)","Grunbach","Grunow(Niederlausitz)","Gräfelfing","Gräfenberg","Gräfendorf","Gräfenhainichen","Gräfenroda","Gräfenstuhl-Klippmühle","Gräfentonna","Gräveneck","Grävenwiesbach","Gröbenzell","Gröbers","Gröbming","Gröditz(Riesa)","Grötzingen","Grötzingen Krappmühlenweg","Grötzingen Oberausstraße","Grüna(Sachs)Hp","Grünbach(Vogtl)","Grünberg(Oberhess)","Grünebach Ort","Grünebacherhütte","Grüneberg","Grünhainichen-Borstendorf","Grünsfeld","Grünstadt","Grünstadt Nord","Grüntal-Wittlensweiler","Gstadt(Wanderbahn)","Guben","Guldager st","Gummersbach","Gummersbach-Dieringhausen","Gumpenried-Asbach","Gundelfingen(Bay)","Gundelfingen(Breisgau)","Gundelsdorf","Gundelshausen","Gundelsheim(Neckar)","Gundersheim(Rheinhess)","Guntersblum","Guntramsdorf Kaiserau","Gunzenhausen","Gurten OÖ","Gussenstadt","Gustorf","Gutach Freilichtmuseum","Gutach(Breisgau)","Gutenfürst","Guthmannshausen","Guxhagen","Györ","Gänserndorf","Gärtringen","Gäufelden","Göbelnrod","Göhrde","Göhren(Rügen)","Göllheim-Dreisen","Gölshausen","Gölshausen Industriegebiet","Göppingen","Görden","Görlitz","Görlitz-Rauschwalde","Görlitz-Weinhübel","Görsbach","Görschnitz","Göschenen","Götschendorf","Göttingen","Götz","Götzendorf/Leitha","Götzis","Gößnitz","Güdingen","Gültstein","Gündlkofen","Güntersberge","Günzach","Günzburg","Güsen(b Genthin)","Güsten","Güstrow","Güterglück","Gütersloh Hbf","Güttingen","Haaltert","Haan","Haan-Gruiten","Haar","Haarhausen","Haarlem","Haarlem Spaarnwoude","Hachenburg","Hadamar","Hademarschen","Hademstorf","Hadmersleben","Haffkrug","Hagebök","Hagelstadt","Hagen Hbf","Hagen(Han)","Hagen(Kr. Stade)","Hagen-Heubing","Hagen-Oberhagen","Hagen-Vorhalle","Hagen-Wehringhausen","Hagen-Westerbauer","Hagenau im Innkreis","Hagenbach","Hagenbüchach","Hagenow Land","Hagenow Stadt","Hagenwerder","Hagondange","Hagsfeld Bahnhof, Karlsruhe","Hagsfeld Geroldsäcker, Karlsruhe","Hagsfeld Jenaer Straße, Karlsruhe","Hagsfeld Reitschulschlag (Schleife), Karlsruhe","Hagsfeld Reitschulschlag, Karlsruhe","Hagsfeld Süd, Karlsruhe","Haguenau","Haidenaab-Göppmannsbühl","Haidkapelle","Haiger","Haiger Obertor","Haigerloch","Hailer-Meerholz","Haiming","Hainburg Hainstadt","Hainewalde","Hainichen","Hainstadt(Baden)","Haitz-Höchst","Halbe","Halberstadt","Halberstadt Oststr","Halberstadt-Spiegelsberge","Halbmeil","Haldensleben","Haldern(Rheinl)","Halen","Halfing","Halfweg-Zwanenburg","Halitplatz, Kassel","Hall in Tirol","Hallbergmoos","Halle Dessauer Brücke","Halle Messe","Halle Rosengarten","Halle Steintorbrücke","Halle Südstadt","Halle Wohnstadt Nord","Halle Zoo","Halle Zscherbener Straße","Halle(S) Heidebf","Halle(Saale)Hbf","Halle(Westf)","Halle(Westf) OWL-Arena","Halle-Ammendorf","Halle-Neustadt","Halle-Nietleben","Halle-Silberhöhe","Halle-Trotha","Hallein","Hallstadt(b Bamberg)","Hallwang-Elixhausen","Halstenbek","Haltern am See","Haltingen","Halver-Oberbrügge","Hamburg Airport","Hamburg Alte Wöhr","Hamburg Berliner Tor","Hamburg Billwerder-Moorfleet","Hamburg Burgwedel","Hamburg Dammtor","Hamburg Diebsteich","Hamburg Elbbrücken","Hamburg Elbgaustraße","Hamburg Friedrichsberg","Hamburg Hasselbrook","Hamburg Hbf","Hamburg Hbf (S-Bahn)","Hamburg Hochkamp","Hamburg Hoheneichen","Hamburg Holstenstraße","Hamburg Jungfernstieg","Hamburg Klein Flottbek","Hamburg Kornweg(Klein Borstel)","Hamburg Königstraße","Hamburg Landungsbrücken","Hamburg Landwehr","Hamburg Mittlerer Landweg","Hamburg Neuwiedenthal","Hamburg Reeperbahn","Hamburg Rübenkamp","Hamburg Stadthausbrücke","Hamburg Wandsbeker Chaussee","Hamburg-Allermöhe","Hamburg-Altona","Hamburg-Altona(S)","Hamburg-Bahrenfeld","Hamburg-Barmbek","Hamburg-Bergedorf","Hamburg-Blankenese","Hamburg-Eidelstedt","Hamburg-Eidelstedt Zentrum","Hamburg-Fischbek","Hamburg-Hammerbrook","Hamburg-Harburg","Hamburg-Harburg Rathaus","Hamburg-Harburg(S)","Hamburg-Heimfeld","Hamburg-Hörgensweg","Hamburg-Iserbrook","Hamburg-Langenfelde","Hamburg-Nettelnburg","Hamburg-Neugraben","Hamburg-Ohlsdorf","Hamburg-Othmarschen","Hamburg-Poppenbüttel","Hamburg-Rahlstedt","Hamburg-Rissen","Hamburg-Rothenburgsort","Hamburg-Schnelsen","Hamburg-Stellingen","Hamburg-Sternschanze","Hamburg-Sülldorf","Hamburg-Tiefstack","Hamburg-Tonndorf","Hamburg-Veddel","Hamburg-Wandsbek","Hamburg-Wellingsbüttel","Hamburg-Wilhelmsburg","Hameln","Hamm(Westf)Hbf","Hamm-Bockum-Hövel","Hamm-Heessen","Hammah","Hammelburg","Hammelburg Ost","Hammelspring","Hammerau","Hammersbach Zugspitzbahn, Grainau","Hammerstein","Hammerunterwiesenthal","Hamminkeln","Hamminkeln-Dingden","Hanau Hbf","Hanau Klein-Auheim","Hanau Nord","Hanau West","Hanau-Wilhelmsbad","Handeloh","Hanfertal","Hangelar Mitte","Hangelsberg","Hann Münden","Hannover Anderten-Misburg","Hannover Bismarckstr.","Hannover Flughafen","Hannover Hbf","Hannover Karl-Wiechert-Allee","Hannover Messe/Laatzen","Hannover-Bornum","Hannover-Kleefeld","Hannover-Ledeburg","Hannover-Leinhausen","Hannover-Linden/Fischerhof","Hannover-Nordstadt","Hannover-Vinnhorst","Hanweiler-Bad Rilchingen","Happurg","Harblek","Harburg(Schwab)","Hard-Fussach","Hardegsen","Hardenberg","Harderwijk","Hardhof","Hardinxveld Blauwe Zoom","Hardinxveld-Giessendam","Haren(Ems)","Haren(NL)","Harlesiel","Harlingen(NL)","Harra","Harra Nord","Harras(Thür)","Harsdorf","Harsefeld","Harsum","Hartenstein","Hartershofen","Harthaus","Hartmannmühle","Hartmannshof","Harzgerode","Hasbergen","Haselbrunn","Haselstauden (Dornbirn)","Haslach","Hasloch(Main)","Hasloh","Haslohfurth","Haspelmoor","Hassel(Saar)","Hasselborn","Hasselfelde","Hasselt","Haste","Hatlerdorf(Dornbirn)","Hattenheim","Hattersheim(Main)","Hattert","Hatting in Tirol","Hattingen(R) Mitte","Hattingen(Ruhr)","Hattorf","Hatzenport","Haubersbronn","Haubersbronn Mitte","Hauenstein Mitte","Hauenstein(Pfalz)","Haunetal-Neukirchen","Haupeltshofen","Hauptfriedhof, Karlsruhe","Hauptfriedhof, Kassel","Hauptstuhl","Hauptwil","Haus Bethlehem, Karlsruhe","Haus im Ennstal","Hausach","Hausen (b Düren)","Hausen i Tal","Hausen(Eichsfeld)","Hausen(Schwab)","Hausen(Taunus)","Hausen-Raitbach","Hausen-Starzeln","Hausham","Havixbeck","Hayange","Haynsburg","Hazebrouck","Haßfurt","Haßloch(Pfalz)","Haßmersheim","Hebertsfelden","Hebertshausen","Hechingen","Hechingen Landesbahn","Hechthausen","Heddesheim/Hirschberg","Hedemünden","Hedersdorf","Hedersleben-Wedderstedt","Heemskerk","Heemstede-Aerdenhout","Heerbrugg","Heerenveen","Heerhugowaard","Heerlen","Heerlen Woonboulevard","Heeze","Hegelsbergstraße, Kassel","Heggen","Hegne","Hegyeshalom","Hegyeshalom(Gr)","Heide(Holst)","Heidelberg Hbf","Heidelberg Orthopädie","Heidelberg-Altstadt","Heidelberg-Kirchheim/Rohrbach","Heidelberg-Pfaffengrund/Wieblingen","Heidelberg-Schlierbach/Ziegelhausen","Heidelberg-Weststadt/Südstadt","Heidelsheim","Heidelsheim Nord","Heidenau","Heidenau Süd","Heidenau-Großsedlitz","Heidenheim","Heidenheim Voithwerk","Heidenheim-Mergelstetten","Heidenheim-Schnaitheim","Heidesheim(Rheinhess)","Heidkrug","Heigenbrücken","Heilbad Heiligenstadt","Heilbr.-Böckingen Berufsschulzentrum","Heilbronn Finanzamt","Heilbronn Friedensplatz","Heilbronn Hans-Rießer-Straße","Heilbronn Harmonie","Heilbronn Harmonie/Hafenmarktpassage","Heilbronn Harmonie/Kunsthalle","Heilbronn Hauptbahnhof/Willy-Brandt-Pl.","Heilbronn Hbf","Heilbronn Industrieplatz","Heilbronn Karlstor","Heilbronn Kaufland","Heilbronn Neckar-Turm/K.-S.-Pl","Heilbronn Pfühlpark","Heilbronn Rathaus","Heilbronn Sülmertor","Heilbronn Technisches Schulzentrum","Heilbronn Theater","Heilbronn Trappensee","Heiligendamm","Heiligengrabe","Heiligenstatt(Obb)","Heiligenstein(Pfalz)","Heiloo","Heilsbronn","Heimbach (Eifel)","Heimbach(Nahe)","Heimbach(Nahe)Ort","Heimenkirch","Heimerdingen","Heimersheim","Heimstetten","Heinebach","Heino","Heinrich-Heine-Straße, Kassel","Heinsberg Kreishaus","Heinsberg(Rheinl)","Heinsberg-Dremmen","Heinsberg-Horst","Heinsberg-Oberbruch","Heinsberg-Porselen","Heinsberg-Randerath","Heinschenwalde","Heinzenhausen","Heitersheim","Heiterwang-Plansee","Heldrungen","Helenesee","Helmbrechts","Helmond","Helmond Brandevoort","Helmond Brouwhuis","Helmond t Hout","Helmsdorf(Pirna)","Helmsheim","Helmstadt(Baden)","Helmstedt","Helpup","Hemmen-Dodewaard","Hemmerde","Hemmersdorf(Saar)","Hemmingen","Hemmoor","Hemsbach","Hemsen(b Soltau)","Hendaye","Hendschiken","Henfenfeld","Hengelo","Hengelo Gezondheidspark","Hengelo Oost","Henin-Beaumont","Henne st","Hennef im Siegbogen","Hennef(Sieg)","Hennen","Hennersdorf(Sachs)","Hennigsdorf (S)","Hennigsdorf(b Berlin)","Henstedt-Ulzburg","Heppenheim(Bergstr)","Herbertingen","Herbertingen Ort","Herbertshofen","Herblingen","Herbolzheim(Breisg)","Herbolzheim(Jagst)","Herborn(Dillkr)","Herbrechtingen","Herchen","Herdecke","Herdorf","Herentals","Herford","Hergatz","Hergenrath","Hergershausen","Heringen(Helme)","Heringsdorf Neuhof","Herlasgrün","Herleshausen Hp","Hermaringen","Hermentingen","Hermsdorf(Dresden)","Hermsdorf-Klosterlausnitz","Herne","Herne-Börnig","Herny","Heroldsberg","Heroldsberg Nord","Herrath","Herrenberg","Herrenberg Zwerchweg","Herrensee","Herrenstraße, Karlsruhe","Herrlingen","Herrlisheim près Colmar","Herrlishöfen","Herrnburg","Herrsching","Hersbruck(l Pegnitz)","Hersbruck(r Pegnitz)","Herstal","Herten(Baden)","Hervest-Dorsten","Herxheim am Berg","Herzberg Schloß","Herzberg(Elster)","Herzberg(Harz)","Herzberg(Mark)","Herzebrock","Herzele","Herzhorn","Herzogenbuchsee","Herzogenburg","Herzogenrath","Herzogenrath-Alt-Merkstein","Herzogenrath-August-Schmidt-Platz","Hesedorf","Heselbach","Hesepe","Hesseln","Hesseneck Kailbach","Hesseneck Schöllenbach","Hessisch Oldendorf","Hetschburg","Hettenhausen","Hettingen(Hohenz)","Hettstedt","Hetzdorf(Flöhatal)","Hetzerath","Heudeber-Danstedt","Heufeld","Heufeldmühle","Heusenstamm","Hiddenhausen-Schweicheln","Hilchenbach","Hildbrandsgrün","Hildburghausen","Hilden","Hilden Süd","Hildesheim Hbf","Hildesheim Ost","Hillegom","Hillnhütten","Hilpertsau","Hilpoltstein","Hilter","Hilversum","Hilversum Media Park","Hilversum Sportpark","Himmelpforten","Himmelreich","Himmelstadt","Hindeloopen","Hinrichssegen","Hinterweidenthal","Hinterweidenthal Ort","Hinterweidenthal Ost","Hinterzarten","Hirsau","Hirschaid","Hirschfelde","Hirschfelden","Hirschhorn(Neckar)","Hirschhorn(Pfalz)","Hirtenweg/Technologiepark, Karlsruhe","Hittfeld","Hitzacker","Hnevice","Hochdahl","Hochdahl-Millrath","Hochdorf(b Horb)","Hochfelden","Hochfilzen","Hochhausen(Tauber)","Hochheim(Main)","Hochneukirch","Hochspeyer","Hochstadt-Marktzeuln","Hochstetten","Hochstetten Altenheim, Linkenheim-Hochstetten","Hochstetten Grenzstraße","Hochstetten(Nahe)","Hochstätten(Pfalz)","Hochwang","Hochzirl","Hockenheim","Hockeroda","Hodenhagen","Hodonin","Hoeilaart","Hoeje Taastrup st","Hoensbroek","Hoevelaken","Hof Hbf","Hof(Münstertal)","Hof-Neuhof","Hofeld","Hofen(b Aalen)","Hoffenheim","Hoffnungsthal","Hofgeismar","Hofgeismar-Hümme","Hofheim (Ried)","Hofheim(Taunus)","Hohegrete","Hohen Neuendorf West","Hohen Neuendorf(b Berlin)","Hohenau","Hohenbrunn","Hohendorf","Hohenebra Ort","Hoheneggelsen","Hohenems","Hohenfichte","Hohenleipisch","Hohenleuben","Hohenlimburg","Hohenpeißenberg","Hohenroda","Hohenschäftlarn","Hohenstadt(Mittelfr)","Hohenstein-Ernstthal","Hohensülzen","Hohenthurm","Hohenwarth","Hohenwarth Campingplatz","Hohenwestedt","Hohenwulsch","Hohndorf Mitte","Holdorf(Meckl)","Holdorf(Oldb)","Hollandsche Rading","Holländische Straße, Kassel","Holländischer Platz/Universität, Kassel","Holm-Seppensen","Holstentherme","Holten","Holtensen/Linderte","Holthusen","Holzdorf(Elster)","Holzdorf(b Weimar)","Holzgerlingen Bf","Holzgerlingen Buch","Holzgerlingen Hülben","Holzhau","Holzhau Skilift","Holzhausen(Kr Siegen)","Holzheim(b Neuss)","Holzkirchen","Holzminden","Holzwickede","Hombourg-Haut","Homburg(Saar)Hbf","Honrath","Hoofddorp","Hoogeveen","Hoogezand-Sappemeer","Hoogkarspel","Hoorn","Hoorn Kersenboogerd","Hopfgarten im Brixental","Hopfgarten im Brixental Berglift","Hopfgarten(Sachs)","Hopfgarten(Weimar)","Hoppecke","Hoppegarten(Mark)","Hoppingen","Hoppstädten(Nahe)","Horb","Horb-Heiligenfeld","Horgen","Horka","Horn(Bodensee)","Horn(Bodensee), SF","Horn-Bad Meinberg","Hornberg(Schwarzw)","Horneburg","Horni Blatna","Horni Dvoriste","Horni Kamenice","Horni Podluzi","Horni Poustevna","Hornstorf","Horovice","Horrem","Horst(Holst)","Horst-Sevenum","Hosena","Houten","Houten Castellum","Houthem-St. Gerlach","Howald","Hoyerswerda","Hoyerswerda-Neustadt","Hoykenkamp","Hradek nad Nisou","Hranice na Morave","Hrebeny","Hubacker","Hubertushöhe","Huchem-Stammeln","Huckstorf","Hude","Hufschlag","Huglfing","Hugstetten","Hulb","Hundsgrün","Hundstadt","Hungen","Huntlosen","Hurdegaryp","Husby","Husum","Huttenheim","Huy(B)","Huzenbach","Hviding st","Hyllerslev st","Häggenschwil-Winden","Hähnichen","Hähnlein-Alsbach","Hämelerwald","Hämerten","Händelstraße, Karlsruhe","Häuserhof","Höchst Hetschbach","Höchst Mümling-Grumbach","Höchst(Odenw)","Höchstädt(Donau)","Höfen(Enz) Bf","Höfen(Enz) Nord","Höfingen","Höhenkirchen-Siegertsbrunn","Höhmühlbach","Höllenthal","Höllriegelskreuth","Höpfling","Hörden","Hörlkofen","Hörpolding","Hörschel Hp","Hörsching","Hörselgau","Hörstel","Hörstmar(Lippe)","Hösbach","Hösel","Höste","Hövelhof","Hövelriege","Höxter Rathaus","Höxter-Godelheim","Höxter-Lüchtringen","Höxter-Ottbergen","Hübschstraße, Karlsruhe","Hückelhoven-Baal","Hüffenhardt","Hüfingen Mitte","Hünfeld","Hüntwangen-Wil","Hürth-Kalscheuren","Hüttau","Hütten","Hüttenbusch","Hüttengrund","Hüttingen","IJlst","Ibach","Ibbenbüren","Ibbenbüren-Esch","Ibbenbüren-Laggenbeck","Ichenhausen","Icking","Idar-Oberstein","Idstein(Taunus)","Iffeldorf","Igel","Igensdorf","Igersheim","Ihringen","Ilawa Glowna","Ilberstedt","Ilfeld","Ilfeld Bad","Ilfeld Neanderklinik","Ilfeld Schreiberwiese","Illertissen","Illesheim","Illingen(Saar)","Illingen(Württ)","Ilmenau","Ilmenau Bad","Ilmenau Pörlitzer Höhe","Ilmenau-Roda","Ilsenburg","Immelborn","Immendingen","Immendingen Mitte","Immendingen Zimmern","Immenhausen","Immenreuth","Immensee","Immensen-Arpke","Immenstadt","Imst-Pitztal","Imsterberg","Imsweiler","Ingelbach","Ingelheim","Ingelmunster","Ingolstadt Audi","Ingolstadt Hbf","Ingolstadt Nord","Ingwiller","Inheiden","Inningen","Innsbruck Hbf","Innsbruck Hötting","Innsbruck Westbahnhof","Inowroclaw","Inselstadt Malchow","Insheim","Interlaken Ost","Interlaken West","Inzing/Inn","Iphofen","Ipsheim","Irfersgrün","Irrenlohe","Is-sur-Tille","Iselle di Trasquera","Iselle transito","Iserlohn","Iserlohnerheide","Isernhagen","Ismaning","Ispringen","Isselhorst-Avenwedde","Istein","Ittersbach Bahnhof","Ittersbach Industrie, Karlsbad","Ittersbach Rathaus","Ittling","Ittlingen","Itzehoe","Itzelberg","Ivanic Grad","Jabel(Meckl)","Jablonne v Podjestedi","Jacobsdorf(Mark)","Jaderberg","Jagdschloß","Jagstzell","Jahnsdorf(Erzgeb)","Janderup st","Jankowa Zaganska","Janovice nad Uhlavou","Jarrenwisch","Jasnitz","Jatznick","Jeber-Bergfrieden","Jechtingen","Jedlova","Jeeser","Jegum st","Jelenia Gora","Jena Paradies","Jena Saalbf","Jena West","Jena-Göschwitz","Jena-Zwätzen","Jenbach","Jenbach Zillertalbahn","Jennersdorf","Jerichow","Jerxheim","Jesenice(Gr)","Jesenice(SL)","Jesewitz(Leipzig)","Jessen(Elster)","Jestetten","Jettenbach","Jettingen","Jeumont","Jever","Jeßnitz(Anh)","Jiretin pod Jedlovou","Jirkov zast.","Joachimsthal","Joachimsthal Kaiserbahnhof","Jocketa","Jockgrim Bf","Joeuf","Johanngeorgenstadt","Joigny(Lar.Migennes)","Jossa","Judenburg","Julbach","Jungingen(Hohenz)","Jungnau","Juvisy","Jägersfreude","Jänschwalde","Jänschwalde Ost","Jävenitz","Jöhlingen","Jöhlingen West","Jößnitz","Jübek","Jüchen","Jülich","Jülich An den Aspen","Jülich Forschungszentrum","Jülich-Broich","Jülich-Nord","Jülich-Selgersdorf","Jünkerath","Jüterbog","Jütrichau","KIT-Campus Nord Bahnhof, Eggenstein-Leopoldshafen","KVG-Betriebshof, Kassel","Kaarst IKEA","Kaarst Mitte/Holzbüttgen","Kaarster Bahnhof","Kaarster See","Kablow","Kadan-Prunerov","Kahl Kopp/Heide","Kahl(Main)","Kahla(Thür)","Kaiseraugst","Kaisersesch","Kaiserslautern Galgenschanze","Kaiserslautern Hbf","Kaiserslautern Pfaffwerk","Kaiserslautern West","Kaiserslautern-Hohenecken","Kaiserstuhl AG","Kalchreuth","Kaldenkirchen","Kalenborn(Westerw)","Kalhausen","Kall","Kalsdorf b.Graz","Kalsow","Kaltenberg","Kaltenbrunnen im Montafon","Kalteneck","Kaltenkirchen Süd","Kaltenkirchen(Holst)","Kalthof(Kr Iserlohn)","Kalwang","Kamen","Kamen-Methler","Kamenz(Sachs)","Kamp-Bornhofen","Kampen Zuid","Kampen(NL)","Kandel","Kandern","Kandersteg","Kanzem","Kapelle-Biezelinge","Kapellen-Drusweiler","Kapellen-Wevelinghoven","Kapen Biosphärenreservat","Kapfenberg","Kappelrodeck","Kappelrodeck Ost","Kapsweyer","Kargow","Karlovy Vary","Karlovy Vary dolni n.","Karlsburg","Karlsdorf","Karlshagen","Karlsruhe Albtalbahnhof","Karlsruhe Bahnhofsvorplatz","Karlsruhe Durlacher Tor / KIT-Campus Süd","Karlsruhe Entenfang","Karlsruhe Hbf","Karlsruhe Hbf Südausgang","Karlsruhe Marktplatz (Kaiserstraße)","Karlsruhe Mühlburger Tor (Kaiserallee)","Karlsruhe West","Karlsruhe-Durlach","Karlsruhe-Hagsfeld","Karlsruhe-Kniel. Rheinbergstr.","Karlsruhe-Knielingen","Karlsruhe-Mühlburg","Karlsruhe-Neureut Kirchfeld","Karlstadt(Main)","Karpfham","Karsdorf","Karstädt","Karthaus","Kasbach","Kasbach Brauerei Steffens","Kassel Hbf","Kassel Hbf (tief)","Kassel-Harleshausen","Kassel-Jungfernkopf","Kassel-Kirchditmold","Kassel-Oberzwehren","Kassel-Wilhelmshöhe","Kastl(Oberbay)","Katharinenheerd","Kating","Katlenburg","Katowice","Kattenes","Kattenvenne","Katzenfurt","Katzhütte","Katzwang","Katzweiler","Kaub","Kaufbeuren","Kaufering","Kaulsdorf(Saale)","Kautenbach","Kavelstorf(Kr Rostock)","Kehl","Kehlen","Kehlhof","Keitum","Kelenföld","Kelkheim","Kelkheim-Hornau","Kelkheim-Münster","Kellmünz","Kelsterbach","Kematen in Tirol","Kemnath-Neustadt","Kempen(Niederrhein)","Kempten(Allgäu)Hbf","Kempten(Allgäu)Ost","Kemtau","Kennelgarten","Kenz","Kenzingen","Kerkerbach","Kerkrade Centrum","Kerkwitz","Kersbach","Kesswil","Kesteren","Kestert","Kettwig","Kettwig Stausee","Kevelaer","Kiebingen","Kiebitzhöhe","Kiefersfelden","Kiel Hbf","Kiel Schulen am Langsee","Kiel-Ellerbek","Kiel-Elmschenhagen","Kiel-Hassee CITTI-PARK","Kiel-Oppendorf","Kiel-Russee","Kierspe","Kilchberg(CH)","Killer","Killwangen-Spreitenbach","Kindberg","Kinding(Altmühltal)","Kindsbach","Kirch Göns","Kirch-Jesar","Kirchanschöring","Kirchberg in Tirol","Kirchberg(Murr)","Kirchbichl","Kirchdorf(Deister)","Kirchdorf/Krems","Kirchehrenbach","Kirchen","Kirchenlaibach","Kirchenlamitz Ost","Kirchentellinsfurt","Kirchgasse, Kassel","Kirchhain(Bz Kassel)","Kirchhammelwarden","Kirchheim(Neckar)","Kirchheim(Teck)","Kirchheim(Teck)-Ötlingen","Kirchheim(Teck)Süd","Kirchheim(Unterfr)","Kirchheim(Weinstr)","Kirchheimbolanden","Kirchhorsten","Kirchhundem","Kirchlengern","Kirchmöser","Kirchscheidungen","Kirchseeon","Kirchweidach","Kirchweyhe","Kirchzarten","Kirkel","Kirn","Kirnbach-Grün","Kirnsulzbach","Kirschbaumwasen","Kissing","Kittsee","Kitzbühel","Kitzbühel Hahnenkamm","Kitzingen","Kißlegg","Klaffenbach Hp","Klagenfurt Hbf","Klais","Klandorf","Klanxbüll","Klarenbeek","Klasdorf Glashütte","Klatovy","Klaus in Vorarlberg","Klecken","Kledering b.Wien","Kleeth","Klein Bünzow","Klein Gerau","Klein Winternheim-Ober Olm","Kleinberghofen","Kleinbettingen","Kleinblittersdorf","Kleinenbroich","Kleinensiel","Kleinfurra","Kleingemünden","Kleinheubach","Kleinjena","Kleinkems","Kleinkötz","Kleinostheim","Kleinröhrsdorf","Kleinschirma","Kleinsteinbach","Kleinwallstadt","Kleve","Klieken","Klimmen-Ransdaal","Klinge","Klingenberg(Main)","Klingenberg-Colmnitz","Klingenbrunn","Klingenthal","Klingnau","Klinikum Bremen-Nord/Beckedorf","Klitschmar","Klitten","Klockow(b Waren/Müritz)","Kloster Bronnbach","Kloster Marienthal","Kloster Oesede","Klosterbuch","Klosterfelde","Klosterlechfeld","Klostermansfeld","Klostermansfeld Randsiedlung","Klosterreichenbach","Kloten","Klotten","Kläden(Stendal)","Knesebeck","Knielingen Eggensteiner Straße, Karlsruhe","Knielingen Herweghstraße, Karlsruhe","Knielingen Siemens, Karlsruhe","Knielinger Allee/Städt. Klinikum, Karlsruhe","Knittelfeld","Knittlingen-Kleinvillars","Knöringen-Essingen","Kobern-Gondorf","Koblenz Dorf","Koblenz Hbf","Koblenz Stadtmitte","Koblenz(CH)","Koblenz-Ehrenbreitstein","Koblenz-Güls","Koblenz-Lützel","Koblenz-Moselweiß","Kochel","Kodersdorf","Koebenhavn H","Koebenhavns Lufthavn st","Kogenheim","Kohlscheid","Kohlstetten","Kolbermoor","Kolbnitz","Kolding st","Kolin(CZ)","Kolkwitz","Kolkwitz Süd","Kollmarsreute","Kollnau","Komarom","Konin","Konstanz","Konstanz Hafen","Konstanz-Fürstenberg","Konstanz-Petershausen","Konstanz-Wollmatingen","Konz","Konz Mitte","Konzerthaus, Karlsruhe","Koog aan de Zaan","Korbach Hbf","Korbach Süd","Kordel","Kork","Korntal","Korntal Gymnasium","Kornwestheim Pbf","Korschenbroich","Korsoer st","Kortenberg","Kortrijk","Koserow","Kothmaißling","Kottenheim","Koudum-Molkwerum","Krabbendijke","Kraftsdorf","Kraftwerk Finkenheerd","Kraghammer","Krakow Glowny","Kralupy nad Vltavou","Kranebitten","Kranichfeld","Kranj","Kraslice","Kraslice predmesti","Kraslice-Pod vlekem","Krasna Lipa","Krasna Lipa mesto","Kratzeburg","Krauthausen","Kredenbach","Krefeld Hbf","Krefeld-Hohenbudberg Chempark","Krefeld-Linn","Krefeld-Oppum","Krefeld-Uerdingen","Kreiensen","Kreimbach-Kaulbach","Kremmen","Krempe","Kremperheide","Krems an der Donau","Krensitz","Kressbronn","Kressbronn Hafen","Kretscham-Rothensehma","Kreuz Konz","Kreuzau Bahnhof","Kreuzau-Eifelstraße","Kreuzberg(Ahr)","Kreuzeck/Alpspitzbahn Bahnhof, Garmisch-Partenkirc","Kreuzlingen","Kreuzlingen Bernrain","Kreuzlingen Hafen","Kreuzstraße","Kreuztal","Kreuztal-Littfeld","Kriftel","Krimmeri-Meinau","Krimov","Krippen","Krommenie-Assendelft","Kronach","Kronberg Süd","Kronberg(Taunus)","Kronenplatz (Fritz-Erler-Str.), Karlsruhe","Kronenplatz (Kaiserstraße), Karlsruhe","Kronshagen","Kronskamp","Kronweiler","Kropswolde","Krsko","Kruft","Kruiningen-Yerseke","Krumbach(Schwab)","Krumbach(Schwab)Schule","Krumhermsdorf","Krumpa","Krumpendorf/Wörthersee","Krupunder","Krzewina Zgorzelecka","Krölpa-Ranis","Kröpelin","Kubschütz","Kuchen","Kuchl","Kufstein","Kullenmühle, Bad Herrenalb","Kulmbach","Kummerow(Stralsund)","Kummersdorf(Storkow)","Kundl","Kunersdorf","Kunowice","Kupfermühle","Kuppenheim","Kurort Altenberg(Erzgebirge)","Kurort Jonsdorf","Kurort Jonsdorf Hst","Kurort Kipsdorf","Kurort Oberwiesenthal","Kurort Oybin","Kurort Oybin-Niederdorf","Kurort Rathen","Kurt-Schumacher-Straße, Karlsruhe","Kusel","Kutenholz","Kutina","Kutno","Kuty","Kutzenhausen","Kyhna","Kyllburg","Kyritz","Kytlice","Kälberau","Kämmereiforst","Köditz","Köfering","Kölleda","Köln Airport-Businesspark","Köln Frankfurter Straße","Köln Geldernstr./Parkgürtel","Köln Hansaring","Köln Hbf","Köln Messe/Deutz","Köln Messe/Deutz Gl. 9-10","Köln Messe/Deutz Gl.11-12","Köln Steinstraße","Köln Süd","Köln Trimbornstr","Köln Volkhovener Weg","Köln West","Köln-Blumenberg","Köln-Buchforst","Köln-Chorweiler","Köln-Chorweiler Nord","Köln-Dellbrück","Köln-Ehrenfeld","Köln-Holweide","Köln-Longerich","Köln-Mülheim","Köln-Müngersdorf Technologiepark","Köln-Nippes","Köln-Stammheim","Köln-Weiden West","Köln-Worringen","Köln/Bonn Flughafen","Kölpinsee","Köndringen","Königs Wusterhausen","Königsbach(Baden)","Königsborn","Königsbronn","Königsbrück","Königschaffhausen","Königshofen(Baden)","Königshofen(Kahl)","Königslutter","Königsplatz, Kassel","Königsstollen","Königstein(Sächs Schw)","Königstein(Taunus)","Königswinter","Königswinter Fähre","Königswinter, Clem.-August-Str.","Könitz(Thür)","Könnern","Köppern","Körle","Körmend","Köthen","Köttewitz","Kötzschau","Kövenig","Kühler Krug, Karlsruhe","Kühnhausen","Kühren","Külte-Wetterburg","Künsebeck","Küntrop","Küps","Kürbitz","Küssnacht am Rigi","Küstrin-Kietz","LAigle","La Bastide-St-Laurent les Bains","La Brigue(F)","La Charité sur Loire","La Plaine","La Roche sur Yon","La Souterraine","Laa/Thaya","Laaber","Laage(Meckl)","Laberweinting","Lachen","Ladenburg","Lage Zwaluwe","Lage(Lippe)","Lagerlechfeld","Lahntal-Sarnau","Lahr(Schwarzw)","Laineck","Lalendorf","Lam","Lamadelaine","Lambach","Lambrecht(Pfalz)","Lambsheim","Lameyplatz, Karlsruhe","Lamone-Cadempino","Lampertheim","Lampertsmühle-Otterbach","Lampertswalde","Lancken","Landau(Isar)","Landau(Pfalz)Hbf","Landau(Pfalz)Süd","Landau(Pfalz)West","Landeck-Zams","Landen","Landgraaf","Landquart","Landry","Landsberg(L)Schule","Landsberg(Lech)","Landsberg(b. Halle/Saale)","Landsberg(b. Halle/Saale) Süd","Landshut(Bay)Hbf","Landshut(Bay)Süd","Landstuhl","Landsweiler-Reden","Lang Göns","Langdorf","Langdorp","Langebrück(Sachs)","Langeln(Holst)","Langelsheim","Langen am Arlberg","Langen(Hess)","Langen-Flugsicherung","Langenargen","Langenau(Württ)","Langenbach(Oberbay)","Langenbrand","Langendorf","Langeneichstädt","Langenfeld(Rhld)","Langenfeld(Rhld)-Berghausen","Langenhagen Mitte","Langenhagen Pferdemarkt","Langenhagen-Kaltenweide","Langenhahn","Langenhorn(Schlesw)","Langenlonsheim","Langenmoor","Langenorla Ost","Langenorla West","Langenprozelten","Langenselbold","Langenstein","Langensteinbach Bahnhof","Langensteinbach Schießhüttenäcker, Karlsbad","Langensteinbach St. Barbara, Karlsbad","Langenthal(CH)","Langenwang(Schwab)","Langenweddingen","Langenwolmsdorf","Langenwolmsdorf Mitte","Langenzenn","Langerwehe","Langhagen","Langkampfen","Langlau","Langsdorf(Oberhess)","Langwedel","Langweid(Lech)","Lansingerland-Zoetermeer","Lathen","Laubendorf","Laubenheim(Nahe)","Laucha(Unstrut)","Lauchhammer","Lauchheim","Lauchringen","Lauchringen West","Lauda","Laudenbach am Main","Laudenbach(Bergstr)","Laudenbach(Württ)","Lauenbrück","Lauenburg(Elbe)","Lauenförde-Beverungen","Lauenstein(Sachs)","Lauf West","Lauf(links Pegnitz)","Lauf(rechts Pegnitz)","Laufach","Laufen(CH)","Laufen(Oberbay)","Laufenburg(Baden)","Laufenburg(Baden)Ost","Laufenburg(CH)","Lauffen(Neckar)","Lauingen","Laupheim Stadt","Laupheim West","Laurenburg(Lahn)","Lausanne","Lausanne-Flon","Lauscha(Thür)","Lausen(CH)","Lauta(Nl)","Lautenbach(Baden)","Lauter(Sachs)","Lauterach","Lauterbach Mole","Lauterbach(Hess)Nord","Lauterbach(Rügen)","Lauterbach-Steinbach","Lauterbourg","Lauterecken-Grumbach","Laußnitz","Laveno Mombello","Le Blanc-Mesnil","Le Bourget","Le Creusot Montceau Montchanin TGV","Le Havre","Le Mans","Le Raincy Villemomble Montferm","Lebach","Lebach-Jabach","Lebbeke","Leer(Ostfriesl)","Leerdam","Leese-Stolzenau","Leeuwarden","Leeuwarden Camminghaburen","Legden","Legefeld","Legelshurst","Legnica","Lehmen","Lehndorf(Altenburg)","Lehnheim","Lehnitz","Lehrte","Leibnitz","Leichlingen","Leiden Centraal","Leiden Lammenschans","Leiferde(b Gifhorn)","Leimstruth","Leinefelde","Leinfelden","Leingarten","Leingarten Mitte","Leingarten Ost","Leingarten West","Leipheim","Leipzig Allee-Center","Leipzig Anger-Crottendorf","Leipzig Bayerischer Bahnhof","Leipzig Coppiplatz","Leipzig Essener Straße","Leipzig Grünauer Allee","Leipzig Hbf","Leipzig Hbf (tief)","Leipzig Karlsruher Str","Leipzig MDR","Leipzig Markt","Leipzig Messe","Leipzig Miltitzer Allee","Leipzig Mockauer Straße","Leipzig Nord","Leipzig Olbrichtstraße","Leipzig Slevogtstraße","Leipzig Völkerschlachtdenkmal","Leipzig Werkstättenstraße","Leipzig Wilhelm-Leuschner-Platz","Leipzig-Connewitz","Leipzig-Engelsdorf","Leipzig-Gohlis","Leipzig-Heiterblick","Leipzig-Holzhausen","Leipzig-Knauthain","Leipzig-Leutzsch","Leipzig-Liebertwolkwitz","Leipzig-Lindenau","Leipzig-Lützschena","Leipzig-Miltitz","Leipzig-Möckern","Leipzig-Mölkau","Leipzig-Paunsdorf","Leipzig-Plagwitz","Leipzig-Rückmarsdorf","Leipzig-Sellerhausen","Leipzig-Stötteritz","Leipzig-Thekla","Leipzig-Wahren","Leipzig/Halle Flughafen","Leipziger Platz, Kassel","Leipziger Straße, Kassel","Leisnig","Leithen b.Seefeld","Leitstade","Leißling","Lelystad Centrum","Lembeck","Lemförde","Lemgo","Lemgo-Lüttfeld","Lemmie","Lend","Lendringsen","Lengede-Broistedt","Lengefeld-Rauenstein","Lengenfeld(Vogtl)","Lengenwang","Lengerich(Westf)","Lenggries","Lenglern","Lengwil","Lennestadt-Altenhundem","Lennestadt-Grevenbrück","Lennestadt-Meggen","Lens(F)","Lensahn","Lentföhrden","Lenzburg","Lenzing","Leoben Hbf","Leogang","Leonberg","Leopoldsburg","Leopoldshafen Frankfurter Straße, Eggenstein-Leopo","Leopoldshafen Leopoldstr.","Leopoldshafen Viermorgen, Eggenstein-Leopoldshafen","Leopoldstal","Lermoos","Lerouville","Les Arcs Draguignan","Les-Aubrais-Orleans","Lesce-Bled","Leschede","Lessingstraße, Karlsruhe","Letmathe","Letmathe Dechenhöhle","Letschin","Lette(Kr Coesfeld)","Letter","Leubingen","Leubsdorf(Rhein)","Leubsdorf(Sachs)","Leudelange","Leuk","Leun/Braunfels","Leuna Werke Nord","Leuna Werke Süd","Leutenberg","Leuterschach","Leutershausen-Wiedersbach","Leutesdorf(Rhein)","Leuthen(Cottbus)","Leutkirch","Leuven","Leverkusen Chempark","Leverkusen Mitte","Leverkusen-Küppersteg","Leverkusen-Rheindorf","Leverkusen-Schlebusch","Lezignan","Liberec","Lich(Oberhess)","Lichtenberg(Erzgeb)","Lichtenfels","Lichtenhain(a d Bergbahn)","Lichtenstein Ernst-Schneller-Siedlung","Lichtenstein Gewerbegebiet","Lichtenstein Hartensteiner Straße","Lichtenstein(Sachs)","Lichtentanne(Sachs)","Lichtentanne(Thür)","Lichtenthal","Lichtenvoorde-Groenlo","Liebenau(Bz Kassel)","Liebenthal(Prignitz)","Lieblos","Liederbach","Liederbach-Süd","Lienz in Osttirol","Liers","Liestal","Lietzow(Rügen)","Liezen","Lille Europe","Lille Flandres","Limbach(Vogtl)","Limbach(b Homburg,Saar)","Limburg Süd","Limburg(Lahn)","Limburgerhof","Limmritz(Sachs)","Limone","Linda(Elster)","Lindach","Lindau-Aeschach","Lindau-Insel","Lindau-Reutin","Lindenberg(Mark)","Lindenberg, Kassel","Lindenholzhausen","Lindern","Lindhorst(Schaumb-Lippe)","Lindow(Mark)","Lindwedel","Lingen(Ems)","Lingenfeld","Linkenheim Friedrichstraße, Linkenheim-Hochstetten","Linkenheim Rathaus","Linkenheim Schulzentrum, Linkenheim-Hochstetten","Linkenheim Süd, Linkenheim-Hochstetten","Linnich Bhf","Linnich-Tetz","Linsburg","Linsenhofen","Linz Hbf","Linz(Rhein)","Linz/Donau Wegscheid","Lipinki Luzyckie","Lipova u Sluknova","Lippstadt","Lispenhausen","Lissendorf","Listerscheid","Litija","Litomerice mesto","Livorno Centrale","Liège-Guillemins","Ljubljana","Lobstädt","Locarno","Lochau-Hörbranz","Lochem","Lochham","Loeftgaard st","Lohgarten-Roth","Lohhof","Lohmen","Lohne(Oldb)","Lohnweiler","Lohr Bahnhof","Lohsa","Loitsch-Hohenleuben","Lollar","Longueau","Longwy","Lons-Le-Saunier","Lonsee","Loosdorf b.Melk","Loppenhausen","Loppersum","Lorch(Rhein)","Lorch(Württ)","Lorchhausen","Lorraine","Lorsbach","Lorsch","Lorüns","Lottschesee","Lottstetten","Lourches","Lourdes","Lovosice","Loxstedt","Loßburg-Rodt","Luban Sl.","Lubolz","Luckaitztal","Luckau-Uckro","Luckenau","Luckenwalde","Ludersheim","Ludesch","Ludwigsau-Friedlos","Ludwigsburg","Ludwigschorgast","Ludwigsfelde","Ludwigsfelde-Struveshof","Ludwigshafen(Bodensee)","Ludwigshafen(Rh)Hbf","Ludwigshafen(Rhein) BASF Mitte","Ludwigshafen(Rhein) BASF Nord","Ludwigshafen(Rhein) BASF Süd","Ludwigshafen(Rhein) Mitte","Ludwigshafen(Rhein) Oppau","Ludwigshafen-Mundenheim","Ludwigshafen-Oggersheim","Ludwigshafen-Rheingönheim","Ludwigshöhe","Ludwigslust","Ludwigsstadt","Ludwigsthal","Lugano","Luh nad Svatavou","Luhe","Luhe-Wildenau","Luino","Luisenthal(Saar)","Lumes Halte","Lund Central","Lunde J st","Lunden","Lunderskov st","Lunel","Lunestedt","Lunteren","Lunéville","Lupfig","Lustenau","Luterbach-Attisholz","Lutherplatz, Kassel","Lutherstadt Eisleben","Lutherstadt Wittenberg Altstadt","Lutherstadt Wittenberg Hbf","Lutherstadt Wittenberg-Labetz","Lutherstadt Wittenberg-Piesteritz","Lutten","Lutterbach","Lutum","Lutzelbourg","Luxembourg","Luzern","Lyon Part Dieu","Lähn","Läufelfingen","Löbau(Sachs)","Löcherberg","Löcknitz","Lödingsen","Löf","Löffingen","Löhnberg","Löhne(Westf)","Lököshaza","Lörrach Dammstraße","Lörrach Hbf","Lörrach Museum/Burghof","Lörrach Schwarzwaldstraße","Lörrach-Brombach/Hauingen","Lörrach-Haagen/Messe","Lörrach-Stetten","Lörzenbach-Fahrenbach","Lövenich","Löwenberg(Mark)","Löwental","Lößnitz ob Bf","Lößnitz unt Bf","Lößnitzgrund","Lübbecke(Westf)","Lübben(Spreewald)","Lübbenau(Spreewald)","Lübberstedt","Lübeck Flughafen","Lübeck Hbf","Lübeck Hochschulstadtteil","Lübeck St Jürgen","Lübeck-Dänischburg IKEA","Lübeck-Kücknitz","Lübeck-Travem. Skandinavienkai","Lübeck-Travemünde Hafen","Lübeck-Travemünde Strand","Lüblow(Meckl)","Lübs(Magdeburg)","Lübstorf","Lüdenscheid","Lüdenscheid-Brügge","Lüdersdorf(Meckl)","Lüdinghausen","Lügde","Lüneburg","Lünen Hbf","Lünen-Preußen","Lünern","Lüssow(Meckl)","Lütter","Lützel","Lützow","Maarheeze","Maarn","Maarssen","Maasbüll(b Niebüll)","Maastricht","Maastricht Noord","Maastricht Randwyck","Machern(Sachs)","Machnin","Machnin hrad","Magdeburg Hasselbachplatz","Magdeburg Hbf","Magdeburg Herrenkrug","Magdeburg SKET Industriepark","Magdeburg Südost","Magdeburg-Buckau","Magdeburg-Eichenweiler","Magdeburg-Neustadt","Magdeburg-Rothensee","Magdeburg-Salbke","Magdeburg-Sudenburg","Magstadt","Mahlow","Mahlwinkel","Maichingen","Maichingen Nord","Maienfeld","Maikammer-Kirrweiler","Mainaschaff","Mainhausen Zellhausen","Mainleus","Mainroth","Maintal Ost","Maintal West","Mainz Hbf","Mainz Nord","Mainz Römisches Theater","Mainz Waggonfabrik","Mainz-Bischofsheim","Mainz-Gonsenheim","Mainz-Gustavsburg","Mainz-Kastel","Mainz-Laubenheim","Mainz-Marienborn","Mainz-Mombach","Maisach","Maishofen-Saalbach","Mala Velen","Malbork","Malchin","Malching(Oberbay)","Malczyce","Malk Göhren","Mallersdorf","Malliß","Mallnitz-Obervellach","Malmsheim","Malmö Central","Malsch","Malsch Süd","Malsfeld","Malsfeld-Beiseförth","Malter","Mamer","Mamer Lycée","Mammendorf","Mammern URh","Mammern(Bodensee)","Manage","Mandern","Manebach","Manndorf","Mannenbach URh","Mannenbach-Salenstein","Mannheim ARENA/Maimarkt","Mannheim Handelshafen","Mannheim Hbf","Mannheim-Friedrichsfeld Süd","Mannheim-Käfertal","Mannheim-Luzenberg","Mannheim-Neckarau","Mannheim-Neckarstadt","Mannheim-Rheinau","Mannheim-Seckenheim","Mannheim-Waldhof","Mansfeld(Südharz)","Manternach","Mantgum","Marbach Ost (Villingen-Schwenningen)","Marbach West(Villingen-Schwenningen)","Marbach(Neckar)","Marbach(b Münsingen)","Marbach-Grafeneck","Marbeck-Heiden","Marburg Süd","Marburg(Lahn)","Marche-les-Dames","Marchegg","Marchienne au Pont","Marchtrenk","Margertshausen Bf","Maria Rain","Maria Veen","Maribor","Marienberg(NL)","Marienborn","Marienhafe","Marienheide","Markdorf(Baden)","Marke","Markelfingen","Markelsheim","Markkleeberg","Markkleeberg Mitte","Markkleeberg Nord","Markkleeberg-Gaschwitz","Markkleeberg-Großstädteln","Markranstädt","Marksuhl","Markt Bibart","Markt Erlbach","Markt Indersdorf","Markt Schwaben","Marktbreit","Marktl","Marktleuthen","Marktoberdorf","Marktoberdorf Schule","Marktplatz, Karlsruhe","Marktredwitz","Marktschorgast","Markvartice","Marl Mitte","Marl-Hamm","Marl-Sinsen","Marle-sur-Serre","Marlishausen","Marloie","Marne la Vallée-Chessy","Marnheim","Marquardt","Marsberg","Marseille-Blancarde","Marseille-St-Charles","Marstetten-Aitrach","Martensdorf","Martenshoek","Martigny","Martigues","Martinlamitz","Martinroda","Martinstein","Martinszell(Allgäu)","Marxgrün","Marxzell","Marzling","Maschen","Maselheim","Massen","Massing","Mathystraße, Karlsruhe","Matrei am Brenner","Matzenbach","Matzing","Maubach","Maubeuge","Mauer(b Heidelberg)","Maulbronn Stadt/Kloster","Maulbronn West","Maulburg","Mausheim","Mautern im Liesingtal","Mauthaus","Maxau","Maxhütte-Haidhof","Maximiliansau Eisenbahnstraße","Maximiliansau West","Maximiliansau-Im Rüsten","Mayen Ost","Mayen West","Mayrhofen im Zillertal","Mayschoß","Mechelen","Mechernich","Mechterstädt","Meckelfeld","Meckenbeuren","Meckenheim Industriepark","Meckenheim Kottenforst","Meckenheim(Bz Köln)","Meckesheim","Medewitz(Mark)","Medias","Meeder","Meerane","Meerbusch-Osterath","Meerssen","Meeschensee","Mehltheuer","Mehrhoog","Meine","Meinersdorf(Erzgeb)","Meinersen","Meinerzhagen","Meiningen","Meiringen","Meisdorf","Meitingen","Meitzendorf","Meißen","Meißen Altstadt","Meißen Triebischtal","Melbach","Melchow","Meldorf","Melk","Melle","Mellenbach-Glasbach","Mellendorf","Mellikon","Mellingen(Thür)","Mellrichstadt Bf","Mels","Melsdorf","Melsungen","Melsungen Bartenwetzerbrücke","Melsungen-Röhrenfurth","Melun","Memmingen","Menden(Rheinl)","Menden(Sauerland)","Menden(Sauerland)Süd","Mendig","Mendrisio","Mengen","Mengeringhausen","Mengersgereuth-Hämmern","Mengersgereuth-Hämmern Ost","Menningen-Leitishofen","Menton","Menzingen(Baden)","Menznau","Meppel","Meppen","Merano/Meran","Merching","Merchtem","Merchweiler","Merelbeke","Mering","Mering-St Afra","Mersch(LUX)","Mersch(Westf)","Merseburg Bergmannsring","Merseburg Hbf","Merten(Sieg)","Mertert","Mertesheim","Mertingen Bahnhof","Merxheim(Colmar)","Merzenich","Merzig(Saar)","Merzig(Saar) Ost","Merzig(Saar) Stadtmitte","Mesch Neue Mühle","Meschede","Messel","Messinghausen","Metelen Land","Mettenheim","Mettlach","Mettmann Stadtwald","Mettmann Zentrum","Metz Ville","Metzingen(Württ)","Metzingen-Neuhausen","Meuse TGV","Meuselbach-Schwarzmühle","Meyenburg","Meßdorf","Meßkirch","Michelau(LUX)","Michelau(Oberfr)","Michelau(Württ)","Michelaubrück","Michelbach(Unterfr)","Micheldorf","Michelstadt","Michendorf","Middelburg","Miedelsbach-Steinenberg","Miekinia","Miesbach","Miesenbach","Miesenheim","Mieste","Miesterhorst","Mikulasovice dolni nadrazi","Milano Centrale","Milano Greco Pirelli","Milano Porta Garibaldi","Millingen(b Rees)","Millingen(b Rheinb)","Milmersdorf","Milmort","Miltach","Miltenberg","Miltern","Miltzow","Mimberg","Mimon","Mindelaltheim","Mindelheim","Minden(Westf)","Mining","Miramas","Mirow","Mistorf","Mittel Gründau","Mittelherwigsdorf","Mitteloelsnitz","Mittelschmalkalden","Mittelsinn","Mittenwald","Mitterberghütten","Mitterdorf-Veitsch","Mittergars","Mittweida","Mixdorf","Mixnitz Bärenschützklamm","Mlada Boleslav hl.n.","Mlyny(CZ)","Mochenwangen","Mockrehna","Modane","Moers","Moidentin","Mol","Mols","Moltkestraße/Städt. Klinikum, Karlsruhe","Mommenheim","Monaco-Monte-Carlo","Monbach-Neuhausen","Monguelfo-Casies/Welsberg-Gsies","Monreal","Mons","Monsheim","Montabaur","Montbéliard Ville","Montelimar","Monthey","Montluçon Ville","Montmelian","Montpellier Saint-Roch","Montreux","Monza","Monzingen","Mook-Molenhoek","Moorbekhalle","Moosbachtal","Moosbierbaum-Heiligeneich","Moosburg","Moosrain","Moret-Veneux-les-Sablons","Morges","Morhange","Moritzburg","Morlesau","Morsum","Mosbach West","Mosbach(Baden)","Mosbach-Neckarelz","Mosel","Moselkern","Mosonmagyarovar","Most","Mouchard","Moulins-sur-Allier","Mouscron","Moustier","Moutier","Moutiers-Salins-Brides-les-Bains","Moyeuvre-Grande","Mudersbach","Muggensturm","Muggensturm Badesee","Muhr a See","Muizen","Mulda(Sachs)","Muldenberg","Muldenberg Floßplatz","Muldenhütten","Muldenstein","Mulhouse Ville","Mulhouse-Dornach","Mulsum-Essel","Munderkingen","Mundolsheim","Munkzwalm","Munsbach","Munster(Metzeral)","Munster(Örtze)","Muolen","Murg(Baden)","Murg(CH)","Murnau","Murnau Ort","Murrhardt","Musau","Mussidan","Muttenz","Mußbach","Mâcon Ville","Mâcon-Loché TGV","Mägdesprung","Mägerkingen","Märwil","Möckmühl","Mögelin","Mögglingen(Gmünd)","Möhlin","Möhringen Bahnhof","Möhringen Rathaus","Mölln(Lauenb)","Mölln(Meckl)","Mömbris-Mensengesäß","Mömbris-Strötzbach","Mönchengladbach Hbf","Mönchengladbach-Genhausen","Mönchengladbach-Lürrip","Mönchengladbach-Rheindahlen","Mönchhagen","Mönchröden","Mörfelden","Möringen(Altm)","Mörlenbach","Mörsch Am Hang, Rheinstetten","Mörsch Bach-West, Rheinstetten","Mörsch Merkurstraße, Rheinstetten","Mörsch Narzissenstraße, Rheinstetten","Mörsch Rheinaustraße, Rheinstetten","Mörsch Römerstraße, Rheinstetten","Mörsch Rösselsbrünnle, Rheinstetten","Möser","Mössingen","Möttingen","Mötz","Mücheln(Geiseltal)","Mücheln(Geiseltal) Stadt","Mücka","Mücke(Hess)","Müden(Mosel)","Mügeln Bf","Mühlacker","Mühlacker Rößlesweg","Mühlanger","Mühlbach(Pirna)","Mühlburg West, Karlsruhe","Mühlburger Feld, Karlsruhe","Mühlburger Tor (Kaiserallee), Karlsruhe","Mühldorf(Oberbay)","Mühldorf-Möllbrücke","Mühlehorn","Mühlen(Oldb)","Mühlen(b Horb)","Mühlenbeck-Mönchmühle","Mühlhausen(Thür)","Mühlhausen(b Engen)","Mühlheim am Inn","Mühlheim(Main)","Mühlheim(Main)-Dietesheim","Mühlheim(b Tuttlingen)","Mühlstetten","Mühltal","Mühringen","Mülheim(Ruhr)Hbf","Mülheim(Ruhr)Styrum","Mülheim(Ruhr)West","Müllheim(Baden)","Müllrose","Münchberg","Müncheberg(Mark)","Münchehof(Harz)","München Donnersbergerbrücke","München Flughafen Besucherpark","München Flughafen Terminal","München Hackerbrücke","München Harras","München Hbf","München Hbf (tief)","München Hbf Gl.27-36","München Hbf Gl.5-10","München Heimeranplatz","München Hirschgarten","München Isartor","München Karlsplatz","München Leienfelsstr.","München Leuchtenbergring","München Marienplatz","München Ost","München Rosenheimer Platz","München Siemenswerke","München St.Martin-Str.","München(Bad Berka)","München-Allach","München-Aubing","München-Berg am Laim","München-Daglfing","München-Englschalking","München-Fasanerie","München-Fasangarten","München-Feldmoching","München-Freiham","München-Giesing","München-Johanneskirchen","München-Karlsfeld","München-Laim","München-Langwied","München-Lochhausen","München-Mittersendling","München-Moosach","München-Neuaubing","München-Neuperlach Süd","München-Obermenzing","München-Pasing","München-Perlach","München-Riem","München-Solln","München-Trudering","München-Untermenzing","München-Westkreuz","Münchenbuchsee","Münchhausen","Münchingen","Münchingen Rührberg","Münchsmünster","Münchweiler(Alsenz)","Münchweiler(Rodalb)","Münnerstadt","Münsingen","Münsingen(CH)","Münster(Hessen)","Münster(W)Zentrum Nord","Münster(Westf)Hbf","Münster-Albachten","Münster-Amelsbüren","Münster-Hiltrup","Münster-Häger","Münster-Mecklenbeck","Münster-Roxel","Münster-Sarmsheim","Münster-Sprakel","Münster-Wiesing","Münsterlingen-Scherzingen","Münstertal(Schwarzwald)","Münzesheim","Münzesheim Ost","Mürlenbach","Mürzzuschlag","Müssen","Naarden-Bussum","Nabburg","Nachterstedt-Hoym","Nackenheim","Nagold","Nagold Stadtmitte","Nagold-Iselshausen","Nagold-Steinberg","Nagymaros-Visegrad","Naila","Namborn","Namedy","Nammen-Bad","Namur","Nancois Tronville","Nancy","Nantes","Narbonne","Narsdorf","Nassau(Erzgeb)","Nassau(Lahn)","Nassenbeuren","Nassenheide","Natrup-Hagen","Nauen","Nauendorf(Saalkr)","Nauheim(b Gr.Gerau)","Naumburg(Saale)Hbf","Naumburg(Saale)Ost","Naumburg-Roßbach","Naunhof","Neanderthal","Nebikon","Nebitzschen","Nebra","Nechlin","Neckarbischofsheim Helmhof","Neckarbischofsheim Nord","Neckarbischofsheim Stadt","Neckarburken","Neckargemünd","Neckargemünd Altstadt","Neckargerach","Neckarhausen bei Neckarsteinach","Neckarsteinach","Neckarsulm","Neckarsulm Mitte","Neckarsulm Nord","Neckarsulm Süd","Neckarzimmern","Nedlitz","Neef","Neerpelt","Neetzendorf","Neetzka","Neheim-Hüsten","Nehren","Neidenfels","Neidenstein","Neinstedt","Nejdek","Nejdek zastavka","Nejdek-Oldrichov","Nejdek-Sejfy","Nejdek-Sucha","Nejdek-Tisova","Nellmersbach","Nemmenich","Nemours St Pierre","Nemsdorf-Göhrendorf","Nendeln","Nendingen(b Tuttlingen)","Nennhausen","Nennig","Nennigmühle","Nenzing","Nenzingen","Nersingen","Nesselwang","Nessonvaux","Nestedice","Nestemice","Nettersheim","Nettingsdorf","Netzeband","Netzkater","Netzschkau","Neu Pudagla","Neu St Jürgen","Neu Wokern","Neu Wulmstorf","Neu-Anspach","Neu-Edingen/Friedrichsfeld","Neu-Isenburg","Neu-Ulm","Neubiberg","Neubrandenburg","Neubrücke(Nahe)","Neubukow","Neuburg(Donau)","Neuburg(Kammel)","Neuburg(Rhein)","Neubäu","Neuchâtel","Neudenau","Neudietendorf","Neudorf(Erzgeb)","Neue Schenke","Neuenburg(Baden)","Neuenbürg(Enz)","Neuenbürg(Enz) Freibad","Neuenbürg(Enz) Süd","Neuenbürg(Enz)-Rotenbach Eyachbrücke","Neuendettelsau","Neuenhagen(b Berlin)","Neuenhaus","Neuenhaus Süd","Neuenkirchen(Oldb)","Neuenmarkt-Wirsberg","Neuenrade","Neuenstein","Neufahrn(Niederbay)","Neufahrn(b Freising)","Neufchateau(B)","Neufchateau(F)","Neuffen","Neufra(Hohenz)","Neugersdorf","Neugilching","Neuhaus am Rennweg","Neuhaus(Pegnitz)","Neuhaus-Igelshieb","Neuhausen Bad Bf","Neuhausen(CH)","Neuhausen(Cottbus)","Neuhof(Kr Fulda)","Neuhof(b Zossen)","Neukieritzsch","Neukirch(Lausitz)Ost","Neukirch(Lausitz)West","Neukirch-Egnach","Neukirchen(Inn)","Neukirchen(b Sulzb)","Neukirchen-Klaffenbach","Neukirchen-Wyhra","Neukloster(Kr Stade)","Neulußheim","Neumark(Sachs)","Neumarkt(Oberpf)","Neumarkt-Kallham","Neumarkt-St Veit","Neumarkt/Wallersee","Neumühle(Elster)","Neumünster","Neumünster Stadtwald","Neumünster Süd AKN","Neundorf(Anh)","Neunhofen","Neunkirch","Neunkirchen a Sand","Neunkirchen(Kr Siegen)","Neunkirchen(Saar)-Wellesweiler","Neunkirchen(Saar)Hbf","Neuoelsnitz","Neupetershain","Neuratting","Neureut Adolf-Ehrmann-Bad, Karlsruhe","Neureut Bärenweg, Karlsruhe","Neureut Welschneureuter Straße, Karlsruhe","Neuruppin Rheinsberger Tor","Neuruppin Seedamm","Neuruppin West","Neusalza-Spremberg","Neuses(b Kronach)","Neusorg","Neuss Allerheiligen","Neuss Am Kaiser","Neuss Hbf","Neuss Rheinparkcenter","Neuss Süd","Neustadt am Rübenberge","Neustadt(Aisch)Bahnhof","Neustadt(Aisch)Mitte","Neustadt(Donau)","Neustadt(Dosse)","Neustadt(Holst)","Neustadt(Holst)Gbf","Neustadt(Kr Marburg)","Neustadt(Orla)","Neustadt(Sachs)","Neustadt(Schwarzw)","Neustadt(Waldnaab)","Neustadt(Weinstr) Süd","Neustadt(Weinstr)Hbf","Neustadt(b Coburg)","Neustadt-Böbig","Neustadt-Glewe","Neustadt-Hohenacker","Neustift(b Passau)","Neustrelitz Hbf","Neusäß","Neusörnewitz","Neutrebbin","Neuwied","Neuwiesenreben, Ettlingen","Neuwirtshaus(Porscheplatz)","Neuzelle","Neuötting","Nice Ville","Nidda","Nidderau","Nidderau-Eichen","Nidderau-Windecken","Nideggen-Brück","Niebüll","Niebüll Autoverladung","Niebüll neg","Niedaltdorf","Nieder Flörsheim-Dalsheim","Nieder Olm","Nieder Wöllstadt","Nieder-Ohmen","Niederarnbach","Niederau","Niederau-Tuchmühle","Niederbiegen","Niederbipp","Niederbobritzsch","Niederbrechen","Niederdollendorf","Niederdorf(Erzgeb)","Niederdorfelden","Niederdreisbach","Niederdresselndorf","Niedererbach","Niederfinow","Niederglatt","Niedergörsdorf","Niederhadamar","Niederheimbach","Niederhöchstadt","Niederhövels","Niederjosbach","Niederkorn","Niederlahnstein","Niederlehme","Niederlindhart","Niederlinxweiler","Niedermittlau","Niedermohr","Niederndodeleben","Niedernhausen(Taunus)","Niederoderwitz","Niederpöllnitz","Niederraunau","Niederroth","Niedersachswerfen","Niedersachswerfen Herkulesmarkt","Niedersachswerfen Ilfelder Straße","Niedersachswerfen Ost","Niederscheld(Dillkr)Süd","Niederschelden","Niederschelden Nord","Niederschlag","Niederschlottwitz","Niederschmalkalden","Niederselters","Niederspier","Niedersteinbach","Niederstetten","Niederstotzingen","Niedertrebra","Niederwalgern","Niederwalluf","Niederwartha","Niederweimar","Niederwiesa","Niederwillingen","Niederwinden","Niederwürschnitz","Niederzeuzheim","Niederzissen","Niederzwönitz","Niefern","Niemberg","Nienburg(Saale)","Nienburg(Weser)","Nienhagen(Halberst)","Nierstein","Niesky","Nieukerk","Nieuw Amsterdam","Nieuw Vennep","Nieuwerkerk a. d. Ijssel","Nievenheim","Nievern","Nijkerk","Nijmegen","Nijmegen Dukenburg","Nijmegen Goffert","Nijmegen Heyendaal","Nijmegen Lent","Nijverdal","Niklashausen","Nimburg(Baden)","Nistertal-Bad Marienberg","Nittel","Noerre Nebel st","Noerreport st","Noertzange","Nogent-le-Rotrou","Nohen","Nohfelden","Nohra(Weimar)","Nohra(Wipper)","Noisy-le-Sec","Nonnenhorn","Norddeich","Norddeich Mole","Norden","Nordendorf","Nordenham","Norderstedt Mitte","Nordhalben Bf","Nordhastedt","Nordhausen","Nordhausen Bahnhofsplatz","Nordhausen Hesseröder Straße","Nordhausen Nord","Nordhausen Ricarda-Huch-Straße","Nordhausen Schurzfell","Nordhausen-Altentor","Nordhausen-Krimderode","Nordhausen-Salza","Nordheim(Württ)","Nordholz","Nordhorn","Nordhorn-Blanke","Nordsode","Nordstemmen","Nordwalde","Norf","Norheim","Norsingen","Northeim(Han)","Nortorf","Nossentin","Notre-Dame-de-Briancon","Nottuln-Appelhülsen","Nova Gradiska","Nova Kapela","Nova Role","Nova Role zastavka","Novara","Nove Hamry","Nove Zamky","Noveant","Novska","Novy Bor","Noyon","Nufringen","Nunspeet","Nuth","Nußberg-Schönau","Ny Ellebjerg st","Nyborg st","Nyiregyhaza","Nymburk hl.n.","Nîmes","Nöbdenitz","Nördlingen","Nörten-Hardenberg","Nörvenich-Binsfeld","Nünchritz","Nürnberg Frankenstadion","Nürnberg Hbf","Nürnberg Nordost","Nürnberg Ost","Nürnberg Ostring","Nürnberg Rothenburger Str.","Nürnberg-Dutzendteich","Nürnberg-Dürrenhof","Nürnberg-Eibach","Nürnberg-Erlenstegen","Nürnberg-Gleißhammer","Nürnberg-Laufamholz","Nürnberg-Mögeldorf","Nürnberg-Rehhof","Nürnberg-Reichelsdorf","Nürnberg-Sandreuth","Nürnberg-Schweinau","Nürnberg-Stein","Nürnberg-Steinbühl","Nürtingen","Nürtingen-Roßdorf","Nürtingen-Vorstadt","Nützen","Nüziders","Ober Ramstadt","Ober Widdersheim","Oberachern","Oberachern Bindfadenfabrik","Oberaichen","Oberalm","Oberammergau","Oberasbach","Oberau","Oberaudorf","Oberbettingen-Hillesheim","Oberbillig","Oberbimbach","Oberboihingen","Oberbrechen","Oberburg","Obercarsdorf","Oberdachstetten","Oberderdingen-Flehingen Industrie","Oberelchingen","Oberelsungen","Obererbach","Oberesslingen","Oberferrieden","Obergimpern","Oberglatt","Obergries","Obergriesbach","Obergrunstedt","Oberhaid","Oberharmersbach Dorf","Oberharmersbach-Riersbach","Oberhausen Hbf","Oberhausen-Holten","Oberhausen-Osterfeld Süd","Oberhausen-Sterkrade","Oberhofen im Inntal","Oberholz","Oberkirch","Oberkirch-Köhlersiedlung","Oberkochen","Oberkorn","Oberkotzau","Oberkrozingen","Oberlahnstein","Oberlauscha","Oberlenningen","Oberlichtenau","Oberlindhart","Oberlinxweiler","Obermaubach","Obermodern","Obermohr","Obernau","Obernberg-Altheim","Obernburg-Elsenfeld","Oberndorf(Neckar)","Oberndorf(Wittgenstein)","Oberneuschönberg","Obernhof(Lahn)","Oberoderwitz","Oberoderwitz Oberdorf","Oberottmarshausen","Oberrieden(CH)","Oberriet","Oberrohn","Oberrothenbach","Oberrotweil","Oberröblingen","Oberschefflenz","Oberschleißheim","Oberschlottwitz","Obersdorf","Obersinn","Oberstaufen","Oberstdorf","Obertraubling","Obertshausen(Kr Of)","Obertsrot","Oberursel(Taunus)","Oberursel-Stierstadt","Oberursel-Weißkirchen/Steinbach","Obervogelgesang","Oberweimar","Oberweißbach-Deesbach","Oberwerrn","Oberwesel","Oberwinden","Oberwinter","Oberzell","Oberzissen","Oberöwisheim","Obing","Obourg","Obstfelderschmiede","Ochenbruck","Ochsenfurt","Ochsenhausen","Ochtmersleben","Ochtrup","Ockenheim","Odenheim Bf","Odenheim West","Odense st","Oderin","Oebisfelde","Oederan","Oegeln","Oehna","Oelde","Oelsnitz Bahnhofstraße","Oelsnitz(Erzgeb)","Oelsnitz(Vogtl)","Oerel","Oerlenbach","Oerlinghausen","Oermingen","Oertzenhof","Oese","Oesede","Oesterport st","Oestrich-Winkel","Oetrange","Oettingen(Bay)","Oeventrop","Offenau","Offenbach(Main) Kaiserlei","Offenbach(Main) Ledermuseum","Offenbach(Main) Marktplatz","Offenbach(Main)Hbf","Offenbach(Main)Ost","Offenbach-Bieber","Offenbach-Waldhof","Offenburg","Offenburg Kreisschulzentrum","Offenhausen","Offensen(Kr North)","Offingen","Oftersheim","Ohlstadt","Oisterwijk","Okarben","Oker","Oksboel st","Olbernhau","Olbernhau West","Olbernhau-Grünthal","Olbersdorf Niederdorf","Olbersdorf Oberdorf","Olbersleben-Ellersleben","Olching","Oldenburg(Holst)","Oldenburg(Oldb)","Oldenburg-Wechloy","Oldenbüttel","Oldentrup","Oldenzaal","Olen(Belgien)","Olovi","Olpe","Olsberg","Olsbrücken","Olst(NL)","Olten","Ommen","Onville","Oostende","Oosterbeek","Opfikon","Opheusden","Opladen","Opole Glowne","Oppenau","Oppenheim","Oppenweiler(Württ)","Oppikon","Oppurg","Opwijk","Orange(Avignon)","Oranienbaum(Anh)","Oranienburg","Oranienburg (S)","Orchies","Orlamünde","Orléans","Orschweier","Ortrand","Oschatz","Oschersleben(Bode)","Osnabrück Altstadt","Osnabrück Hbf","Osnabrück-Sutthausen","Oss","Oss West","Ostbevern","Ostendstraße, Karlsruhe","Osterburg","Osterburken","Osterhofen(Nby)","Osterhofen(Oberbay)","Osterholz-Scharmbeck","Ostermundigen","Ostermünchen","Osternienburg","Osterode am Harz Leege","Osterode am Harz Mitte","Ostersode","Osterspai","Osterstedt","Osterteich","Osterwald","Osterweddingen","Ostheim(Kr Hanau)","Ostheim(b Butzbach)","Osthofen","Ostrach Bahnhof","Ostrau","Ostrava hl.n.","Ostrava-Svinov","Ostseebad Binz","Ostseebad Kühlungsborn Mitte","Ostseebad Kühlungsborn Ost","Ostseebad Kühlungsborn West","Othmarsingen","Otrokovice","Ottenau","Ottendorf(Mittweida)","Ottendorf-Okrilla Hp","Ottendorf-Okrilla Nord","Ottendorf-Okrilla Süd","Ottenhofen(Oberbay)","Ottenhofen-Bergel","Ottenhöfen","Ottenhöfen West","Ottensoos","Otterfing","Otterndorf","Ottersberg(Han)","Otterwisch","Otting","Otting-Weilheim","Otto-Sachs-Straße, Karlsruhe","Ottobeuren","Ottobrunn","Ottweiler(Saar)","Otzberg Lengfeld","Otze","Otzing","Oudenbosch","Outrup st","Ovelgünne","Overath","Overveen","Owen(Teck)","Owschlag","Oy-Mittelberg","Oßmannstedt","Padborg st","Paderborn Hbf","Paderborn Kasseler Tor","Paderborn Nord","Paderborn-Schloss Neuhaus","Paderborn-Sennelager","Padova","Paffendorf","Pagny-sur-Moselle","Paindorf","Palzem","Pankofen","Pansdorf","Pantin","Papenburg(Ems)","Papendorf","Papierfabrik, Kaufungen","Papiermühle(Stadtr)","Pappenheim","Parchim","Pardubice hl.n.","Paris Austerlitz","Paris Est","Paris Gare de Lyon","Paris Montparnasse","Paris Nord","Paris St Lazare","Parkentin","Parndorf","Parsberg","Partenstein","Pasewalk","Pasewalk Ost","Passau Hbf","Passow(Uckermark)","Paternion-Feistritz","Patersdorf","Patsch","Pau","Paulinenaue","Paulinzella","Pavia","Pechbrunn","Peenemünde","Pegau","Peggau-Deutschfeistritz","Pegnitz","Peine","Peiting Nord","Peiting Ost","Peitz Ost","Peiß","Peißen","Peißenberg","Peißenberg Nord","Peltre","Penig","Penzberg","Pepinster","Perigueux","Perkam","Perl","Perleberg","Pernink","Perpignan","Peschiera del Garda","Petange","Petergrube","Petersaurach","Petersaurach Nord","Petershagen Nord","Petershagen(Uckerm)","Petershagen-Lahde","Petershain","Petershausen(Obb)","Peterskirchen","Petersroda","Petit Croix","Pfaffenhain","Pfaffenhausen","Pfaffenhofen(Ilm)","Pfalzel","Pfarrkirchen","Pfarrwerfen","Pflach","Pflaumloch","Pforzheim Hbf","Pforzheim Maihälden","Pforzheim-Weißenstein","Pfraundorf(Inn)","Pfreimd","Pfronten-Ried","Pfronten-Steinach","Pfronten-Weißbach","Pfullendorf","Pfungstadt","Pfäffikon SZ","Pfäffingen","Philipp-Reis-Straße, Karlsruhe","Philippsburg(Baden)","Philippshagen","Philippsheim","Philippstraße, Karlsruhe","Pichl b.Schladming","Piding","Piensk","Pill-Vomperbach","Pillgram","Pinneberg","Pinnow(Uckermark)","Pino transito","Pinzberg","Pirk","Pirmasens Hbf","Pirmasens Nord","Pirna","Pirna-Copitz","Pirna-Copitz Nord","Pisa Centrale","Pittenhart","Plaaz","Plaidt","Planegg","Plate(Meckl)","Plattling","Platz der Deutschen Einheit, Kassel","Plau am See Bahnhof","Plaue(Thür)","Plauen(V) unt Bf","Plauen(Vogtl) Mitte","Plauen(Vogtl) ob Bf","Plauen(Vogtl)-Straßberg","Plauen(Vogtl)West","Pleinfeld","Plesna(CZ)","Plessa","Plettenberg","Plochingen","Ploiesti Vest","Plzen hl.n.","Plön","Plüderhausen","Plüschow","Pockau-Lengefeld","Pocking","Pogeez","Poggenhagen","Poikam","Poing","Poitiers","Pomezi nad Ohri","Pommelsbrunn","Pommern(Mosel)","Pommritz","Ponitz","Pont St Vincent","Pont-Ste-Maxence","Pont-a-Mousson","Ponte Gardena-Laion/Waidbruck-Lajen","Pontresina","Poppenhausen","Pordenone","Porschdorf(Pirna)","Porstendorf","Port Bou","Port Vendres Ville","Porta Westfalica","Porz(Rhein)","Porz-Wahn","Posewald","Possenhofen","Postbauer-Heng","Poststraße, Karlsruhe","Potsdam Charlottenhof","Potsdam Griebnitzsee","Potsdam Griebnitzsee (S)","Potsdam Hbf","Potsdam Hbf (S)","Potsdam Medienstadt Babelsberg","Potsdam Park Sanssouci","Potsdam Pirschheide","Potsdam-Babelsberg","Potsdam-Rehbrücke","Potucky","Potucky zastavka","Pougues les Eaux","Poznan Gl.","Praest","Praha hl.n.","Praha-Holesovice","Praha-Smichov","Pram-Haag","Pratau","Pratteln","Predeal","Preetz","Pregarten","Premnitz Nord","Premnitz Zentrum","Prenzlau","Prerov","Pressath","Pressig-Rothenkirchen","Pretzfeld","Pretzier(Altm)","Pretzsch","Priemerburg","Prien a Chiemsee","Priestewitz","Prinzersdorf","Priort","Prisdorf","Prittitz","Pritzerbe","Pritzier","Pritzwalk","Pritzwalk Hainholz","Pritzwalk West","Probsteierhagen","Probstzella","Profen","Profondsart","Prora","Prora Ost","Prosselsheim","Przylep","Prödel","Prösen","Prösen Ost","Prösen West","Puch bei Hallein","Puchheim","Pulheim","Pullach","Pulling(b Freising)","Pulsnitz","Pulsnitz Süd","Purmerend","Purmerend Overwhere","Purmerend Weidevenne","Pusarnitz","Puschendorf","Putbus","Putten","Puttgarden","Putzkau","Pöchlarn","Pölchow","Pölling","Pöllwitz","Pönitz(Holst)","Pönitz(Leipzig)","Pörtschach am Wörther See","Pösing","Pößneck ob Bf","Pößneck unt Bf","Quadrath-Ichendorf","Quakenbrück","Quedlinburg","Quedlinburg-Quarmbeck","Quelle","Quelle-Kupferheide","Quendorf","Querfurt","Quevy","Quickborn","Quickborn Süd","Quickborner Straße","Quierschied","Quimper","Quint","Raaba","Raalte","Rabenau","Rackith(Elbe)","Rackwitz(Leipzig)","Radbruch","Raddusch","Radeberg","Radebeul Ost","Radebeul-Kötzschenbroda","Radebeul-Naundorf","Radebeul-Weintraube","Radebeul-Zitzschewig","Radeburg","Radersdorf","Radis","Radldorf(Niederbay)","Radolfzell","Radstadt","Raestrup-Everswinkel","Rafz","Raguhn","Rahden","Rain","Raindorf","Raisdorf","Raisting","Raitersaich","Rakow","Rambin(Rügen)","Ramerberg","Rammelsbach","Rammingen(Bay)","Rammingen(Württ)","Ramsbach Birkhof","Ramsbach Höfle","Ramsberg","Ramsen","Ramsenthal","Ramstein","Rangendingen","Rangsdorf","Rankweil","Ranstadt","Ranzo-S. Abbondio","Rastatt","Rastatt Beinle","Rastede","Rastow","Rathaus, Kassel","Rathaus/Fünffensterstraße, Kassel","Rathenow","Rathmannsdorf(Kr Pirna)","Ratingen Ost","Rattenberg-Kramsach","Ratzeburg","Raubling","Rauenstein(Thür)","Raumland-Markhausen","Raumünzach","Raun","Raunheim","Ravensburg","Ravenstein","Re(I)","Rebdorf-Hofmühle","Rebstein-Marbach","Rech","Rechenberg","Rechenberg Schule","Rechtenstein","Rechterfeld","Reckendorf","Reckenfeld","Recklinghausen Hbf","Recklinghausen Süd","Reckweilerhof","Reddelich","Rednitzhembach","Redwitz(Rodach)","Regen","Regensburg Hbf","Regensburg-Burgweinting","Regensburg-Prüfening","Regenstauf","Regis-Breitingen","Rehau","Rehfeld(Falkenberg)","Rehfelde","Rehna","Rehweiler","Reichelsdorfer Keller","Reichelsheim(Wett)","Reichenau(Baden)","Reichenbach Kurpark, Waldbronn","Reichenbach im Kandertal","Reichenbach(Fils)","Reichenbach(Oberlausitz)","Reichenbach(Vogtl) ob Bf","Reichenbach(b. Ettlingen)","Reichenberg(Unterfr)","Reichenburg","Reichenschwand","Reichersbeuern","Reichertshausen(Ilm)","Reichertshofen(Schwab) Bf","Reicholzheim","Reifland-Wünschendorf","Reihen","Reil","Reilsheim","Reims","Reinbek","Reinfeld(Holst)","Reinhardsbrunn-Friedrichroda","Reinheim(Odenw)","Reinsbüttel","Reinsdorf(Artern)","Reinsdorf(bei Nebra)","Reinstetten","Reisen(Hess)","Reiskirchen(Kr Gi)","Reith b.Seefeld","Rejsby st","Rekawinkel","Reken","Reken-Klein Reken","Rekingen AG","Remagen","Remiremont","Remscheid Hbf","Remscheid-Güldenwerth","Remscheid-Lennep","Remscheid-Lüttringhausen","Renchen","Rendsburg","Rennes","Renningen","Renningen Süd","Rennsteig","Rentrisch","Rentweinsdorf","Rentwertshausen","Rentzschmühle","Retenice","Rethen(Leine)","Retz","Retzbach-Zellingen","Reurieth","Reuterstadt Stavenhagen","Reuth(b Erbendorf)","Reuth(b Plauen,Vogtl)","Reutlingen Hbf","Reutlingen West","Reutlingen-Betzingen","Reutlingen-Sondelfingen","Reutte in Tirol","Reutte in Tirol Schulzentrum","Reuver","Reußen","Rhade","Rheda-Wiedenbrück","Rheden(NL)","Rheinbach","Rheinbach Römerkanal","Rheinberg(Rheinl)","Rheinbrohl","Rheine","Rheine-Mesum","Rheineck","Rheinfelden(Baden)","Rheinfelden(CH)","Rheinhafen, Karlsruhe","Rheinhafenstraße, Karlsruhe","Rheinhausen","Rheinhausen Ost","Rheinsberg(Mark)","Rheinsheim","Rheinweiler","Rheinzabern Alte Römerstraße","Rheinzabern Bf","Rheinzabern Rappengasse","Rhenen","Rhens","Rheydt Hbf","Rheydt-Odenkirchen","Rhöndorf","Ribe Noerremark st","Ribe st","Ribnitz-Damgarten Ost","Ribnitz-Damgarten West","Richen(b Eppingen)","Richterswil","Rickling","Ried","Ried im Innkreis","Riederau","Riedlingen","Riedrode","Riedstadt-Goddelau","Riedstadt-Wolfskehlen","Riegel am Kaiserstuhl Ort","Riegel-Malterdingen","Riegel-Malterdingen NE","Riehen","Riehen Niederholz","Rieneck","Riesa","Rieschweiler","Rieseby","Rieste","Riestedt","Rietheim(CH)","Rietheim(Württ)","Rietschen","Rietz in Tirol","Riffelriß, Grainau","Rijssen","Rijswijk","Rilland-Bath","Rimbach","Rimini","Ringenwalde(Templin)","Ringleben-Gebesee","Ringsheim","Ringsted st","Rinkerode","Rinklingen","Rinnthal","Rinteln","Rintheim Sinsheimer Straße, Karlsruhe","Rio di Pusteria/Mühlbach","Rippberg","Ritschenhausen","Ritterhude","Rivera-Bironico","Rivesaltes","Roanne","Robilante","Roccavione","Rochefort-Jemelle","Rochlitz(Sachs)","Rockenhausen","Rodalben","Rodange","Rodenbach(Dillkr)","Rodenbach(b Hanau)","Rodenkirchen(Oldb)","Rodewisch","Rodgau-Dudenhofen","Rodgau-Hainhausen","Rodgau-Jügesheim","Rodgau-Nieder Roden","Rodgau-Rollwald","Rodgau-Weiskirchen","Rodheim v d Höhe","Roding","Rodleben","Roedekro st","Roermond","Roeschwoog","Roggentin","Roggwil-Berg","Roggwil-Wynau","Rohr(Thür)","Rohr-Bad Hall","Rohrbach(Ilm)","Rohrbach(Oberbay)","Rohrbach(Pfalz)","Rohrbach(Saar)","Rohrdorf(Oberbay)","Rohrenfeld","Roigheim","Roisdorf","Roitzsch(Bitterf)","Rokycany","Rolandseck","Rollhofen","Roma Termini","Romanshorn","Romanshorn (See)","Rombas-Clouange","Rommelshausen","Rommerskirchen","Ronet","Ronneburg(Thür)","Ronnenberg","Ronshausen","Roodeschool","Roodt/Syre","Roosendaal","Roppen","Rorschach","Rorschach Hafen","Rorschach Hafen (See)","Rosbach v d Höhe","Rosbach(Sieg)","Rosenau(b Grafenau)","Rosenbach bei Villach","Rosenberg(Baden)","Rosendahl-Holtwick","Rosenheim","Rosenheim Aicherpark","Rosenheim Hochschule","Rosenwinkel","Roskilde st","Rosmalen","Rostock Hbf","Rostock Holbeinplatz","Rostock Parkstraße","Rostock Seehafen Nord","Rostock Thierfelder Str.","Rostock-Bramow","Rostock-Evershagen","Rostock-Kassebohm","Rostock-Lichtenhagen","Rostock-Lütten Klein","Rostock-Marienehe","Rostock-Torfbrücke","Rot am See","Rot-Malsch","Rotava","Rotenbach(Enz)","Rotenburg a.d. Fulda","Rotenburg(Wümme)","Rotenhain","Roth","Rothenburg ob der Tauber","Rothenburg(CH)","Rothenbürg","Rothenstein(Saale)","Rothenthurm(CH)","Rothrist","Rotkreuz","Rott(Inn)","Rottenacker","Rottenbach","Rottenburg(Neckar)","Rottendorf","Rotterdam Alexander","Rotterdam Blaak","Rotterdam Centraal","Rotterdam Lombardijen","Rotterdam Noord","Rotterdam Zuid","Rottershausen","Rottweil","Rottweil Göllsdorf","Rottweil Neufra","Rottweil Saline","Roudnice nad Labem","Rouffach","Rovereto","Rovigo","Roßbach(Pfalz)","Roßla","Roßlau(Elbe)","Roßtal","Roßtal Wegbrücke","Rudersberg","Rudersberg Nord","Rudersberg-Oberndorf","Rudolstadt(Thür)","Rudolstadt-Schwarza","Ruhland","Ruhlsdorf-Zerpenschleuse","Ruhmannsfelden","Ruhpolding","Ruhstorf","Rum b.Innsbruck","Rumburk","Rumeln","Rummenohl","Runding","Runkel","Rupperswil","Ruppertsgrün","Rupprechtstegen","Ruschberg","Ruschwedel","Rutesheim","Ruthenbeck","Ruurlo","Rybniste","Rzepin","Rätzlingen","Réding(F)","Rémilly","Röblingen am See","Rödental","Rödental Mitte","Rödermark-Ober Roden","Rödermark-Urberach","Rödlitz-Hohndorf","Röhrmoos","Röhrnbach","Rönshausen","Röntgental","Röslau","Rösrath","Rösrath-Stümpen","Röt","Rötenbach(Baden)","Rötgesbüttel","Röthenbach(Allgäu)","Röthenbach(Oberpf)","Röthenbach(Pegnitz)","Röthenbach-Seespitze","Röthenbach-Steinberg","Rövershagen","Rückersbacher Schlucht","Rückersdorf","Rückersdorf(Mfr)","Rüdesheim(Rhein)","Rüdnitz","Rülzheim Bf","Rülzheim Freizeitzentrum","Rümikon AG","Rümlang","Rümmingen","Ründeroth","Rüppurr Battstraße, Karlsruhe","Rüppurr Ostendorfplatz, Karlsruhe","Rüppurr Tulpenstraße, Karlsruhe","Rüppurrer Tor, Karlsruhe","Rüschlikon","Rüsselbach","Rüsselsheim","Rüsselsheim Opelwerk","Rüthi SG","Saal(Donau)","Saalburg(Taunus)","Saalfeld(Saale)","Saalfelden","Saarbrücken Hbf","Saarbrücken Ost","Saarbrücken-Burbach","Saarburg(Bz Trier)","Saarhölzbach","Saarlouis Hbf","Saarmund","Saasen","Saatel","Sachsen(b Ansbach)","Sachsendorf(Calbe)","Sachsenhausen(Nordb)","Sachsenheim","Safenwil","Sagard","Sagehorn","Saincaize","Saint Ghislain","Saintes","Salach","Salem","Salez-Sennwald","Sallach","Salmtal","Salzbergen","Salzburg Aigen","Salzburg Aiglhof","Salzburg Gnigl","Salzburg Hbf","Salzburg Liefering","Salzburg Mülln-Altstadt","Salzburg Parsch","Salzburg Sam","Salzburg Süd","Salzburg Taxham Europark","Salzgitter-Bad","Salzgitter-Immendorf","Salzgitter-Lebenstedt","Salzgitter-Ringelheim","Salzgitter-Thiede","Salzgitter-Watenstedt","Salzkotten","Salzwedel","Samedan","Samstagern","Samtens","San Candido/Innichen","San Remo","Sand(Niederbay)","Sande","Sandebeck","Sanderbusch","Sandersdorf(Bitterf)","Sandershäuser Straße, Kassel","Sandersleben(Anh)","Sandförde","Sandhagen(b Bad Dob)","Sandkrug","Sandwehle","Sandweiler-Contern","Sangerhausen","Sanitz(b Rostock)","Sankt Augustin Zentrum","Sanry-sur-Nied","Sanssouci","Santpoort Noord","Santpoort Zuid","Sapjane(Gr)","Sargans","Sarnow","Sarrebourg","Sarreguemines","Sarstedt","Sasbach am Kaiserstuhl","Sassenheim","Sassenroth","Sassnitz","Sathonay Rillieux","Satteldorf","Satzvey","Sauerlach","Sauldorf","Saulgrub","Saulheim","Saumur Rive Droit","Sauwerd","Saverne","Savona","Schaan-Vaduz","Schaerbeek","Schafbrücke","Schaffhausen","Schaftenau","Schaftlach","Schagen","Schaidt(Pfalz)","Schalchen","Schalkau","Schalkau Mitte","Schalksmühle","Schalkstetten","Schallstadt","Schameder","Schandelah","Scharbeutz","Scharfenstein","Scharmede","Scharnitz","Scharstorf","Schechen","Scheemda","Scheeßel","Scheibenberg","Scheidemannplatz, Kassel","Scheidt(Saar)","Schelklingen","Schemmerberg","Schenkenzell","Scheppach","Scherfede","Scheuerfeld(Sieg)","Scheven","Schiedam Centrum","Schieder","Schierbrok","Schierke","Schierstedt","Schifferstadt","Schifferstadt Süd","Schifflange","Schiffweiler","Schillerstraße, Karlsruhe","Schiltach","Schiltach Mitte","Schimborn","Schin op Geul","Schindellegi-Feusisberg","Schinnen","Schiphol (Airport)","Schirgiswalde-Kirschau","Schirnding","Schkeuditz","Schkeuditz West","Schkopau","Schladen(Harz)","Schladern(Sieg)","Schladming","Schlatt(Hohenz)","Schlechtbach","Schleife","Schleswig","Schliengen","Schlierbach(Schwalm-Eder-Kr.)","Schliersee","Schlins-Beschling","Schloss Gottesaue, Karlsruhe","Schloss Rüppurr, Karlsruhe","Schloß Holte","Schluchsee","Schlüchtern","Schmachtenhagen","Schmalkalden","Schmalkalden-Fachhochschule","Schmalnau","Schmidtheim","Schmiechen","Schmiechen Albbahn","Schmiechen(Schwab)","Schmiedeberg (Dresden)","Schmiedeberg-Naundorf","Schmilka-Hirschmühle","Schmollensee","Schmölln(Ol)","Schmölln(Thür)","Schnabelwaid","Schnaittach Markt","Schneeberg im Odenwald","Schneeberg(Mark)","Schnega","Schneidhain","Schnelldorf","Schneverdingen","Schney","Schnitzmühle","Schoden-Ockfen","Schondorf(Bay)","Schongau","Schonungen","Schopfheim","Schopfheim West","Schopfheim-Schlattholz","Schopfloch(b Freudenstadt)","Schopp","Schorndorf","Schorndorf-Hammerschlag","Schortens-Heidmühle","Schouweiler","Schrezheim","Schrobenhausen","Schrozberg","Schruns","Schulen","Schutzbach","Schwaan","Schwabach","Schwabach-Limbach","Schwabhausen(b Dachau)","Schwabmünchen","Schwabsberg","Schwaig","Schwaigern Ost","Schwaigern(Württ)","Schwaigern(Württ) West","Schwaikheim","Schwalbach(Taunus)Limes","Schwalbach(Taunus)Nord","Schwallungen","Schwalmstadt-Wiera","Schwandorf","Schwanheide","Schwante","Schwarmstedt","Schwarzach i Vorarl.","Schwarzach-St.Veit","Schwarzburg","Schwarzenbach(Saale)","Schwarzenbach(b Pressath)","Schwarzenbek","Schwarzenberg","Schwarzenberg Hp","Schwarzenberg(Erzg)","Schwarzenberg-Neuwelt","Schwarzenfeld(Opf)","Schwarzheide Ost","Schwarzkollm","Schwaz","Schwechat","Schwedt(Oder)","Schwedt(Oder)Mitte","Schweich(DB)","Schweighofen","Schweikershain","Schweinfurt Hbf","Schweinfurt Mitte","Schweinfurt Stadt","Schweinsburg-Culten","Schweinsdorf","Schwelm","Schwelm West","Schwenningen(Bay)","Schwenningen(Neckar)","Schwenzin","Schweppenburg-Heilbrunnen","Schwerin Hbf","Schwerin Mitte","Schwerin Süd","Schwerin-Görries","Schwerin-Lankow","Schwerin-Margaretenhof","Schwerin-Warnitz","Schwerin-Wüstmark","Schwerte(Ruhr)","Schweta Bf","Schwetzingen","Schwieberdingen","Schwindebeck","Schwindegg","Schwindratzheim","Schwyz","Schwäbisch Gmünd","Schwäbisch Hall","Schwäbisch Hall-Hessental","Schwörstadt","Schärding","Schöllkrippen","Schömberg Stausee","Schömberg(b Balingen)","Schöna","Schönau(Hörsel)","Schönberg(Holstein)","Schönberg(Meckl)","Schönberg(Vogtl)","Schönberger Strand","Schönbichl in Tirol","Schönborn(Doberl)","Schönebeck Süd","Schönebeck(Elbe)","Schönebeck-Bad Salzelmen","Schönebeck-Felgeleben","Schönebeck-Frohse","Schöneck(Vogtl)","Schöneck(Vogtl) Ferienpark","Schöneck-Büdesheim","Schöneck-Kilianstädten","Schöneck-Oberdorfelden","Schönerlinde","Schönewörde","Schönfließ(Mark) Dorf","Schönfließ(b Oranienburg)","Schöngeising","Schönhausen(Elbe)","Schönkirchen Bf","Schönmünzach","Schönow(Angerm)","Schönstedt","Schönwald(Oberfr)","Schönwalde(Barnim)","Schönwalde(Spreewald)","Schönwies","Schöppenstedt","Schötmar","Schübelbach-Buttikon","Schülldorf","Schüptitz","Schüttorf","Scuol-Tarasp","Sebnitz(Sachs)","Sebuzin","Sechshelden","Sechtem","Seckach","Seddin","Sedlitz Ost","Seebach(Mühlhausen)","Seebad Ahlbeck","Seebad Heringsdorf","Seebad Lubmin","Seebergen","Seebrugg","Seefeld in Tirol","Seefeld(Mark)","Seefeld-Hechendorf","Seeg","Seegefeld","Seehausen(Altm)","Seehausen(Uckermark)","Seekirchen am Wallersee","Seeleiten-Berggeist","Seelow(Mark)","Seelow-Gusow","Seelvitz","Seelze","Seerhausen","Seesen","Seeshaupt","Sehlem(Kr Wittlich)","Sehma","Sehnde","Seiboldsdorf","Seifersdorf","Seifhennersdorf","Seitschen","Sejstrup st","Selb Nord","Selb Stadt","Selb-Plößberg","Selbitz","Selhausen","Seligenstadt Mainschleifenbahn","Seligenstadt(Hess)","Seligenstadt(b Würzburg)","Sellin(Rügen) Ost","Sellin(Rügen) West","Sellstedt","Selm","Selm-Beifang","Seltendorf","Selzthal","Senden","Senden-Bösensell","Senftenberg","Sennfeld","Serams","Seregno","Serrig","Sersheim","Sesto S. Giovanni","Sete","Seubersdorf","Seulberg","Seulbitz","Sevelen","Sevnica","Seybothenreuth","Siebeldingen-Birkweiler","Siebnen-Wangen","Siedenlangenbeck","Siedlinghausen","Siegburg Bahnhof","Siegburg/Bonn","Siegelsbach","Siegelsdorf","Siegen Hbf","Siegen-Geisweid","Siegen-Weidenau","Siegershausen","Siegsdorf","Sieniawa Zarska","Sierck-les-Bains","Sierksdorf","Sierre/Siders","Siersburg","Siershahn","Sieversdorf(Neust/D)","Siggenthal-Würenlingen","Sighisoara","Siglingen","Sigmaringen","Sigmaringendorf","Silbach","Silberhausen","Silberhütte NE","Silberstraße","Sillian","Silz im Oberinntal","Simbach(Inn)","Simeria","Simmelsdorf-Hüttenbach","Simtshausen","Sinaia","Sindelfingen","Sindorf","Singen Industriegebiet","Singen Landesgartenschau","Singen(Hohentwiel)","Singen(Thür)","Singlis","Sinn","Sinsheim Museum/Arena","Sinsheim(Elsenz) Hbf","Sint-Denijs-Boekel","Sinzheim","Sinzheim Nord","Sinzig(Rhein)","Sinzing","Sion","Sipplingen","Sissach","Sittard","Sitzendorf-Unterweißbach","Skaerbaek st","Slagelse st","Slavonski Brod","Sliedrecht","Sliedrecht Baanhoek","Slubice","Sluknov","Sluknov zast.","Sneek","Sneek Noord","Soest","Soest Zuid","Soest(NL)","Soestdijk","Sohl","Sohland","Sokolov","Solingen Grünewald","Solingen Hbf","Solingen Mitte","Solingen Vogelpark","Solingen-Schaberg","Sollstedt","Solms","Solnhofen","Solothurn","Solpke","Soltau Nord","Soltau(Han)","Soltendieck","Somain","Sondern","Sondernach","Sondernheim","Sondershausen","Sonneberg(Thür)Hbf","Sonneberg(Thür)Nord","Sonneberg(Thür)Ost","Sonneberg(Thür)West","Sontheim(Schwab)","Sontheim-Brenz","Sonthofen","Sontra","Sophienhof","Sopot","Sopron","Sorge","Soroe st","Sosnowiec Glowny","Sottrum","Soyen","Spa","Spaichingen","Spaichingen Mitte","Spangsbjerg st","Sparrieshoop","Spaubeek","Spay","Spechtritz","Speele","Speicher","Speikern","Speyer Hbf","Speyer Nord-West","Spicak","Spich","Spiegelau","Spielberg","Spielfeld-Straß","Spiez","Spinnerei, Ettlingen","Spital am Pyhrn","Spittal-Millstättersee","Sponholz","Spornitz","Spremberg","Sprendlingen(Rheinhess)","Springe","Sprötze","Spöck Hochhaus, Stutensee","Spöck Richard-Hecht-Schule, Stutensee","St Alban","St Avold","St Dalmas de Tende","St Egidien","St Georgen(Schwarzw)","St Goar","St Goarshausen","St Ilgen-Sandhausen","St Ingbert","St Koloman","St Malo","St Mang","St Michaelisdonn","St Ottilien","St Thomas","St Wendel","St-Amour","St-Avre-la-Chambre","St-Germain-des-Fosses","St-Gervais-les-Bains","St-Jean-de-Luz-Ciboure","St-Jean-de-Maurienne Arvan","St-Jory(Toulouse)","St-Louis (Haut-Rhin)","St-Maurice(CH)","St-Michel-Valloire","St-Pierre-dAlbigny","St-Pierre-des-Corps","St-Priest","St-Quentin(Aisne)","St-Raphael-Valescure","St-Sulpice-Lauriere","St. Anton am Arlberg","St. Anton im Montafon","St. Gallen(CH)","St. Gallen(CH) Haggen","St. Gallen(CH) Winkeln","St. Johann im Pongau","St. Johann in Tirol","St. Margrethen SG","St. Moritz","St. Valentin","St.Jodok am Brenner","St.Michael in Obersteiermark","St.Peter-Seitenstetten","St.Pölten Hbf","St.Veit/Glan","Staad","Stade","Stadt Rottenmann","Stadt Wehlen(Sachs)","Stadtallendorf","Stadthagen","Stadtilm","Stadtoldendorf","Stadtprozelten","Stadtroda","Staffel","Staffelfelden","Stahringen","Stainach-Irdning","Stambach","Stammbach","Stams","Stans bei Schwaz","Stapelburg","Stara Role","Starckstraße, Karlsruhe","Starnberg","Starnberg Nord","Statte","Stauchitz","Staudernheim","Staufen","Staufen Süd","Stavoren","Staßfurt","Steckborn","Steckborn URh","Stederdorf(Kr Uelzen)","Stedum","Steenwijk","Stegenwaldhaus","Steilküste/Wittenbeck","Stein(Traun)","Stein-Säckingen","Steina","Steinach in Tirol","Steinach(Baden)","Steinach(Thür)","Steinach(Thür)Süd","Steinach(b Rothenburg ob der Tauber)","Steinalben","Steinau(Straße)","Steinbach am Wald","Steinbach-Hallenberg","Steinbourg","Steindorf bei Straßwalchen","Steinebach","Steinebrunn(CH)","Steinefrenz","Steinen","Steinerne Renne","Steinfeld(Oldb)","Steinfeld(Pfalz)","Steinfeld(Stendal)","Steinfurt-Borghorst","Steinfurt-Burgsteinfurt","Steinfurt-Grottenkamp","Steinhagen(Westf)","Steinhagen(Westf) Bielef. Str.","Steinhausen-Neuburg","Steinheim(Main)","Steinheim(Westf)","Steinhöring","Steinpleis","Steinsfurt","Steinweiler","Steinwenden","Stelle","Stelle DHE","Stendal Hbf","Stendal Vorbf","Stendal-Stadtsee","Stenn","Stephansfeld","Sterbfritz","Sternfeld","Sternhaus-Haferfeld","Sternhaus-Ramberg","Sterzhausen","Stettbach","Stetten (b. Haigerloch)","Stetten am Heuchelberg","Stetten(Donau)","Stetten(Schwab)","Stetten-Beinstein","Stettfeld(Baden)","Stettfeld-Weiher","Steyr","Stiege","Stift Keppel-Allenbach","Stockach NE","Stockau","Stockdorf","Stockerau","Stockhausen(Lahn)","Stockheim(Oberfr)","Stockheim(Unterfr)","Stockholm Central","Stockstadt(Main)","Stockstadt(Rhein)","Stolberg(Harz)","Stolberg(Rheinl)Gbf","Stolberg(Rheinl)Hbf","Stolberg(Rheinl)Hbf Gl.27","Stolberg(Rheinl)Hbf Gl.44","Stolberg-Altstadt","Stolberg-Mühlener Bahnhof","Stolberg-Rathaus","Stolberg-Schneidmühle","Stollberg Schlachthofstraße","Stollberg(Sachs)","Stolpen","Stommeln","Storkow(Mark)","Storzingen","Stotternheim","Stralsund Hbf","Stralsund Rügendamm","Stralsund-Grünhufe","Strasbourg","Strasburg(Uckerm)","Strasshof","Straubing","Straubing-Ost","Strausberg","Strausberg (S)","Strausberg Nord","Strausberg Stadt","Strausberg-Hegermühle","Straußfurt","Straß-Moos","Straßberg(Harz)","Straßberg-Glasebach","Straßberg-Winterlingen","Straßgräbchen-Bernsdorf","Straßkirchen","Straßwalchen","Stresa","Strizivojna-Vrpolje","Strohkirchen","Strullendorf","Struthütten","Stubben","Stubbenfelde","Stubersheim","Stumsdorf","Sturovo","Stuttgart Ebitzweg","Stuttgart Feuersee","Stuttgart Flughafen/Messe","Stuttgart Hbf","Stuttgart Hbf (tief)","Stuttgart Neckarpark","Stuttgart Nord","Stuttgart Nürnberger Str.","Stuttgart Schwabstr.","Stuttgart Stadtmitte","Stuttgart Universität","Stuttgart-Bad Cannstatt","Stuttgart-Feuerbach","Stuttgart-Münster","Stuttgart-Obertürkheim","Stuttgart-Rohr","Stuttgart-Sommerrain","Stuttgart-Untertürkheim","Stuttgart-Vaihingen","Stuttgart-Zazenhausen","Stuttgart-Zuffenhausen","Stuttgart-Österfeld","Stühlingen","Stützerbach","Subzin-Liessow","Suchsdorf","Suderburg","Suerhop","Suhl","Suhl-Heinrichs","Sukow(b Schwerin)","Sulmingen","Sulz(Neckar)","Sulz-Röthis","Sulzbach(Inn)","Sulzbach(Main)","Sulzbach(Murr)","Sulzbach(Saar)","Sulzbach(Saar)Altenwald","Sulzbach(Taunus)","Sulzbach(Taunus)Nord","Sulzbach-Rosenberg","Sulzbach-Rosenberg Hütte","Sulzbachtal","Sulzberg","Sulzfeld(Baden)","Summerau","Sursee","Survilliers Fosses","Susteren","Svatava","Svatava zastavka","Svor","Swalmen","Swiebodzin","Swinoujscie Centrum","Swisttal-Odendorf","Syke","Syrau","Sythen","Szczecin Glowny","Szczecin Gumience","Szentgotthárd","Szob","Szob(Gr)","Szolnok","Sättelstädt","Sélestat","Söllingen Kapellenstraße","Söllingen Reetzstr.","Söllingen(b Karlsr)","Sömmerda","Sörup","Süderbrarup","Süderdeich","Süderlügum","Sülstorf","Sülzbach","Sülzbach Schule","Sülzenbrücken","Sünching","Süßen","TGV Haute Picardie","Taben","Tabor","Tacherting","Tamines","Tamm(Württ)","Tangerhütte","Tangermünde","Tangermünde West","Tanndorf","Tanneneck","Tannheim(Württ)","Tannroda","Tantow","Tapfheim","Tarascon sur Rhone","Tarp","Tarvisio Boscoverde","Tata","Tatabanya","Tating","Taubenheim(Spree)","Tauberbischofsheim","Tauberfeld","Taucha(Leipzig)","Taufkirchen","Taufkirchen an der Pram","Taulov st","Tautenhain","Taverne-Torricella","Taxenbach-Rauris","Tczew","Tecknau","Tegelen","Tegernsee","Teicha","Teichland","Teichwolframsdorf","Teisendorf","Teisnach","Teisnach Rohde+Schwarz","Telfs-Pfaffenhofen","Telgte","Teltow","Teltow Stadt","Temmels","Templeuve","Templin","Templin Stadt","Templin-Ahrensdorf","Tende(F)","Teningen-Mundingen","Tenneck","Teplice v Cechach","Terborg","Terespol","Terfens-Weer","Tergnier","Teschenhagen","Teschow","Tessin","Tessin West","Testelt","Teterow","Teting (Moselle)","Teuchern","Teufelsmühle","Teutschenthal","Teutschenthal Ost","Thale Hbf","Thale Musestieg","Thaleischweiler-Fröschen","Thalfingen(b Ulm)","Thalheim(Erzgeb)","Thalheim(b Oschatz)","Thalwil","Thann-Matzbach","Thansüß","Tharandt","Thayngen","Theisbergstegen","Theißen","Themar","Thermalbad Wiesenbad","Thesdorf","Thiergarten(Hohenz)","Thionville","Thoßfell","Thun","Thusis","Thyrow","Thüngersheim","Thür","Tiebensee","Tiefenau","Tiefenbach(b Passau)","Tiefenbachmühle","Tiefenort","Tieffenbach-Struth","Tiel","Tiel Passewaaij","Tienen","Tiengen(Hochrhein)","Tilburg","Tilburg Reeshof","Tilburg Universiteit","Timmendorfer Strand","Tinglev st","Tisis","Titisee","Tittmoning-Wiesmühl","Tivoli, Karlsruhe","Tjaereborg st","Tobel-Affeltrangen","Toender Nord st","Toender st","Tongeren","Torgau","Torgelow","Torino Porta Susa","Tornesch","Tostedt","Toul","Toulon","Toulouse-Matabiau","Tourcoing","Tournai","Tournan","Traben-Trarbach","Trabitz","Trais-Horloff","Trasadingen","Trassenheide","Trassenmoor","Traun","Traun OÖ","Traundorf","Traunreut","Traunstein","Traunstein Klinikum","Trbovlje","Trebbin","Treben-Lehma","Trebgast","Trebitz(Elbe)","Trebnitz(Mark)","Trebusice","Trechtingshausen","Treibach-Althofen","Treis-Karden","Trelleborg F","Trento","Treuchtlingen","Treuen","Treuenbrietzen","Treuenbrietzen Süd","Treviso Centrale","Treysa","Triangel","Triberg","Trieben","Triebes","Triefenried","Trier Hbf","Trier Süd","Triesdorf","Triptis","Trochtelfingen ALB-GOLD","Trochtelfingen(Hohenz)","Trochtelfingen(b Bopfingen)","Troisdorf","Troisvierges","Trompet","Trooz","Trossingen Bahnhof","Trossingen Stadt","Trostberg","Tschagguns","Tullastraße/Verkehrsbetriebe, Karlsruhe","Tulling","Tulln a.d.Donau","Tullnerfeld","Tuplice","Tuplice Debinka","Turgi","Tuttlingen","Tuttlingen Gänsäcker","Tuttlingen Nord","Tuttlingen Schulen","Tuttlingen Zentrum","Tutzing","Twello","Twiste","Twistringen","Tychy","Töging(Inn)","Tönning","Töppeln","Tübingen Hbf","Tübingen West","Tübingen-Derendingen","Tübingen-Lustnau","Türkenfeld","Türkheim(Bay)Bf","Türkismühle","Tüßling","Ubbedissen","Ubstadt Ort","Ubstadt Salzbrunnenstr","Ubstadt Uhlandstr.","Ubstadt-Weiher","Uchtspringe","Uckange","Uder","Udine","Uebigau","Ueckermünde","Ueckermünde Stadthafen","Uelzen","Uffenheim","Uffing a Staffelsee","Uhingen","Uhldingen-Mühlhofen","Uhlerborn","Uhlstädt","Uhsmannsdorf","Uhyst","Uitgeest","Uithuizen","Uithuizermeeden","Ulberndorf","Ulbersdorf","Ulm Hbf","Ulm Ost","Ulm-Donautal","Ulm-Söflingen","Ulmerfeld-Hausmening","Ulrichsbrücke-Füssen","Ulzburg Süd","Umrathshausen Ort","Unadingen","Undorf","Unfriedsdorf","Ungedanken","Unkel","Unna","Unna West","Unna-Königsborn","Unnau-Korb","Unterammergau","Unterasbach","Unteraschau","Unterberg-Stefansbrücke","Unterelchingen","Unterföhring","Untergimpern","Untergrainau","Untergriesheim","Untergrombach","Unterhaching","Unterharmersbach","Unterhausen(Bay)","Unterheckenhofen","Unterjesingen Mitte","Unterjesingen Sandäcker","Unterkochen","Unterlemnitz","Unterlenningen","Unterloquitz","Unterlüß","Untermaubach-Schlagstein","Untermaßfeld","Unterneudorf","Unterneustädter Kirchplatz, Kassel","Unterreichenbach","Unterschleißheim","Untersteinach(Bayr)","Untersteinach(b Stadtsteinach)","Unterterzen","Unterwellenborn","Unterwiesenthal","Unteröwisheim Bf","Unteröwisheim M.-Luther-Str.","Unzmarkt","Uphusum","Urbach(b Schorndorf)","Urft","Urmersbach","Urmitz","Urmitz Rheinbrücke","Urschalling","Urspring","Usch-Zendscheid","Usingen","Uslar","Usquert","Usseln","Usti nad Labem hl.n.","Usti nad Labem zapad","Usti nad Labem-Strekov","Utrecht Centraal","Utrecht Leidsche Rijn","Utrecht Lunetten","Utrecht Maliebaan","Utrecht Overvecht","Utrecht Terwijde","Utrecht Vaartsche Rijn","Utrecht Zuilen","Utting","Uttwil","Utzedel","Vac","Vach","Vacha","Vachdorf","Vachendorf","Vahldorf","Vaihingen(Enz)","Vaihingen(Enz)Nord","Vaires Torcy","Val-de-Reuil","Valby(Koebenhavn)","Valdaora-Anterselva/Olang-Antholz","Valdek","Valence TGV","Valence Ville","Valenciennes","Valkenburg(NL)","Vallendar","Vamdrup st","Vandans","Varangeville-St-Nicolas","Varde Kaserne st","Varde Vest st","Varde st","Varel(Oldb)","Varnsdorf","Varnsdorf Pivovar Kocour","Varnsdorf stare nadr","Varsseveld","Vastorf","Vaterstetten","Vatterode","Vatteröder Teich","Vechelde","Vechta","Vechta-Stoppelmarkt","Veendam","Veenendaal Centrum","Veenendaal West","Veenendaal-De Klomp","Vehlefanz","Veilsdorf","Veitshöchheim","Velbert Rosenhügel","Velbert-Langenberg","Velbert-Neviges","Velbert-Nierenhof","Velden am Wörther See","Velden(b Hersbruck)","Velgast","Velke Zernoseky","Velky Senov","Velky Senov zast.","Vellmar-Niedervellmar","Vellmar-Obervellmar","Vellmar-Osterberg/EKZ","Velp","Velten(Mark)","Vendenheim","Venezia Mestre","Venezia Santa Lucia","Venissieux","Venlo","Venray","Ventimiglia","Ventschow","Vercelli","Verden(Aller)","Veringendorf","Veringenstadt","Vernante","Vernawahlshausen","Verneuil lEtang","Verneuil sur Avre","Vernon(Eure)","Verona Porta Nuova","Verviers Central","Verviers-Palais","Vesele pod Rabstejnem","Vetschau","Vettweiß","Vettweiß-Jakobwüllesheim","Vicenza","Viechtach","Vienenburg","Vienne","Vierenstraße","Vierkirchen-Esterhofen","Vierlingsbeek","Viernau","Viersen","Vieselbach","Vievola","Vilemov u Sluknova","Villabassa-Braies/Niederdorf-Prags","Villach Hbf","Villach Warmbad","Villach Westbf","Villars les Dombes","Villedieu les Poeles","Villers Cotterets","Villiers-le-Bel-Gonesse","Villingen(Schwarzw)","Villingen-Schwenningen Eisstadion","Villingen-Schwenningen Hammerstatt","Villmar","Vils in Tirol","Vilsbiburg","Vilseck","Vilshofen(Niederbay)","Vilvoorde","Vinkovci","Vinzelberg","Vipiteno-Val di Vizze/Sterzing-Pfitsch","Visby st","Vise","Visp","Visselhövede","Vitry le François Gare","Vittel","Vleuten","Vlissingen","Vlissingen Souburg","Vlotho","Voerde(Niederrhein)","Voerendaal","Vogelsang(Gransee)","Vogelweh","Voghera","Vohburg","Vohren","Voigtsgrün","Voigtstedt","Vojens st","Vojtanov","Voldagsen","Volders-Baumkirchen","Volkach-Astheim","Volkmarsen","Volkringhausen","Volkswohnung/Staatstheater, Karlsruhe","Volpriehausen","Voorburg","Voorhout","Voorschoten","Voorst-Empe","Vorden","Vorhop","Vormwald","Vormwald Dorf","Vorra(Pegnitz)","Voßloch","Vriezenveen","Vroegum st","Vroomshoop","Vught","Vysoka Pec","Vöcklabruck","Vöcklamarkt","Vöhl-Ederbringhausen","Vöhl-Herzhausen","Vöhl-Schmittlotheim","Vöhl-Thalitter","Vöhringen","Vöhrum","Völklingen","Völksen/Eldagsen","Völs","Wabern(Bz Kassel)","Wachenheim(Pfalz)","Wackershofen","Waddinxveen","Waddinxveen Noord","Waddinxveen Triangel","Waffenbrunn","Wagersrott","Waghäusel","Waging","Wahlbach(Kr Siegen)","Wahlheim","Wahlitz","Wahlstedt","Wahlwies","Wahrenholz","Waiblingen","Waibstadt","Waigolshausen","Wakendorf","Wald am Schoberpass","Walddrehna","Waldenburg(Sachs)","Waldenburg(Württ)","Waldershof","Waldfischbach","Waldhausen(b Geislingen)","Waldhausen(b Schorndorf)","Waldheim","Waldkirch","Waldkirchen(Erzgeb)","Waldkirchen(Niederbay.)","Waldkraiburg-Kraiburg","Waldmünchen","Waldshut","Walenstadt","Walferdange","Walhausen(Saar)","Walheim(Württ)","Walkenried","Wallau(Lahn)","Walldorf(Hess)","Walldorf(Werra)","Walldürn","Wallenrod","Wallersdorf","Wallertheim","Walleshausen","Wallhausen(Helme)","Wallhausen(Württ)","Wallisellen","Wallwitz(Saalkr)","Walpertskirchen","Walporzheim","Walschleben","Walsleben","Walsrode","Waltershausen","Waltershausen Schnepfenthal","Wandersleben","Wandlitz","Wandlitzsee","Wangen(Allgäu)","Wangen(Unstrut)","Wangerooge","Wanne-Eickel Hbf","Wannweil","Wansleben am See","Warburg(Westf)","Waren(Müritz)","Warendorf","Warendorf-Einen-Müssingen","Warenshof","Warffum","Warmbad","Warnemünde","Warnemünde Werft","Warngau","Warnitz(Uckermark)","Warszawa Centralna","Warszawa Wschodnia","Warszawa Zachodnia","Wartberg im Mürztal","Wartberg/Krems","Warthausen","Wasbek","Wasen, Ettlingen","Wasenweiler","Wasseralfingen","Wasserbillig","Wasserburg(Bodensee)","Wasserburg(Günz)","Wasserburg(Inn)Bf","Wasserliesch","Wasserthaleben","Wassertrüdingen","Wasserzell(b Eichstätt)","Wasungen","Watenstedt","Waterloo","Watermael/Watermaal","Wattenscheid","Wattenscheid-Höntrop","Watzelsteg","Watzenborn-Steinberg","Waßmannsdorf","Webau","Wecker","Weckesheim","Weddel(Braunschw)","Wedel(Holst)","Weener","Weert","Weesenstein","Weesp","Weetzen","Weeze","Wefensleben","Wega","Wegberg","Wegeleben","Wegenstedt","Wegliniec","Wehdel","Wehl","Wehr(Mosel)","Wehr-Brennet","Wehretal-Reichensachsen","Wehrheim","Weibhausen","Weichering","Weickersdorf(Sachs)","Weickersgrüben","Weida","Weida Altstadt","Weida Mitte","Weiden(Oberpf)","Weidenbach","Weidenberg","Weidenthal","Weiding","Weiherhammer","Weiherhof","Weikersheim","Weil am Rhein","Weil am Rhein Ost","Weil am Rhein-Gartenstadt","Weil am Rhein-Pfädlistraße","Weil der Stadt","Weil im Schönbuch Röte","Weil im Schönbuch Troppel","Weil im Schönbuch Untere Halde","Weilbach(Unterallg)","Weilbach(Unterfr)","Weilburg","Weiler (Brohltal)","Weiler(Rems)","Weilerswist","Weilerswist-Derkum","Weilheim(Oberbay)","Weilheim(Württ)","Weilimdorf","Weimar","Weimar Berkaer Bf","Weimar West","Weinbrennerplatz, Karlsruhe","Weinböhla Hp","Weinfelden","Weingarten Berg","Weingarten(Baden)","Weinheim(Bergstr)Hbf","Weinheim-Lützelsachsen","Weinsberg","Weinsberg West","Weinsberg/Ellhofen Gewerbegebiet","Weinweg, Karlsruhe","Weischlitz","Weisen","Weisenbach","Weisenheim(Sand)","Weiterstadt","Weixdorf","Weixdorf Bad","Weizen","Weizern-Hopferau","Weißandt-Gölzau","Weißenau","Weißenburg(Bay)","Weißenfels","Weißenfels West","Weißenhorn","Weißenhorn-Eschach","Weißenohe","Weißenthurm","Weißer See","Weißes Roß","Weißwasser(Oberlausitz)","Welgesheim-Zotzenheim","Welkenraedt","Welkers","Wellen(Magdeburg)","Wellen(Mosel)","Wellendorf","Wellmitz","Wels Hbf","Welschen Ennest","Welschingen-Neuhausen","Welver","Wemmetsweiler Rathaus","Wendisch Evern","Wendisch-Rietz","Wendling b.Haag","Wendlingen(Neckar)","Wennedach","Wennigsen(Deister)","Wensickendorf","Werbig","Werdau","Werdau Nord","Werder(Havel)","Werderstraße, Karlsruhe","Werdohl","Werdorf","Werfen","Werl","Wernau(Neckar)","Wernberg","Werne a d Lippe","Werneuchen","Wernfeld","Wernigerode Elmowerk","Wernigerode Hbf","Wernigerode Hochschule Harz","Wernigerode Westerntor","Wernigerode-Hasserode","Wernshausen","Wernstein","Wertach-Haslach","Wertheim","Wertheim-Bestenheid","Werther","Wesel","Wesel Feldmark","Wesel-Blumenkamp","Wesenberg","Wespelaar-Tildonk","Wesselburen","Wesseln","Westbarthausen","Westbevern","Westendorf","Westendorf in Tirol","Westerburg","Westerham","Westerhausen","Westerland (Sylt) Autoverladung","Westerland(Sylt)","Westerstede-Ocholt","Westerstetten","Westervoort","Westewitz-Hochweitzschen","Westhausen","Westheim(Schwab)","Westheim(Westf)","Westheim-Langendorf","Westönnen","Wetter(Hessen)","Wetter(Ruhr)","Wetterzeube","Wettingen","Wetzlar","Wezep","Weßling(Oberbay)","Wickede(Ruhr)","Wicklesgreuth","Wickrath","Wiebelskirchen","Wiemersdorf","Wien Floridsdorf","Wien Franz-Josefs-Bahnhof","Wien Hbf","Wien Hbf (Autoreisezuganlage)","Wien Hernals","Wien Hütteldorf","Wien Jedlersdorf","Wien Kaiserebersdorf","Wien Meidling","Wien Mitte","Wien Penzing","Wien Praterstern","Wien Simmering","Wien Stadlau","Wien Süßenbrunn","Wien Westbahnhof","Wiener Neustadt Hbf","Wiener Straße, Kassel","Wierden","Wieren","Wiesa(Erzgeb)","Wiesau(Oberpf)","Wiesbaden Hbf","Wiesbaden Ost","Wiesbaden-Biebrich","Wiesbaden-Erbenheim","Wiesbaden-Igstadt","Wiesbaden-Schierstein","Wiesenau","Wiesenburg(Mark)","Wiesenburg(Sachs)","Wiesenfeld","Wiesenfeld(b Coburg)","Wiesental","Wiesenthau","Wieslensdorf","Wiesloch-Walldorf","Wiesmühl(Alz)","Wiesthal","Wijchen","Wijhe","Wil SG","Wilburgstetten Bf","Wilchingen-Hallau","Wildau","Wildberg(Württ)","Wildeck-Bosserode","Wildeck-Hönebach","Wildeck-Obersuhl","Wildeshausen","Wildon","Wilferdingen-Singen","Wilgartswiesen","Wilhelmsdorf","Wilhelmshaven","Wilhelmshorst","Wilhelmshütte(Lahn)","Wilhelmsstraße/Stadtmuseum, Kassel","Wilhermsdorf","Wilhermsdorf Mitte","Wilischthal","Wilkau-Haßlau","Willebadessen","Willingen","Willmenrod","Willmering","Willsbach","Wilmersdorf(Angerm)","Wilnsdorf-Rudersdorf","Wilsenroth","Wilster","Wilthen","Wiltingen(Saar)","Wilwerwiltz","Wilwisheim","Wincheringen","Winden(Pfalz)","Windischeschenbach","Windischgarsten","Windsbach","Wingen-sur-Moder","Wingerode","Wingst","Winkelhaid","Winnenden","Winningen(Mosel)","Winninghausen","Winnweiler","Winschoten","Winsen(Luhe)","Winsum","Winterbach(b Schorndorf)","Winterberg(Westf)","Winterhausen","Wintermoor","Winterswijk","Winterswijk West","Winterthur","Wipperdorf","Wippra","Wirges","Wirtheim","Wismar","Wissembourg","Wissen(Sieg)","Wissingen","Wittbräucke","Witten Hbf","Witten-Annen Nord","Wittenbach","Wittenberge","Wittenhagen","Wittgensdorf Mitte","Wittgensdorf ob Bf","Wittighausen","Wittingen","Wittlich Hbf","Wittlingen","Wittmund","Wittstock(Dosse)","Witzenhausen Nord","Witzighausen","Witzschdorf","Witzwort","Wjasma","Woerden","Woffleben","Wohlen AG","Wohltorf","Woippy","Wolfach","Wolfartsweierer Straße, Karlsruhe","Wolfegg","Wolfen(Bitterfeld)","Wolfenbüttel","Wolferode","Wolfgang(Kr Hanau)","Wolfhagen","Wolfheze","Wolfratshausen","Wolfsburg Hbf","Wolfsgefärth","Wolfsmünster","Wolfstee","Wolfstein","Wolfurt","Wolgast","Wolgast Hafen","Wolgaster Fähre","Wolkenstein","Wolkersdorf im Weinviertel","Wolkramshausen","Wollbach(Baden)","Wolmirstedt","Wolterdingen(Han)","Woltersdorf/Nuthe-Urstromtal","Woltwiesche","Wolvega","Workum","Wormerveer","Worms Hbf","Worms-Pfeddersheim","Worpswede","Wremen","Wriezen","Wrist","Wroclaw Glowny","Wroclaw Lesnica","Wroclaw Nowy Dwor","Wulfen(Anh)","Wulfen(Westf)","Wulften","Wullenstetten","Wunsiedel-Holenbrunn","Wunstorf","Wuppertal Hbf","Wuppertal-Barmen","Wuppertal-Hahnenfurth/Düssel","Wuppertal-Langerfeld","Wuppertal-Oberbarmen","Wuppertal-Ronsdorf","Wuppertal-Sonnborn","Wuppertal-Steinbeck","Wuppertal-Unterbarmen","Wuppertal-Vohwinkel","Wuppertal-Zoologischer Garten","Wurlitz","Wurmlingen Mitte","Wurmlingen Nord","Wurzbach(Thür)","Wurzen","Wusterhausen(Dosse)","Wustermark","Wusterwitz","Wustrau-Radensleben","Wustweiler","Wutha","Wutike","Wutöschingen","Wyhlen","Wächterhof","Wächtersbach","Wädenswil","Wölfershausen","Wölfersheim-Södel","Wörgl Hbf","Wörlitz","Wörnitzstein","Wörrstadt","Wörsdorf","Wörth(Isar)","Wörth(Main)","Wörth(Rhein)","Wörth(Rhein) Alte Bahnmeisterei","Wörth(Rhein) Badallee","Wörth(Rhein) Badepark","Wörth(Rhein) Bienwaldhalle","Wörth(Rhein) Bürgerpark","Wörth(Rhein) Mozartstraße","Wörth(Rhein) Rathaus","Wörth(Rhein) Zügelstraße","Wössingen","Wössingen Ost","Wülfrath-Aprath","Wülknitz","Wünschendorf","Wünschendorf Nord","Wünsdorf-Waldstadt","Würgendorf","Würgendorf (Ort)","Würzbach(Saar)","Würzburg Hbf","Würzburg Süd","Würzburg-Zell","Wüstenbrand","Wüstenfelde","Wüstenselbitz","Wüsting","Xanten","Ybbs a.d. Donau","Yorckstraße, Karlsruhe","Yverdon-les-Bains","Yves-Gomezee","ZOB, Duderstadt","Zaandam","Zaandam Kogerveld","Zaandijk Zaanse Schans","Zabeltitz","Zachun","Zagan","Zagorje","Zagreb Glavni kolodvor","Zahna","Zainhammer","Zaisenhausen","Zaltbommel","Zandvoort aan Zee","Zapfendorf","Zarrendorf","Zary","Zasieki","Zawiercie","Zbaszynek","Zedelgem","Zeebrugge-Dorp","Zeesen","Zehdenick(Mark)","Zehdenick-Neuhof","Zeil","Zeithain","Zeitz","Zelezna Ruda centrum","Zelezna Ruda mesto","Zell am See","Zell am Ziller","Zell(Harmersbach)","Zell(Wiesental)","Zell-Romrod","Zella-Mehlis","Zella-Mehlis West","Zellendorf","Zellerthal","Zeltweg","Zempin","Zennern","Zepernick(Bernau)","Zeppelinheim","Zerbst/Anhalt","Zerkall","Zermatt","Zernsdorf","Zerrenthin","Zetten-Andelst","Zeulenroda unt Bf","Zeutern Bf","Zeutern Ost","Zeutern Sportplatz","Zeuthen","Zeutsch","Zevenaar","Zevenbergen","Zgorzelec","Zgorzelec Miasto","Zichem","Zidani Most","Ziegelbrücke","Zielitz","Zielitz Ort","Zielona Gora Gl.","Zierenberg","Zierenberg-Rosental","Ziesar","Zieverich","Zillendorf","Ziltendorf","Zimmern(Main-Tauber)","Zimmern(b Seckach)","Zimmersrode","Zinnowitz","Zirl","Zirndorf","Zirndorf Kneippallee","Zirovice-Seniky","Zirtow-Leussow","Zittau","Zittau Hp","Zittau Süd","Zittau Vorstadt","Zizers","Zoblitz","Zoetermeer","Zoetermeer Oost","Zofingen","Zolder","Zollhaus(Villingen-Schwenningen)","Zollhaus-Petersthal","Zopten","Zorneding","Zossen","Zotzenbach","Zschaitz","Zscherben","Zschopau","Zschopau Ost","Zschortau","Zug(CH)","Zuidbroek","Zuidhorn","Zusenhofen","Zutphen","Zuzenhausen","Zweibrücken Hbf","Zweidlen","Zwenkau-Großdalzig","Zwickau Stadthalle","Zwickau Zentrum","Zwickau(Sachs)Hbf","Zwickau-Pölbitz","Zwickau-Schedewitz","Zwiesel(Bay)","Zwieselau","Zwijndrecht(NL)","Zwingenberg(Baden)","Zwingenberg(Bergstr)","Zwolle","Zwolle Stadshagen","Zwota","Zwota-Zechenbach","Zwotental","Zwönitz","Zöberitz","Zörnigall","Zühlsdorf","Zülpich","Zürich Altstetten","Zürich Enge","Zürich Flughafen","Zürich HB","Zürich Hardbrücke","Zürich Oerlikon","Zürich Stadelhofen","Zürich Wiedikon","Zürich Wollishofen","Züssow","Züttlingen","s-Hertogenbosch","s-Hertogenbosch Oost","t Harde","Äpfingen","Öhringen Hbf","Öhringen West","Öhringen-Cappel","Ölbronn-Dürrn","Ötigheim","Ötisheim","Ötztal","Übach-Palenberg","Überlingen","Überlingen Therme","Überlingen-Nußdorf","Übersee","Ückeritz","Üdingen","Ürzig(DB)"]})}),$(function(){$(".moresettings-header").each(function(){$(this).click(function(){var e=$(".moresettings");$(this).hasClass("moresettings-header-collapsed")?($(this).removeClass("moresettings-header-collapsed"),$(this).addClass("moresettings-header-expanded"),e.removeClass("moresettings-collapsed"),e.addClass("moresettings-expanded")):($(this).removeClass("moresettings-header-expanded"),$(this).addClass("moresettings-header-collapsed"),e.removeClass("moresettings-expanded"),e.addClass("moresettings-collapsed"))})}),$(".developers-header").each(function(){$(this).click(function(){var e=$(".developers");$(this).hasClass("developers-header-collapsed")?($(this).removeClass("developers-header-collapsed"),$(this).addClass("developers-header-expanded"),e.removeClass("developers-collapsed"),e.addClass("developers-expanded")):($(this).removeClass("developers-header-expanded"),$(this).addClass("developers-header-collapsed"),e.removeClass("developers-expanded"),e.addClass("developers-collapsed"))})}),dbf_reg_handlers(),$(".content .app").length&&(setTimeout(reload_app,3e4),history.replaceState({page:"station"},document.title,"")),window.onpopstate=function(n){var r;null!=n.state?"station"==n.state.page?($(".moreinfo").each(function(){$(this).removeClass("expanded-moreinfo"),$(this).addClass("collapsed-moreinfo")}),$("div.app > ul").length||($("div.app").append("<ul></ul>"),reload_app())):"traindetail"==n.state.page&&(r=!1,$("div.app > ul > li").each(function(){const e=$(this);e.data("no")==n.state.train&&(dbf_show_moreinfo(e,!0),r=!0)}),r||($(".moreinfo").each(function(){$(this).removeClass("collapsed-moreinfo"),$(this).addClass("expanded-moreinfo")}),$(".moreinfo .mfooter").append("Der Zug ist abgefahren (Zug nicht gefunden)"))):console.log("unhandled popstate! "+document.location)}});
+function setLang(e){document.cookie="lang="+e+";SameSite=None;Secure",location.reload()}function setTheme(e){localStorage.setItem("theme",e),otherTheme.hasOwnProperty(e)||(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"),addStyleSheet(e,"theme")}function reload_app(){0==$(".expanded-moreinfo").length?$.get(window.location.href,{ajax:1},function(e){$("div.app > ul").html(e),dbf_reg_handlers(),setTimeout(reload_app,6e4)}).fail(function(){setTimeout(reload_app,1e4)}):setTimeout(reload_app,3e4)}function dbf_show_moreinfo(d,s){const n=d.data("routeprev").split("|"),r=d.data("routenext").split("|"),l=d.data("moreinfo").split("|");$(".moreinfo").each(function(){var e=$(this);if(!s){$(".moreinfo .train-line").removeClass("sbahn fern ext ubahn bus tram").addClass(d.data("linetype")),$(".moreinfo .train-line").text(d.data("line")),$(".moreinfo .train-no").text(d.data("no")),$(".moreinfo .train-origin").text(d.data("from")),$(".moreinfo .train-dest").text(d.data("to")),$(".moreinfo .minfo").text(""),$(".moreinfo .mfooter").html(""),$(".moreinfo .verbose").html(""),$(".moreinfo .mroute").html(""),$(".moreinfo ul").html("");var a="";if(""!=d.data("arrival")?a+='<div><div class="arrival">An: '+d.data("arrival")+"</div></div>":a+='<div><div class="arrival"></div></div>',""!=d.data("platform")?a+='<div><div class="platform">Gleis '+d.data("platform")+"</div></div>":a+='<div><div class="platform"></div></div>',""!=d.data("departure")?a+='<div><div class="departure">Ab: '+d.data("departure")+"</div></div>":a+='<div><div class="departure"></div></div>',$(".moreinfo .mfooter").append('<div class="dataline">'+a+"</div>"),0==$(".moreinfo .loading").length&&$(".moreinfo .mfooter").append('<div class="loading">Lade Daten, bitte warten...</div>'),""!=d.data("moreinfo")){var t="";for(i in l)t+="<li>"+l[i]+"</li>";$(".moreinfo .mfooter").append("Meldungen: <ul>"+t+"</ul>")}var o="";if(""!=d.data("routeprev"))for(var i in n)o+="<li>"+n[i]+"</li>";if(o+="<li><strong>"+document.title+"</strong></li>",""!=d.data("routenext"))for(var i in r)o+="<li>"+r[i]+"</li>";$(".moreinfo .mfooter").append('Fahrtverlauf: <ul class="mroute">'+o+"</ul>")}$.get(window.location.href,{train:d.data("train"),jid:d.data("jid"),ajax:1},function(e){$(".moreinfo").html(e)}).fail(function(){$(".moreinfo .mfooter").append("Der Zug ist abgefahren (Zug nicht gefunden)")}),e.removeClass("collapsed-moreinfo"),e.addClass("expanded-moreinfo")})}function dbf_reg_handlers(){$("div.app > ul > li").click(function(e){var a=$(this),t=$("div.app").data("station"),o=new URLSearchParams(window.location.search),e=(e.preventDefault(),"?");o.get("detailed")&&(e+="&detailed=1"),o.get("hafas")&&(e+="&hafas="+o.get("hafas")+"&highlight="+a.data("station")),o.get("past")&&(e+="&past=1"),(o.get("rt")||o.get("show_realtime"))&&(e+="&rt=1"),o.get("hafas")?history.pushState({page:"traindetail",jid:a.data("jid")},"test","/z/"+a.data("jid")+e):history.pushState({page:"traindetail",station:t,train:a.data("no")},"test","/z/"+a.data("train")+"/"+a.data("station")+e),dbf_show_moreinfo(a,!1)});const a=$(location).attr("hash").substr(1);var t;a&&(t=!1,$("div.app > ul > li").each(function(e){t||$(this).find(".anchor").each(function(){$(this).attr("id")==a&&(t=!0)})}),t)&&(t=!1,$("div.app > ul > li").each(function(e){t||($(this).find(".anchor").each(function(){$(this).attr("id")==a&&(t=!0)}),t?$(this).addClass("selected"):$(this).addClass("past"))}))}$(function(){$(".moresettings-header").each(function(){$(this).click(function(){var e=$(".moresettings");$(this).hasClass("moresettings-header-collapsed")?($(this).removeClass("moresettings-header-collapsed"),$(this).addClass("moresettings-header-expanded"),e.removeClass("moresettings-collapsed"),e.addClass("moresettings-expanded")):($(this).removeClass("moresettings-header-expanded"),$(this).addClass("moresettings-header-collapsed"),e.removeClass("moresettings-expanded"),e.addClass("moresettings-collapsed"))})}),$(".developers-header").each(function(){$(this).click(function(){var e=$(".developers");$(this).hasClass("developers-header-collapsed")?($(this).removeClass("developers-header-collapsed"),$(this).addClass("developers-header-expanded"),e.removeClass("developers-collapsed"),e.addClass("developers-expanded")):($(this).removeClass("developers-header-expanded"),$(this).addClass("developers-header-collapsed"),e.removeClass("developers-expanded"),e.addClass("developers-collapsed"))})}),dbf_reg_handlers(),$(".content .app").length&&(setTimeout(reload_app,3e4),history.replaceState({page:"station"},document.title,"")),window.onpopstate=function(a){var t;null!=a.state?"station"==a.state.page?($(".moreinfo").each(function(){$(this).removeClass("expanded-moreinfo"),$(this).addClass("collapsed-moreinfo")}),$("div.app > ul").length||($("div.app").append("<ul></ul>"),reload_app())):"traindetail"==a.state.page&&(t=!1,$("div.app > ul > li").each(function(){var e=$(this);e.data("no")==a.state.train&&(dbf_show_moreinfo(e,!0),t=!0)}),t||($(".moreinfo").each(function(){$(this).removeClass("collapsed-moreinfo"),$(this).addClass("expanded-moreinfo")}),$(".moreinfo .mfooter").append("Der Zug ist abgefahren (Zug nicht gefunden)"))):console.log("unhandled popstate! "+document.location)}});
diff --git a/public/static/js/geostop.js b/public/static/js/geostop.js
index 34ba58e..80e8311 100644
--- a/public/static/js/geostop.js
+++ b/public/static/js/geostop.js
@@ -1,24 +1,24 @@
/*
- * Copyright (C) 2020 Daniel Friesel
+ * Copyright (C) 2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
$(function() {
- var removeStatus = function() {
+ const removeStatus = function() {
$('div.candidatestatus').remove();
};
- var showError = function(header, message, code) {
- var errnode = $(document.createElement('div'));
+ const showError = function(header, message, code) {
+ const errnode = $(document.createElement('div'));
errnode.attr('class', 'error');
errnode.text(message);
- var headnode = $(document.createElement('strong'));
+ const headnode = $(document.createElement('strong'));
headnode.text(header);
errnode.prepend(headnode);
if (code) {
- var shortnode = $(document.createElement('div'));
+ const shortnode = $(document.createElement('div'));
shortnode.attr('class', 'errcode');
shortnode.text(code);
errnode.append(shortnode);
@@ -27,43 +27,48 @@ $(function() {
$('div.candidatelist').append(errnode);
};
- var processResult = function(data) {
+ const processResult = function(data) {
removeStatus();
if (data.error) {
showError('Backend-Fehler:', data.error, null);
} else if (data.candidates.length == 0) {
- showError('Keine Bahnhöfe in 70km Umkreis gefunden', '', null);
+ showError('Keine Stationen in 70km Umkreis gefunden', '', null);
} else {
$.each(data.candidates, function(i, candidate) {
- var ds100 = candidate.ds100,
+ const eva = candidate.eva,
name = candidate.name,
- distance = candidate.distance;
- distance = distance.toFixed(1);
+ distance = candidate.distance.toFixed(1),
+ hafas = candidate.hafas;
- var stationlink = $(document.createElement('a'));
- stationlink.attr('href', ds100);
- stationlink.text(name);
+ const stationlink = $(document.createElement('a'));
+ stationlink.attr('href', eva + '?hafas=' + hafas);
+ stationlink.text(name + ' ');
- var distancenode = $(document.createElement('div'));
+ const distancenode = $(document.createElement('div'));
distancenode.attr('class', 'distance');
distancenode.text(distance);
+ const icon = $(document.createElement('i'));
+ icon.attr('class', 'material-icons');
+ icon.text(hafas ? 'directions' : 'train');
+
+ stationlink.append(icon);
stationlink.append(distancenode);
$('div.candidatelist').append(stationlink);
});
}
};
- var processLocation = function(loc) {
+ const processLocation = function(loc) {
$.post('/_geolocation', {lon: loc.coords.longitude, lat: loc.coords.latitude}, processResult).fail(function(jqXHR, textStatus, errorThrown) {
removeStatus();
showError("Netzwerkfehler: ", textStatus, errorThrown);
});
- $('div.candidatestatus').text('Suche Bahnhöfe…');
+ $('div.candidatestatus').text('Suche Stationen…');
};
- var processError = function(error) {
+ const processError = function(error) {
removeStatus();
if (error.code == error.PERMISSION_DENIED) {
showError('Standortanfrage nicht möglich.', 'Vermutlich fehlen die Rechte im Browser oder der Android Location Service ist deaktiviert.', 'geolocation.error.PERMISSION_DENIED');
diff --git a/public/static/js/geostop.min.js b/public/static/js/geostop.min.js
index 98e710b..8a5db00 100644
--- a/public/static/js/geostop.min.js
+++ b/public/static/js/geostop.min.js
@@ -1 +1 @@
-$(function(){function t(e){r(),e.error?o("Backend-Fehler:",e.error,null):0==e.candidates.length?o("Keine Bahnhöfe in 70km Umkreis gefunden","",null):$.each(e.candidates,function(e,t){var n=t.ds100,r=t.name,o=(o=t.distance).toFixed(1),t=$(document.createElement("a"));t.attr("href",n),t.text(r);r=$(document.createElement("div"));r.attr("class","distance"),r.text(o),t.append(r),$("div.candidatelist").append(t)})}var r=function(){$("div.candidatestatus").remove()},o=function(e,t,n){var r=$(document.createElement("div"));r.attr("class","error"),r.text(t);t=$(document.createElement("strong"));t.text(e),r.prepend(t),n&&((t=$(document.createElement("div"))).attr("class","errcode"),t.text(n),r.append(t)),$("div.candidatelist").append(r)};navigator.geolocation?(navigator.geolocation.getCurrentPosition(function(e){$.post("/_geolocation",{lon:e.coords.longitude,lat:e.coords.latitude},t).fail(function(e,t,n){r(),o("Netzwerkfehler: ",t,n)}),$("div.candidatestatus").text("Suche Bahnhöfe…")},function(e){r(),e.code==e.PERMISSION_DENIED?o("Standortanfrage nicht möglich.","Vermutlich fehlen die Rechte im Browser oder der Android Location Service ist deaktiviert.","geolocation.error.PERMISSION_DENIED"):e.code==e.POSITION_UNAVAILABLE?o("Standort konnte nicht ermittelt werden","(Service nicht verfügbar)","geolocation.error.POSITION_UNAVAILABLE"):e.code==e.TIMEOUT?o("Standort konnte nicht ermittelt werden","(Timeout)","geolocation.error.TIMEOUT"):o("Standort konnte nicht ermittelt werden","(unbekannter Fehler)","unknown geolocation.error code")}),$("div.candidatestatus").text("Position wird bestimmt…")):(r(),o("Standortanfragen werden von diesem Browser nicht unterstützt","",null))});
+$(function(){function t(e){o(),e.error?r("Backend-Fehler:",e.error,null):0==e.candidates.length?r("Keine Stationen in 70km Umkreis gefunden","",null):$.each(e.candidates,function(e,t){var n=t.eva,o=t.name,r=t.distance.toFixed(1),t=t.hafas,a=$(document.createElement("a")),n=(a.attr("href",n+"?hafas="+t),a.text(o+" "),$(document.createElement("div"))),o=(n.attr("class","distance"),n.text(r),$(document.createElement("i")));o.attr("class","material-icons"),o.text(t?"directions":"train"),a.append(o),a.append(n),$("div.candidatelist").append(a)})}const o=function(){$("div.candidatestatus").remove()},r=function(e,t,n){var o=$(document.createElement("div")),t=(o.attr("class","error"),o.text(t),$(document.createElement("strong")));t.text(e),o.prepend(t),n&&((e=$(document.createElement("div"))).attr("class","errcode"),e.text(n),o.append(e)),$("div.candidatelist").append(o)};navigator.geolocation?(navigator.geolocation.getCurrentPosition(function(e){$.post("/_geolocation",{lon:e.coords.longitude,lat:e.coords.latitude},t).fail(function(e,t,n){o(),r("Netzwerkfehler: ",t,n)}),$("div.candidatestatus").text("Suche Stationen…")},function(e){o(),e.code==e.PERMISSION_DENIED?r("Standortanfrage nicht möglich.","Vermutlich fehlen die Rechte im Browser oder der Android Location Service ist deaktiviert.","geolocation.error.PERMISSION_DENIED"):e.code==e.POSITION_UNAVAILABLE?r("Standort konnte nicht ermittelt werden","(Service nicht verfügbar)","geolocation.error.POSITION_UNAVAILABLE"):e.code==e.TIMEOUT?r("Standort konnte nicht ermittelt werden","(Timeout)","geolocation.error.TIMEOUT"):r("Standort konnte nicht ermittelt werden","(unbekannter Fehler)","unknown geolocation.error code")}),$("div.candidatestatus").text("Position wird bestimmt…")):(o(),r("Standortanfragen werden von diesem Browser nicht unterstützt","",null))});
diff --git a/public/static/js/geotrain.js b/public/static/js/geotrain.js
deleted file mode 100644
index 9df546b..0000000
--- a/public/static/js/geotrain.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright (C) 2020 Daniel Friesel
- *
- * SPDX-License-Identifier: AGPL-3.0-or-later
- */
-
-$(function() {
- var removeStatus = function() {
- $('div.candidatestatus').remove();
- };
- var showError = function(header, message, code) {
- var errnode = $(document.createElement('div'));
- errnode.attr('class', 'error');
- errnode.text(message);
-
- var headnode = $(document.createElement('strong'));
- headnode.text(header);
- errnode.prepend(headnode);
-
- if (code) {
- var shortnode = $(document.createElement('div'));
- shortnode.attr('class', 'errcode');
- shortnode.text(code);
- errnode.append(shortnode);
- }
-
- $('div.candidatelist').append(errnode);
- };
-
- var processResult = function(data) {
- removeStatus();
- if (data.error) {
- showError('Backend-Fehler:', data.error, null);
- } else if (data.evas.length == 0) {
- showError('Keine Bahnstrecke gefunden', '', null);
- } else if (data.trains.length == 0) {
- showError('Keine Züge auf der Strecke gefunden', '', null);
- } else {
- $.each(data.trains, function(i, train) {
-
- const prev = train.stops[0][1]
- const prev_time = train.stops[0][2]
- const next_eva = train.stops[1][0]
- const next = train.stops[1][1]
- const next_time = train.stops[1][2]
-
- var stationlink = $(document.createElement('a'));
- stationlink.attr('href', '/z/' + train.train + '/' + next_eva);
- stationlink.text(train.line);
-
- var distancenode = $(document.createElement('div'));
- distancenode.attr('class', 'traininfo');
- distancenode.html(train.likelihood + '%<br/>' + prev_time + ' ' + prev + '<br/>' + next_time + ' ' + next);
-
- stationlink.append(distancenode);
- $('div.candidatelist').append(stationlink);
- });
- }
- };
-
- var processLocation = function(loc) {
- $.get('https://dbf.finalrewind.org/__geotrain/search', {lon: loc.coords.longitude, lat: loc.coords.latitude}, processResult).fail(function(jqXHR, textStatus, errorThrown) {
- removeStatus();
- showError("Netzwerkfehler: ", textStatus, errorThrown);
- });
- $('div.candidatestatus').text('Suche Züge…');
- };
-
- var processError = function(error) {
- removeStatus();
- if (error.code == error.PERMISSION_DENIED) {
- showError('Standortanfrage nicht möglich.', 'Vermutlich fehlen die Rechte im Browser oder der Android Location Service ist deaktiviert.', 'geolocation.error.PERMISSION_DENIED');
- } else if (error.code == error.POSITION_UNAVAILABLE) {
- showError('Standort konnte nicht ermittelt werden', '(Service nicht verfügbar)', 'geolocation.error.POSITION_UNAVAILABLE');
- } else if (error.code == error.TIMEOUT) {
- showError('Standort konnte nicht ermittelt werden', '(Timeout)', 'geolocation.error.TIMEOUT');
- } else {
- showError('Standort konnte nicht ermittelt werden', '(unbekannter Fehler)', 'unknown geolocation.error code');
- }
- };
-
- if (navigator.geolocation) {
- navigator.geolocation.getCurrentPosition(processLocation, processError);
- $('div.candidatestatus').text('Position wird bestimmt…');
- } else {
- removeStatus();
- showError('Standortanfragen werden von diesem Browser nicht unterstützt', '', null);
- }
-});
diff --git a/public/static/js/geotrain.min.js b/public/static/js/geotrain.min.js
deleted file mode 100644
index 910bc1c..0000000
--- a/public/static/js/geotrain.min.js
+++ /dev/null
@@ -1 +0,0 @@
-$(function(){function t(e){r(),e.error?o("Backend-Fehler:",e.error,null):0==e.evas.length?o("Keine Bahnstrecke gefunden","",null):0==e.trains.length?o("Keine Züge auf der Strecke gefunden","",null):$.each(e.trains,function(e,t){var n=t.stops[0][1],r=t.stops[0][2],o=t.stops[1][0],i=t.stops[1][1],a=t.stops[1][2],d=$(document.createElement("a"));d.attr("href","/z/"+t.train+"/"+o),d.text(t.line);o=$(document.createElement("div"));o.attr("class","traininfo"),o.html(t.likelihood+"%<br/>"+r+" "+n+"<br/>"+a+" "+i),d.append(o),$("div.candidatelist").append(d)})}var r=function(){$("div.candidatestatus").remove()},o=function(e,t,n){var r=$(document.createElement("div"));r.attr("class","error"),r.text(t);t=$(document.createElement("strong"));t.text(e),r.prepend(t),n&&((t=$(document.createElement("div"))).attr("class","errcode"),t.text(n),r.append(t)),$("div.candidatelist").append(r)};navigator.geolocation?(navigator.geolocation.getCurrentPosition(function(e){$.get("https://dbf.finalrewind.org/__geotrain/search",{lon:e.coords.longitude,lat:e.coords.latitude},t).fail(function(e,t,n){r(),o("Netzwerkfehler: ",t,n)}),$("div.candidatestatus").text("Suche Züge…")},function(e){r(),e.code==e.PERMISSION_DENIED?o("Standortanfrage nicht möglich.","Vermutlich fehlen die Rechte im Browser oder der Android Location Service ist deaktiviert.","geolocation.error.PERMISSION_DENIED"):e.code==e.POSITION_UNAVAILABLE?o("Standort konnte nicht ermittelt werden","(Service nicht verfügbar)","geolocation.error.POSITION_UNAVAILABLE"):e.code==e.TIMEOUT?o("Standort konnte nicht ermittelt werden","(Timeout)","geolocation.error.TIMEOUT"):o("Standort konnte nicht ermittelt werden","(unbekannter Fehler)","unknown geolocation.error code")}),$("div.candidatestatus").text("Position wird bestimmt…")):(r(),o("Standortanfragen werden von diesem Browser nicht unterstützt","",null))});
diff --git a/public/static/js/map-refresh.js b/public/static/js/map-refresh.js
index 30f599d..0389323 100644
--- a/public/static/js/map-refresh.js
+++ b/public/static/js/map-refresh.js
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2020 Daniel Friesel
+ * Copyright (C) 2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
@@ -68,7 +68,8 @@ function dbf_anim_fine() {
}
function dbf_map_reload() {
- $.get('/_ajax_mapinfo/' + j_reqid, function(data) {
+ const param = new URLSearchParams(window.location.search);
+ $.get('/_ajax_mapinfo/' + j_reqid + '?hafas=' + param.get('hafas'), function(data) {
$('#infobox').html(data);
dbf_map_parse();
setTimeout(dbf_map_reload, 61000);
diff --git a/public/static/js/map-refresh.min.js b/public/static/js/map-refresh.min.js
index 215074b..b988098 100644
--- a/public/static/js/map-refresh.min.js
+++ b/public/static/js/map-refresh.min.js
@@ -1 +1 @@
-var j_reqid,j_positions=[],j_frame=[],j_frame_i=[];function dbf_map_parse(){$("#jdata").each(function(){j_reqid=$(this).data("req");var a=$(this).data("poly");if(a)for(var e in a=a.split("|"),j_positions=[],a){e=a[e].split(";");e[0]=parseFloat(e[0]),e[1]=parseFloat(e[1]),j_positions.push(e)}})}function dbf_anim_coarse(){if(j_positions.length){var a=marker.getLatLng(),e=a.lat,i=a.lng,a=j_positions.shift(),_=a[0],t=a[1];j_frame_i=200,j_frame=[];for(var f=1;f<=60;f++){var r=f/60;j_frame.push([e+(_-e)*r,i+(t-i)*r])}j_frame_i=0}}function dbf_anim_fine(){j_frame[j_frame_i]&&marker.setLatLng(j_frame[j_frame_i++])}function dbf_map_reload(){$.get("/_ajax_mapinfo/"+j_reqid,function(a){$("#infobox").html(a),dbf_map_parse(),setTimeout(dbf_map_reload,61e3)}).fail(function(){setTimeout(dbf_map_reload,5e3)})}$(document).ready(function(){$("#infobox").length&&(dbf_map_parse(),setInterval(dbf_anim_coarse,2e3),setInterval(dbf_anim_fine,33),setTimeout(dbf_map_reload,61e3))});
+var j_reqid,j_positions=[],j_frame=[],j_frame_i=[];function dbf_map_parse(){$("#jdata").each(function(){j_reqid=$(this).data("req");var a=$(this).data("poly");if(a)for(var e in a=a.split("|"),j_positions=[],a){e=a[e].split(";");e[0]=parseFloat(e[0]),e[1]=parseFloat(e[1]),j_positions.push(e)}})}function dbf_anim_coarse(){if(j_positions.length){var a=marker.getLatLng(),e=a.lat,i=a.lng,a=j_positions.shift(),_=a[0],t=a[1];j_frame_i=200,j_frame=[];for(var r=1;r<=60;r++){var f=r/60;j_frame.push([e+(_-e)*f,i+(t-i)*f])}j_frame_i=0}}function dbf_anim_fine(){j_frame[j_frame_i]&&marker.setLatLng(j_frame[j_frame_i++])}function dbf_map_reload(){var a=new URLSearchParams(window.location.search);$.get("/_ajax_mapinfo/"+j_reqid+"?hafas="+a.get("hafas"),function(a){$("#infobox").html(a),dbf_map_parse(),setTimeout(dbf_map_reload,61e3)}).fail(function(){setTimeout(dbf_map_reload,5e3)})}$(document).ready(function(){$("#infobox").length&&(dbf_map_parse(),setInterval(dbf_anim_coarse,2e3),setInterval(dbf_anim_fine,33),setTimeout(dbf_map_reload,61e3))});
diff --git a/public/static/v56 b/public/static/v89
index 945c9b4..945c9b4 120000
--- a/public/static/v56
+++ b/public/static/v89
diff --git a/public/static/v57 b/public/static/v90
index 945c9b4..945c9b4 120000
--- a/public/static/v57
+++ b/public/static/v90
diff --git a/sass/app.scss b/sass/app.scss
index f6f3128..f72203e 100644
--- a/sass/app.scss
+++ b/sass/app.scss
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2020 Daniel Friesel
+ * Copyright (C) 2011-2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -10,7 +10,7 @@ body {
}
html {
- font-family: Sans-Serif;
+ font-family: "Arimo", "Arial", Sans-Serif;
}
a {
@@ -30,6 +30,7 @@ a {
p,
div.about,
+div.config,
div.input-field,
div.notes {
max-width: 94%;
@@ -266,6 +267,11 @@ div.app {
background-color: $cancelled-bg-color;
}
+ &.past {
+ opacity: 0.8;
+ background-color: $past-bg-color;
+ }
+
> a {
color:$fg;
}
@@ -311,51 +317,45 @@ div.app {
left:2px;
}
- .route {
+ .route, .info {
background-color: transparent;
font-size:2.1em;
position:absolute;
- top:1px;
- left:7.7em;
+ top: 0;
+ left: 7.7em;
right: 7em;
- height: 1.2em;
+ height: 1.5em;
overflow: hidden;
+ white-space: nowrap;
+ }
+
+ .route {
color: $route-color;
}
.info {
color: $info-color;
- background-color: transparent;
- font-size:2.1em;
- position:absolute;
- top:1px;
- left:7.7em;
- right: 7em;
- height: 1.2em;
- overflow: hidden;
}
- .dest {
+ .dest, .origin {
background-color: transparent;
font-size:4em;
position:absolute;
- top:0.62em;
+ bottom:0;
left:4em;
- bottom:0px;
width: 70%;
+ white-space: nowrap;
overflow: hidden;
color: $fg;
}
+ .dest {
+ background-color: transparent;
+ color: $fg;
+ }
+
.origin {
background-color: transparent;
- font-size:4em;
- position:absolute;
- top:0.62em;
- left:4em;
- bottom:0px;
- width: 70%;
- overflow: hidden;
color: $fg2;
&:before {
@@ -369,7 +369,7 @@ div.app {
font-weight: bold;
position: absolute;
right: 5px;
- bottom: 2px;
+ bottom: 0;
padding-left: 0.2em;
color: $fg;
}
@@ -384,7 +384,7 @@ div.app {
font-size:2.3em;
position:absolute;
right:5px;
- top:4px;
+ top:1px;
padding-left: 0.2em;
color: $fg;
@@ -417,13 +417,11 @@ div.app {
.delaynorm {
font-size:0.9em;
color: $delaynorm-color;
- padding-right: 1ex;
}
.undelaynorm {
font-size:0.9em;
color: $undelaynorm-color;
- padding-right: 1ex;
}
}
}
@@ -471,6 +469,22 @@ div.app {
border: 2px solid $bahn-color;
}
+ .tram, .bus, .ubahn {
+ padding:3px 5px 2px 5px;
+ }
+
+ .tram {
+ background-color: $tram-color;
+ }
+
+ .bus {
+ background-color: $bus-color;
+ }
+
+ .ubahn {
+ background-color: $ubahn-color;
+ }
+
.moreinfo {
font-size:2.1em;
position:fixed;
@@ -509,13 +523,24 @@ div.app {
width: 100%;
display: flex;
justify-content: space-between;
- margin-bottom: 1em;
+ margin-bottom: 0.5em;
> div {
width: 33%;
}
}
+ .wagonorder-preview {
+ font-size: 110%;
+ width: 100%;
+ text-align: center;
+ margin-bottom: 1em;
+
+ a {
+ color: $fg;
+ }
+ }
+
.departure {
text-align: right;
}
@@ -539,6 +564,10 @@ div.app {
color: $info-color;
}
+ .timehidden {
+ color: $fg2;
+ }
+
.undelay {
color: $undelay-color;
}
@@ -551,6 +580,16 @@ div.app {
}
}
+ .messages {
+ i.material-icons {
+ font-size: 14px;
+ }
+ }
+
+ .details {
+ margin-top: 1em;
+ }
+
.mroute {
.important-stop {
color: $fg;
@@ -575,6 +614,10 @@ div.app {
.future-stop {
list-style-type: circle;
}
+
+ i.material-icons {
+ font-size: 14px;
+ }
}
.db-attr {
@@ -638,15 +681,27 @@ div.candidatelist a .traininfo {
padding-bottom: 0.3em;
}
-div.about {
+div.config {
margin-top: 2em;
font-family: Sans-Serif;
color: $fg2;
+
+ a {
+ color: $link-color;
+ cursor: pointer;
+ text-decoration: none;
+ }
}
-div.about a {
- color: $link-color;
- text-decoration: none;
+div.about {
+ margin-top: 1em;
+ font-family: Sans-Serif;
+ color: $fg2;
+
+ a {
+ color: $link-color;
+ text-decoration: none;
+ }
}
.notice {
@@ -784,6 +839,13 @@ div.field {
margin-right: 0.5ex;
}
+.smallbutton img {
+ display: block;
+ float: left;
+ margin-right: 0.7ex;
+ height: 1.2em;
+}
+
input, select, .button {
display: inline-block;
width: 60em;
diff --git a/sass/dark.scss b/sass/dark.scss
index 725b8dd..72a6927 100644
--- a/sass/dark.scss
+++ b/sass/dark.scss
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2020 Daniel Friesel
+ * Copyright (C) 2011-2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -24,6 +24,9 @@ $sbahn-color: #115511;
$bahn-color: #333333;
$fern-color: #551111;
$ext-border-color: #993333;
+$tram-color: #441111;
+$ubahn-color: #071e62;
+$bus-color: #551155;
$route-color: #dddddd;
@@ -37,6 +40,7 @@ $additional-stop-color: #77ff77;
$cancelled-stop-color: #ff7777;
$cancelled-bg-color: #512f00;
+$past-bg-color: $bg05;
$firstclass-wagon-color: #333300;
$powercar-wagon-color: #222222;
diff --git a/sass/light.scss b/sass/light.scss
index 156077f..809c8ce 100644
--- a/sass/light.scss
+++ b/sass/light.scss
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011-2020 Daniel Friesel
+ * Copyright (C) 2011-2020 Birte Kristina Friesel
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -24,6 +24,9 @@ $sbahn-color: #95d79f;
$bahn-color: #eeeeee;
$fern-color: #ffdddd;
$ext-border-color: #ff6666;
+$tram-color: #ffcccc;
+$ubahn-color: #aac0ff;
+$bus-color: #eeaaee;
$route-color: #444444;
@@ -37,6 +40,7 @@ $additional-stop-color: #009900;
$cancelled-stop-color: #cc0000;
$cancelled-bg-color: #ffe7d0;
+$past-bg-color: $bg05;
$firstclass-wagon-color: #ffff99;
$powercar-wagon-color: #cccccc;
diff --git a/scripts/asset-rebuild b/scripts/asset-rebuild
index f956d4c..09597ad 100755
--- a/scripts/asset-rebuild
+++ b/scripts/asset-rebuild
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2020 Daniel Friesel
+# Copyright (C) 2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: CC0-1.0
@@ -8,10 +8,7 @@ set -ex
sassc -t compressed sass/dark.scss public/static/css/dark.min.css
sassc -t compressed sass/light.scss public/static/css/light.min.css
-scripts/update-autocomplete
-
-uglifyjs public/static/js/autocomplete.js public/static/js/collapse.js -c -m > public/static/js/dbf.min.js
+uglifyjs public/static/js/collapse.js -c -m > public/static/js/dbf.min.js
uglifyjs public/static/js/geostop.js -c -m > public/static/js/geostop.min.js
-uglifyjs public/static/js/geotrain.js -c -m > public/static/js/geotrain.min.js
uglifyjs public/static/js/map-refresh.js -c -m > public/static/js/map-refresh.min.js
uglifyjs public/static/js/marquee.js -c -m > public/static/js/marquee.min.js
diff --git a/scripts/asset-release b/scripts/asset-release
index b01c441..5714745 100755
--- a/scripts/asset-release
+++ b/scripts/asset-release
@@ -1,5 +1,5 @@
#!/bin/sh
-# Copyright (C) 2020 Daniel Friesel
+# Copyright (C) 2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: CC0-1.0
diff --git a/scripts/update-autocomplete b/scripts/update-autocomplete
deleted file mode 100755
index 1ba837b..0000000
--- a/scripts/update-autocomplete
+++ /dev/null
@@ -1,29 +0,0 @@
-#!/usr/bin/env perl
-# Copyright (C) 2020 Daniel Friesel
-#
-# SPDX-License-Identifier: CC0-1.0
-
-use strict;
-use warnings;
-use 5.020;
-
-use JSON;
-use File::Slurp qw(write_file);
-use Travel::Status::DE::IRIS::Stations;
-
-my @station_names = map { $_->[1] } Travel::Status::DE::IRIS::Stations::get_stations();
-
-my $station_json = JSON->new->utf8->encode([@station_names]);
-
-my $autocomplete = <<"EOF";
-\$(function() {
- var stations = $station_json;
- \$('input.station').autocomplete({
- delay: 0,
- minLength: 3,
- source: stations
- });
-});
-EOF
-
-write_file("public/static/js/autocomplete.js", $autocomplete);
diff --git a/t/01-basic.t b/t/01-basic.t
index 41ac6e5..f55633a 100644
--- a/t/01-basic.t
+++ b/t/01-basic.t
@@ -1,5 +1,5 @@
#!/usr/bin/env perl
-# Copyright (C) 2020 Daniel Friesel
+# Copyright (C) 2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: CC0-1.0
@@ -10,6 +10,6 @@ use FindBin;
require "$FindBin::Bin/../index.pl";
my $t = Test::Mojo->new('DBInfoscreen');
-$t->get_ok('/')->status_is(200)->content_like(qr/db-infoscreen/);
+$t->get_ok('/')->status_is(200)->content_like(qr/DBF/);
done_testing();
diff --git a/t/22-json.t b/t/22-json.t
index dacbf6f..c133751 100644
--- a/t/22-json.t
+++ b/t/22-json.t
@@ -1,5 +1,5 @@
#!/usr/bin/env perl
-# Copyright (C) 2020 Daniel Friesel
+# Copyright (C) 2020 Birte Kristina Friesel
#
# SPDX-License-Identifier: CC0-1.0
diff --git a/templates/_intersection_infobox.html.ep b/templates/_intersection_infobox.html.ep
deleted file mode 100644
index cb27d19..0000000
--- a/templates/_intersection_infobox.html.ep
+++ /dev/null
@@ -1,22 +0,0 @@
-<div class="container" id="infobox2" style="margin-top: 1ex; margin-bottom: 1ex;">
-<div class="journey" id="jdata"
-data-req="<%= stash('ajax_req') %>"
-data-route="<%= stash('ajax_route') %>"
-data-poly="<%= stash('ajax_polyline') %>"
->
- <strong><%= stash('train1_no') %></strong>
- und
- <strong><%= stash('train2_no') %></strong>
- werden sich wahrscheinlich
- % if (my $t = stash('time')) {
- gegen <strong><%= $t->strftime('%H:%M') %> Uhr</strong>
- % }
- % if (my $p = stash('likely_pair')) {
- zwischen <strong><%= $p->[0] %></strong> und <strong><%= $p->[1] %></strong>
- % }
- % if (not stash('time')) {
- nicht
- % }
- begegnen.
-</div>
-</div>
diff --git a/templates/_map_infobox.html.ep b/templates/_map_infobox.html.ep
index 42e121d..7372802 100644
--- a/templates/_map_infobox.html.ep
+++ b/templates/_map_infobox.html.ep
@@ -1,6 +1,6 @@
<div class="container" id="infobox" style="margin-top: 1ex; margin-bottom: 1ex;">
<div class="journey" id="jdata"
-data-req="<%= stash('ajax_req') %>"
+data-req="<%= stash('ajax_req') =~ s{#}{%23}gr %>"
data-route="<%= stash('ajax_route') %>"
data-poly="<%= stash('ajax_polyline') %>"
>
@@ -14,7 +14,7 @@ data-poly="<%= stash('ajax_polyline') %>"
% if (my $next = stash('next_stop')) {
<div class="nextstop">
% if ($next->{type} eq 'present' and $next->{station}{dep} and $next->{station}{arr}) {
- Aufenthalt in <strong><%= $next->{station}{name} %></strong>
+ Aufenthalt in <strong><%= $next->{station}->loc->name %></strong>
% if ($next->{station}{platform}) {
an Gleis <strong><%= $next->{station}{platform} %></strong>
% }
@@ -24,7 +24,7 @@ data-poly="<%= stash('ajax_polyline') %>"
% }
% }
% elsif ($next->{type} eq 'present' and $next->{station}{dep}) {
- Abfahrt in <strong><%= $next->{station}{name} %></strong>
+ Abfahrt in <strong><%= $next->{station}->loc->name %></strong>
% if ($next->{station}{platform}) {
von Gleis <strong><%= $next->{station}{platform} %></strong>
% }
@@ -52,7 +52,7 @@ data-poly="<%= stash('ajax_polyline') %>"
% }
% elsif ($next->{type} eq 'next' and $next->{station}{arr}) {
Nächster Halt:
- <strong><%= $next->{station}{name} %></strong>
+ <strong><%= $next->{station}->loc->name %></strong>
um <strong><%= $next->{station}{arr}->strftime('%H:%M') %></strong>
% if ($next->{station}{arr_delay}) {
%= sprintf('(%+d)', $next->{station}{arr_delay})
@@ -63,7 +63,7 @@ data-poly="<%= stash('ajax_polyline') %>"
% }
% elsif ($next->{type} eq 'next') {
Nächster Halt:
- <strong><%= $next->{station}{name} %></strong>
+ <strong><%= $next->{station}->loc->name %></strong>
% if ($next->{station}{platform}) {
auf Gleis <strong><%= $next->{station}{platform} %></strong>
% }
diff --git a/templates/_train_attr.html.ep b/templates/_train_attr.html.ep
index 4f7e9ca..1b40d12 100644
--- a/templates/_train_attr.html.ep
+++ b/templates/_train_attr.html.ep
@@ -1,19 +1,18 @@
% if ($attr->{series}) {
- <span>BR <%= $attr->{series} %>
-% if ($attr->{series2}) {
- + <%= $attr->{series2} %>
-% }
- </span>
+ <span>BR <%= $attr->{series} %></span>
+% }
+% if ($attr->{vmax}) {
+ <span><%= $attr->{vmax} %> km/h</span>
% }
% if ($attr->{length}) {
<span>⇤ <%= $attr->{length} %>m ⇥</span>
% }
-% if ($attr->{vmax}) {
- <span><%= $attr->{vmax} %> km/h</span>
+% if ($attr->{weight}) {
+ <span><%= $attr->{weight} %>t</span>
% }
% if ($attr->{brakingPercentage}) {
<span>λ=<%= $attr->{brakingPercentage} %></span>
% }
-% if ($attr->{station} and $with_station) {
- <span>ab <%= $attr->{station} %></span>
+% if ($with_station and $attr->{range}[0]) {
+ <span>ab <%= $attr->{range}[0] %></span>
% }
diff --git a/templates/_train_details.html.ep b/templates/_train_details.html.ep
index 26c2eb4..24d2d55 100644
--- a/templates/_train_details.html.ep
+++ b/templates/_train_details.html.ep
@@ -2,9 +2,6 @@
<div>
% if ($departure->{train_no} or $departure->{train_line}) {
<span class="train-line <%= $linetype %>"><%= $departure->{train_type} %>
-% if ($linetype eq 'fern' and $icetype and $icetype->[1]) {
- <span class="trainsubtype" aria-hidden="true"><%= $icetype->[1] %></span>
-% }
<%= $departure->{train_line} // $departure->{train_no} %></span>
<span class="train-no"><%= $departure->{train_line} ? $departure->{train_no} : q{} %></span>
@@ -17,33 +14,11 @@
% }
<span class="train-dest"><%= $departure->{destination} // q{???} %></span>
</div>
-<!--
-% if ($departure->{is_cancelled}) {
- <div class="minfo">Fahrt fällt aus</div>
-% }
-% elsif (defined $departure->{delay} and $departure->{delay} > 0) {
- <div class="minfo">+<%= $departure->{delay} %>
-% if ($departure->{departure_is_cancelled}) {
- (endet hier)
-% }
- </div>
-% }
-% if (@{$departure->{replaced_by}}) {
-% for my $replacement (@{$departure->{replaced_by}}) {
- <span class="replaced">Ersatzzug: <%= $replacement %></span>
-% }
-% }
-% if (@{$departure->{replacement_for}}) {
-% for my $replacement (@{$departure->{replacement_for}}) {
- <span class="replacement">Ersatzzug für <%= $replacement %></span>
-% }
-% }
--->
</div> <!-- mheader -->
<div class="mfooter">
<div class="dataline">
<div>
- <div class="arrival">
+ <div class="arrival <%= $departure->{arrival_hidden} ? 'timehidden' : q{} %>">
% if ($departure->{is_cancelled} and $departure->{sched_arrival}) {
<span class="minfo">An: ––:––</span><br/>Plan: <%= $departure->{sched_arrival} %>
% }
@@ -52,7 +27,7 @@
% }
% elsif ($departure->{arrival}) {
% if ($departure->{arrival} ne $departure->{sched_arrival}) {
- % if ($departure->{delay} < 0) {
+ % if (($departure->{delay} // 0) < 0) {
An: <span class="undelay"><%= $departure->{arrival} %></span>
% }
% else {
@@ -64,10 +39,26 @@
An: <%= $departure->{arrival} %>
% }
% }
+% elsif ($departure->{sched_arrival}) {
+ An: <%= $departure->{sched_arrival} %>
+% }
+% elsif ($departure->{prep_time}) {
+ Ein: <%= $departure->{prep_time} %>
+% }
</div>
</div>
<div>
<div class="platform">
+% if (@{$departure->{replaced_by}}) {
+% for my $replacement (@{$departure->{replaced_by}}) {
+ <span class="replaced">Ersatzfahrt: <a href="/z/<%= $replacement %>/<%= stash('station_name') // q{} %>"><%= $replacement %></a></span><br/>
+% }
+% }
+% if (@{$departure->{replacement_for}}) {
+% for my $replacement (@{$departure->{replacement_for}}) {
+ <span class="replacement">Ersatzfahrt für <a href="/z/<%= $replacement %>/<%= stash('station_name') // q{} %>"><%= $replacement %></a></span><br/>
+% }
+% }
% if ($departure->{arrival_is_cancelled} and $departure->{departure_is_cancelled}) {
<span class="minfo">Fahrt fällt aus</span>
% }
@@ -88,10 +79,16 @@
<%= $left %>Gleis <%= $departure->{platform} // $departure->{scheduled_platform} %><%= $right %>
% }
% }
+% if ($departure->{arrival_hidden} and not $departure->{prep_time}) {
+ <br/><span class="timehidden">Nur Einstieg</span>
+% }
+% if ($departure->{departure_hidden}) {
+ <br/><span class="timehidden">Nur Ausstieg</span>
+% }
</div>
</div>
<div>
- <div class="departure">
+ <div class="departure <%= $departure->{departure_hidden} ? 'timehidden' : q{} %>">
% if ($departure->{is_cancelled} and $departure->{sched_departure}) {
<span class="minfo">Ab: ––:––</span><br/>Plan: <%= $departure->{sched_departure} %>
% }
@@ -107,27 +104,53 @@
Ab: <%= $departure->{departure} %>
% }
% }
+% elsif ($departure->{sched_departure}) {
+ Ab: <%= $departure->{sched_departure} %>
+% }
</div>
</div>
</div> <!-- dataline -->
+% if (my $wr = $departure->{wr}) {
+ <div class="wagonorder-preview">
+% my @wagons = $wr->wagons;
+% my $direction = $wr->direction ? $wr->direction == 100 ? '→' : '←' : q{};
+% if ($departure->{direction}) {
+% $direction = $departure->{direction} eq 'l' ? '◀' : '▶';
+% if (($departure->{direction} eq 'l' ? 0 : 100) != $wr->direction) {
+% @wagons = reverse @wagons;
+% }
+% }
+ <a href="/_wr/<%= $departure->{train_no} %>/<%= $departure->{wr_link} %>?e=<%= $departure->{direction} // '' %>">
+ %= $direction
+% my $gi;
+% for my $wagon (@wagons) {
+% if (not ($wagon->is_locomotive or $wagon->is_powercar)) {
+% if (defined $gi and $gi != $wagon->group_index) {
+ •
+% }
+%= $wagon->number || ($wagon->type =~ m{AB} ? '½' : $wagon->type =~ m{A} ? '1.' : $wagon->type =~ m{B} ? '2.' : '?' )
+% }
+% $gi = $wagon->group_index;
+% }
+ %= $direction
+ </a>
+ </div>
+% }
<div class="verbose">
% if ($departure->{trip_id}) {
% if (stash('station_name')) {
- <a class="smallbutton" href="/map/<%= $departure->{trip_id} %>/<%= $departure->{train_line} // 0 %>?from=<%= stash('station_name') %>"><i class="material-icons" aria-hidden="true">map</i> Karte</a>
+ <a class="smallbutton" href="/map/<%= $departure->{trip_id} =~ s{#}{%23}gr %>/<%= $departure->{train_line} // 0 %>?from=<%= stash('station_name') %>&amp;hafas=<%= param('hafas') // q{} %>"><i class="material-icons" aria-hidden="true">map</i> Karte</a>
% }
% else {
- <a class="smallbutton" href="/map/<%= $departure->{trip_id} %>/<%= $departure->{train_line} // 0 %>"><i class="material-icons" aria-hidden="true">map</i> Karte</a>
+ <a class="smallbutton" href="/map/<%= $departure->{trip_id} =~ s{#}{%23}gr %>/<%= $departure->{train_line} // 0 %>?hafas=<%= param('hafas') // q{} %>"><i class="material-icons" aria-hidden="true">map</i> Karte</a>
% }
% }
% if ($departure->{wr_link}) {
- <a class="smallbutton" href="/_wr/<%= $departure->{train_no} %>/<%= $departure->{wr_link} %>?e=<%= $departure->{direction} // '' %>"><i class="material-icons" aria-hidden="true">train</i> Wagenreihung
+ <a class="smallbutton" href="/_wr/<%= $departure->{train_no} %>/<%= $departure->{wr_link} %>?e=<%= $departure->{direction} // '' %>"><i class="material-icons" aria-hidden="true">train</i> <%= $departure->{wr_text} || 'Wagen' %>
</a>
% }
-% elsif ($icetype and $icetype->[2] and ($linetype eq 'fern' or $departure->{train_type} =~ m{NJ})) {
- <a class="smallbutton" href="/wr/<%= $departure->{train_no} %>"><i class="material-icons" aria-hidden="true">train</i> Plan: <%= $icetype->[0] %></a>
-% }
-% elsif ($icetype and $icetype->[1] and $linetype eq 'fern') {
- <span class="disabledbutton"><i class="material-icons" aria-hidden="true">train</i> Plan: <%= $icetype->[0] %></span>
+% if ($departure->{train_type} and $departure->{train_no}) {
+ <a class="smallbutton" href="https://bahn.expert/details/<%= $departure->{train_type} %>%20<%= $departure->{train_no} %>/<%= ($departure->{date} // DateTime->now(time_zone => 'Europe/Berlin'))->iso8601 %>?evaNumberAlongRoute=<%= $departure->{eva} %>"><img src="/static/icons/bahn-expert.svg">Details</a>
% }
% for my $link (@{$departure->{links}}) {
<a class="smallbutton" href="<%= $link->[1] %>"><i class="material-icons" aria-hidden="true">warning</i> <%= $link->[0] %></a>
@@ -161,11 +184,11 @@
% }
% if ($departure->{moreinfo} and @{$departure->{moreinfo}}) {
- Meldungen:
- <ul>
+ Meldungen
+ <ul class="messages">
% for my $pair (@{$departure->{moreinfo}}) {
<li>
-% if ($pair->[0]->isa('DateTime')) {
+% if (ref($pair->[0]) eq 'DateTime') {
% if ($pair->[0]->day != $dt_now->day) {
% $pair->[0]->set_locale('de_DE');
%= $pair->[0]->strftime('%a %H:%M')
@@ -173,16 +196,22 @@
% else {
%= $pair->[0]->strftime('%H:%M')
% }
+ <span class="reason">
+%= $pair->[1]
+ </span>
% }
% else {
+% if ($pair->[1]{icon}) {
+ <i class="material-icons"><%= $pair->[1]{icon} %></i>
+% }
%= $pair->[0]
% if (length($pair->[0]) > 25) {
<br/>
% }
+ <span class="reason">
+%= $pair->[1]{text}
+ </span>
% }
- <span class="reason">
-%= $pair->[1]
- </span>
</li>
% }
% if ($departure->{route_info}) {
@@ -191,11 +220,20 @@
</ul>
% }
% if ($departure->{route_pre_diff} and $departure->{route_post_diff}) {
- Fahrtverlauf:
+% if ($departure->{date}) {
+ Fahrtverlauf am
+% if (stash('train') !~ m{[|]}) {
+ <a href="<%= url_for('train', train => stash('train'))->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas'), date => $departure->{date}->clone->subtract(days => 1)->strftime('%d.%m.%Y'), highlight => param('highlight') // stash('station')}) %>">◀</a>
+% }
+%= $departure->{date}->strftime('%d.%m.%Y')
+% if (stash('train') !~ m{[|]}) {
+ <a href="<%= url_for('train', train => stash('train'))->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas'), date => $departure->{date}->clone->add(days => 1)->strftime('%d.%m.%Y'), highlight => param('highlight') // stash('station')}) %>">▶</a>
+% }
+% }
<ul class="mroute">
% for my $stop (@{$departure->{route_pre_diff}}) {
<li class="<%= $stop->{isPast} ? 'past-stop' : 'future-stop' %>">
- <a href="<%= url_for('station', station => $stop->{name})->query({detailed => param('detailed'), past => param('past')}) %>#<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>" class="
+ <a href="<%= url_for('station', station => $stop->{eva} // $stop->{name})->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas')}) %>#<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>" class="
% if ($stop->{isAdditional}) {
additional-stop
% }
@@ -208,39 +246,45 @@
% else {
generic-stop
% }
-% if ($stop->{rt_dep}) {
- "><%= $stop->{sched_dep}->strftime('%H:%M') %> (heute <%= $stop->{rt_dep}->strftime('%H:%M') %>) <%= $stop->{name} %></a>
+% if (($stop->{rt_dep} and $stop->{dep_delay}) or (not $stop->{rt_dep} and $stop->{rt_arr} and $stop->{arr_delay})) {
+ "><%= ($stop->{sched_dep} // $stop->{sched_arr})->strftime('%H:%M') %> (heute <%= ($stop->{rt_dep} // $stop->{rt_arr})->strftime('%H:%M') %>)
% }
% else {
- "><%= $stop->{sched_dep} ? $stop->{sched_dep}->strftime('%H:%M') : q{} %>
-% if ($stop->{rt_bogus}) {
- <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i>
-% }
- <%= $stop->{name} %></a>
+ "><%= ($stop->{sched_dep} // $stop->{sched_arr}) ? ($stop->{sched_dep} // $stop->{sched_arr})->strftime('%H:%M') : q{} %>
+% if ($stop->{rt_bogus}) {
+ <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i>
+% }
+% }
+ <%= $stop->{name} %></a>
+% if ($stop->{load}{FIRST} or $stop->{load}{SECOND}) {
+% my ($text, $icon1, $icon2) = utilization_icon([$stop->{load}{FIRST}, $stop->{load}{SECOND}]);
+ <i class="material-icons" aria-hidden="true"><%= $icon1 %></i>
+ <i class="material-icons" aria-hidden="true"><%= $icon2 %></i>
% }
</li>
% }
% if (stash('station_name')) {
<li class="<%= $departure->{is_cancelled} ? 'cancelled-stop' : q{} %> <%= $departure->{isPast} ? 'past-stop' : 'future-stop' %>"><%= $departure->{sched_departure} // $departure->{sched_arrival} // q{} %>
-% if ($departure->{sched_departure}) {
-% if ($departure->{departure} ne $departure->{sched_departure}) {
- (heute <%= $departure->{departure} %>)
-% }
+% if ($departure->{departure} and $departure->{sched_departure} and $departure->{departure} ne $departure->{sched_departure}) {
+ (heute <%= $departure->{departure} %>)
% }
-% elsif ($departure->{arrival}) {
-% if ($departure->{arrival} ne $departure->{sched_arrival}) {
- (heute <%= $departure->{arrival} %>)
-% }
+% elsif ($departure->{arrival} and $departure->{sched_arrival} and $departure->{arrival} ne $departure->{sched_arrival}) {
+ (heute <%= $departure->{arrival} %>)
% }
% if ($departure->{missing_realtime} or $departure->{no_realtime_yet}) {
<i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i>
% }
<strong><%= stash('station_name') %></strong>
+% if (my $u = $departure->{utilization}) {
+% my ($text, $icon1, $icon2) = utilization_icon($u);
+ <i class="material-icons" aria-hidden="true"><%= $icon1 %></i>
+ <i class="material-icons" aria-hidden="true"><%= $icon2 %></i>
+% }
</li>
% }
% for my $stop (@{$departure->{route_post_diff}}) {
<li class="<%= $stop->{isPast} ? 'past-stop' : 'future-stop' %>">
- <a href="<%= url_for('station', station => $stop->{name})->query({detailed => param('detailed'), past => param('past')}) %>#<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>" class="
+ <a href="<%= url_for('station', station => $stop->{eva} // $stop->{name})->query({detailed => param('detailed'), past => param('past'), rt => param('rt'), hafas => param('hafas')}) %>#<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>" class="
% if ($stop->{isAdditional}) {
additional-stop
% }
@@ -253,84 +297,49 @@
% else {
generic-stop
% }
-% if ($stop->{rt_arr}) {
- "><%= $stop->{sched_arr}->strftime('%H:%M') %> (heute <%= $stop->{rt_arr}->strftime('%H:%M') %>) <%= $stop->{name} %></a>
+% if (($stop->{rt_arr} and $stop->{arr_delay}) or (not $stop->{rt_arr} and $stop->{rt_dep} and $stop->{dep_delay})) {
+ "><%= ($stop->{sched_arr} // $stop->{sched_dep})->strftime('%H:%M') %> (heute <%= ($stop->{rt_arr} // $stop->{rt_dep})->strftime('%H:%M') %>)
% }
% else {
- "><%= $stop->{sched_arr} ? $stop->{sched_arr}->strftime('%H:%M') : q{} %>
-% if ($stop->{rt_bogus}) {
- <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i>
-% }
- <%= $stop->{name} %></a>
+ "><%= ($stop->{sched_arr} // $stop->{sched_dep}) ? ($stop->{sched_arr} // $stop->{sched_dep})->strftime('%H:%M') : q{} %>
+% if ($stop->{rt_bogus}) {
+ <i class="material-icons" aria-label="Echtzeitdaten fehlen">gps_off</i>
+% }
+% }
+ <%= $stop->{name} %></a>
+% if ($stop->{load}{FIRST} or $stop->{load}{SECOND}) {
+% my ($text, $icon1, $icon2) = utilization_icon([$stop->{load}{FIRST}, $stop->{load}{SECOND}]);
+ <i class="material-icons" aria-hidden="true"><%= $icon1 %></i>
+ <i class="material-icons" aria-hidden="true"><%= $icon2 %></i>
% }
</li>
% }
</ul> <!-- mroute -->
% }
-% if ($departure->{has_cycle}) {
- <div class="db-attr"><a href="https://lib.finalrewind.org/dbdb/db_umlauf/<%= $departure->{train_no} %>.svg">Umlaufplan</a>
- (ggf. fehlerhaft)</div>
+% if ($departure->{operator}) {
+ <div class="details">Betrieb: <%= $departure->{operator} %></div>
% }
-% if ($details->{commonAttr}) {
-% if ($details->{attrVariants} and (not $details->{commonAttr}{vmax} or not $details->{commonAttr}{brakingPercentage})) {
- <div class="db-attr">
- Attribute:
- <ul>
-% for my $attr (@{$details->{attrVariants} // [] }) {
- <li><%= include '_train_attr', attr => $attr, with_station => 1 %></li>
-% }
- </ul>
- </div>
-% }
-% else {
- <div class="db-attr">
-%= include '_train_attr', attr => $details->{commonAttr}, with_station => 0
- </div>
-% }
-% }
-% if ($details and not $departure->{arrival}) {
-% if (my $s = $details->{route}{preStart}) {
- Zug wird voraussichtlich aus <%= $s %> eingesetzt.<br/><br/>
-% }
-% if (@{$departure->{cycle_from} // []}) {
- Bildung möglicherweise aus
+% if ($departure->{details} and @{$departure->{details}}) {
+ <div class="details">Details:
<ul>
-% for my $t (@{$departure->{cycle_from}}) {
-% my ($train_no, $train) = @{$t};
-% my $tt = $train->{type} // $train->{rawType} // 'Zug';
-% $tt =~ s{ .*|[0-9]}{};
- <li><%= $tt %> <%= $train_no %>
-% if ($train->{route}{start} and $train->{route}{end}) {
- <%= $train->{route}{start} %> → <%= $train->{route}{end} %>
-% }
- </li>
+% for my $pair (@{$departure->{details}}) {
+ <li>
+% if ($pair->[1]{icon}) {
+ <i class="material-icons"><%= $pair->[1]{icon} %></i>
% }
- </ul>
-% }
-% }
-% elsif ($details and not $departure->{departure}) {
-% if (my $e = $details->{route}{postEnd}) {
- Zug wird voraussichtlich in <%= $e %> abgestellt.<br/><br/>
-% }
-% if (@{$departure->{cycle_to} // []}) {
- Weiterfahrt möglicherweise als
- <ul>
-% for my $t (@{$departure->{cycle_to}}) {
-% my ($train_no, $train) = @{$t};
-% my $tt = $train->{type} // $train->{rawType} // 'Zug';
-% $tt =~ s{ .*|[0-9]}{};
- <li><%= $tt %> <%= $train_no %>
-% if ($train->{route}{start} and $train->{route}{end}) {
- <%= $train->{route}{start} %> → <%= $train->{route}{end} %>
-% }
- </li>
+%= $pair->[0]
+% if (length($pair->[0]) > 25) {
+ <br/>
% }
+ <span class="reason">
+%= $pair->[1]{text}
+ </span>
+ </li>
+% }
+% if ($departure->{route_info}) {
+ <li><%= $departure->{route_info} %></li>
+% }
</ul>
-% }
-% }
-% if ($icetype and not param('detailed')) {
- <div class="verbose">
- <a href="<%= url_for->query(detailed => 1) %>">Mehr Details</a>
</div>
% }
</div> <!-- mfooter -->
diff --git a/templates/about.html.ep b/templates/about.html.ep
index ae88a8d..f299389 100644
--- a/templates/about.html.ep
+++ b/templates/about.html.ep
@@ -1,13 +1,10 @@
<div class="container">
<p>
- DBF ist ein inoffizieller Abfahrtsmonitor für innerdeutsche Zugfahrten mit
- dem Ziel, Daten aus verschiedenen Quellen übersichtlich zusammenzutragen.
- Der <a
- href="<%= app->config->{'source_url'} %>">Quelltext</a>
- steht unter der <a
- href="https://git.finalrewind.org/db-fakedisplay/tree/COPYING">GNU AGPL
- v3</a> als Open Source zur Verfügung. © 2021 <a
- href="https://finalrewind.org/me">Daniel Friesel</a> / <a href="https://twitter.com/derfnull">@derfnull</a>.
+ DBF ist ein inoffizieller Abfahrtsmonitor für den Regional- und Fernverkehr mit dem Ziel, Daten aus verschiedenen Quellen übersichtlich zusammenzutragen.
+ Der Fokus liegt auf Zügen im Netz der Deutschen Bahn; eingeschränkte Unterstützung für Nahverkehr und Züge in anderen Netzen lässt sich optional zuschalten.
+ </p>
+ <p>
+ Der <a href="<%= app->config->{'source_url'} %>">Quelltext</a> steht unter der <a href="https://git.finalrewind.org/db-fakedisplay/tree/COPYING">GNU AGPL v3</a> als Open Source zur Verfügung. © 2011 – 2023 <a href="https://finalrewind.org">derf</a>.
% if (my $issue_url = app->config->{'issue_url'}) {
Fehlermeldungen bitte via
<a href="<%= $issue_url %>">Issue Tracker</a>.
@@ -23,21 +20,18 @@
Diese Installation verwendet die DBF-Version
<b><%= stash('version') // '???' %></b> und greift auf die folgenden Backends
zu:<br/>
- • Abfahrtstafel: DB IRIS via <a href="https://finalrewind.org/projects/Travel-Status-DE-IRIS/">Travel::Status::DE::IRIS</a>
+ • Regional- und Fernverkehr: DB IRIS via <a href="https://finalrewind.org/projects/Travel-Status-DE-IRIS/">Travel::Status::DE::IRIS</a>
v<%= $Travel::Status::DE::IRIS::VERSION %><br/>
- • Meldungen und Ankunft/Abfahrt an Unterwegshalten: DB HAFAS via <a href="https://git.finalrewind.org/db-fakedisplay/tree/lib/DBInfoscreen/Helper/HAFAS.pm">Helper/HAFAS.pm</a><br/>
+ • Nahverkehr und Zugdetails: DB HAFAS via <a href="https://finalrewind.org/projects/Travel-Status-DE-DeutscheBahn/">Travel::Status::DE::HAFAS</a>
+ % if ($Travel::Status::DE::HAFAS::VERSION) {
+ v<%= $Travel::Status::DE::HAFAS::VERSION %>
+ % }
+ <br/>
• Wagenreihung: <a href="https://finalrewind.org/projects/Travel-Status-DE-DBWagenreihung/">Travel::Status::DE::DBWagenreihung</a>
% if ($Travel::Status::DE::DBWagenreihung::VERSION) {
v<%= $Travel::Status::DE::DBWagenreihung::VERSION %>
% }
<br/>
- % if (app->config->{hafas_rest_api} =~ m{v5.db.transport.rest}) {
- • Karte: DB HAFAS via <a href="https://v5.db.transport.rest/">v5.db.transport.rest</a><br/>
- % }
- % else {
- • Karte: DB HAFAS via <a href="https://github.com/public-transport/hafas-rest-api">hafas-rest-api</a><br/>
- % }
- • Zugauslastung Fernverkehr: DB HAFAS via <a href="https://docs.marudor.de/">marudor.de</a><br/>
• Zugauslastung Regionalverkehr: VRR EFA via <a href="https://github.com/derf/eva-to-efa-gw">eva-to-efa-gw</a><br/>
<br/>
Sie nutzt zusätzlich die folgenden Open Data-Ressourcen:<br/>
@@ -47,13 +41,8 @@
© DB Station&amp;Service AG,
Europaplatz 1,
10557 Berlin, lizensiert unter CC-BY 4.0<br/>
- </p>
-</div>
-
-<div class="container">
- <p>
- <a href="https://finalrewind.org/me/">Kontakt</a>
- ·
+ • <a href="https://data.deutschebahn.com/dataset/fahrzeuglexikon">Fahrzeuglexikon</a>
+ © DB Fernverkehr AG, lizensiert unter CC-BY 4.0; Abbildungen © Seemanngrafik d.i.p. im Auftrag der Deutschen Bahn AG, lizensiert unter CC-BY-SA 4.0<br/>
</p>
</div>
diff --git a/templates/app.html.ep b/templates/app.html.ep
index 6baf0f4..50f8a5a 100644
--- a/templates/app.html.ep
+++ b/templates/app.html.ep
@@ -30,6 +30,9 @@
% $route_str .= $stop . ($via_cur < $via_max ? ' - ' : q{});
% }
<li
+% if (param('hafas')) {
+ data-jid="<%= $departure->{journey_id} =~ s{#}{%23}gr %>"
+% }
data-train="<%= ($departure->{train_type} // q{}) %> <%= ($departure->{train_no} // $departure->{train} // q{}) %>"
data-line="<%= $departure->{train_type} %> <%= $departure->{train_line} // $departure->{train_no} %>"
data-no="<%= $departure->{train_line} ? $departure->{train_no} : q{} %>"
@@ -40,7 +43,7 @@
data-platform="<%= $departure->{scheduled_platform} // $departure->{platform} // '' %>"
data-arrival="<%= $departure->{sched_arrival} // '' %>"
data-departure="<%= $departure->{sched_departure} // '' %>"
- data-moreinfo="<%= join(q{|}, map { ($_->[0]->isa('DateTime') ? $_->[0]->strftime('%H:%M') : $_->[0]) . ' ' . $_->[1] } @{ $departure->{moreinfo} // [] } ) %>"
+ data-moreinfo="<%= join(q{|}, map { ($_->[0]->isa('DateTime') ? $_->[0]->strftime('%H:%M') . ' ' . $_->[1] : $_->[0] . ' ' . $_->[1]{text}) } @{ $departure->{moreinfo} // [] } ) %>"
data-routeprev="<%= join(q{|}, @{ $departure->{route_pre} // [] } ) %>"
data-routenext="<%= join(q{|}, @{ $departure->{route_post} // [] } ) %>"
% if ($departure->{is_cancelled} or $departure->{departure_is_cancelled}) {
@@ -49,7 +52,12 @@
% else {
>
% }
- <a href="/z/<%= Mojo::Util::url_escape(($departure->{train_type} // q{}) . ' ' . ($departure->{train_no} // $departure->{train} // q{}) . '/' . ($departure->{station} // $station)) %>">
+% if (param('hafas')) {
+ <a href="/z/<%= Mojo::Util::url_escape($departure->{journey_id}) . '?hafas=1&highlight=' . Mojo::Util::url_escape($departure->{station} // $station) %>">
+% }
+% else {
+ <a href="/z/<%= Mojo::Util::url_escape(($departure->{train_type} // q{}) . ' ' . ($departure->{train_no} // $departure->{train} // q{})) . '/' . Mojo::Util::url_escape($departure->{station} // $station) %>">
+% }
<div class="anchor" id="<%= ($departure->{train_type} // q{x}) . ($departure->{train_no} // q{x}) %>"></div>
<div class="line <%= $departure->{linetype} %>">
% if ($departure->{train_type} and $departure->{train_no}) {
@@ -59,9 +67,6 @@
%= $departure->{train_line}
% }
% elsif ($departure->{train_no}) {
-% if (param('detailed') and $departure->{linetype} eq 'fern' and exists $ice_type->{$departure->{train_no}} and $ice_type->{$departure->{train_no}}[1]) {
- <span class="trainsubtype" aria-hidden="true"><%= $ice_type->{$departure->{train_no}}[1] %></span>
-% }
<span class="trainno"><%= $departure->{train_no} %></span>
% }
% else {
@@ -100,18 +105,18 @@
% if ($departure->{delay} and not $departure->{is_cancelled}) {
% if ($show_realtime) {
% if ($departure->{delay} > ($hide_low_delay ? 4 : 0)) {
- <span class="delaynorm" aria-hidden="true">(+<%= $departure->{delay} %>)</span>
+ <span class="delaynorm" aria-hidden="true">+<%= $departure->{delay} %> ⇒</span>
% }
% elsif ($departure->{delay} < 0) {
- <span class="undelaynorm" aria-hidden="true">(<%= $departure->{delay} %>)</span>
+ <span class="undelaynorm" aria-hidden="true"><%= $departure->{delay} %> ⇒</span>
% }
% }
% else {
% if ($departure->{delay} > ($hide_low_delay ? 4 : 0)) {
- <span class="delay" aria-hidden="true">(+<%= $departure->{delay} %>)</span>
+ <span class="delay" aria-hidden="true">+<%= $departure->{delay} %></span>
% }
% elsif ($departure->{delay} < 0) {
- <span class="undelay" aria-hidden="true">(<%= $departure->{delay} %>)</span>
+ <span class="undelay" aria-hidden="true"><%= $departure->{delay} %></span>
% }
% }
% }
diff --git a/templates/exception.html.ep b/templates/exception.html.ep
index 2f20bc6..65ec7ff 100644
--- a/templates/exception.html.ep
+++ b/templates/exception.html.ep
@@ -4,9 +4,14 @@ Beim Bearbeiten der Anfrage ist ein Fehler aufgetreten.<br/>
<pre>
----------[Debug start]----------
+% if ($exception) {
%= $exception->message
Stash:
%= dumper $snapshot
+% }
+% else {
+%= stash('message')
+% }
----------[Debug end]----------
</pre>
</div>
diff --git a/templates/geotrain.html.ep b/templates/geotrain.html.ep
deleted file mode 100644
index 0193167..0000000
--- a/templates/geotrain.html.ep
+++ /dev/null
@@ -1,5 +0,0 @@
-<div class="geolocation">
-<div class="candidateheader"><a href="https://finalrewind.org/interblag/entry/dbf-zuglokalisierung/">Experimentelles Beta-Feature</a><br/><br/>Züge auf der Strecke:</div>
-<div class="candidatestatus">Bitte warten…</div>
-<div class="candidatelist"></div>
-</div> <!-- geolocation -->
diff --git a/templates/landingpage.html.ep b/templates/landingpage.html.ep
index ae72867..82128ca 100644
--- a/templates/landingpage.html.ep
+++ b/templates/landingpage.html.ep
@@ -1,20 +1,28 @@
% if (stash 'show_intro') {
<div class="container">
-<p>
- DBF ist ein inoffizieller Abfahrtsmonitor für innerdeutsche Zugfahrten mit
- dem Ziel, Daten aus verschiedenen Quellen übersichtlich zusammenzutragen.
-</p>
-<p>
- Diese Seite ist ein kostenfreies, privat betriebenes Projekt ohne
- Verfügbarkeitsgarantie. Alle Angaben ohne Gewähr.
-</p>
+% if (0) {
+ <p>
+ DBF is an unofficial departure monitor for regional and long-distance trains within Germany, aiming to combine multiple data sources in a useful manner.
+ It also has limited support for local transit and traffic outside of Germany.
+ </p>
+ <p>
+ This site is operated by a private entity in a not-for-profit manner.
+ There are no uptime or reliability guarantees whatsoever.
+ </p>
+% }
+% else {
+ <p>
+ DBF ist ein inoffizieller Abfahrtsmonitor für den Regional- und Fernverkehr mit dem Ziel, Daten aus verschiedenen Quellen übersichtlich zusammenzutragen.
+ Der Fokus liegt auf Zügen im Netz der Deutschen Bahn; eingeschränkte Unterstützung für Nahverkehr und Züge in anderen Netzen lässt sich optional zuschalten.
+ </p>
+ <p>
+ Diese Seite ist ein kostenfreies, privat betriebenes Projekt ohne Verfügbarkeitsgarantie.
+ Alle Angaben ohne Gewähr.
+ </p>
+% }
<p class="geolink">
<a class="button" href="<%= url_for('_autostop')->to_abs->scheme('https') %>">Stationen in der Umgebung suchen</a>
</p>
-<p class="geolink">
-Oder
-<a href="<%= url_for('_autotrain')->to_abs->scheme('https') %>">Züge in der Umgebung suchen</a> (Beta-Feature)
-</p>
<p>
Oder hier angeben:
</p>
diff --git a/templates/layouts/app.html.ep b/templates/layouts/app.html.ep
index fa13f75..3d3bf7b 100644
--- a/templates/layouts/app.html.ep
+++ b/templates/layouts/app.html.ep
@@ -5,7 +5,7 @@
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content="Abfahrtsmonitor, Bahnhofstafel, Abfahrten, Abfahrtstafel, ICE, IC, RE, RB, S-Bahn">
- <meta name="description" content="Inoffizieller Abfahrtsmonitor für innerdeutsche Zugfahrten">
+ <meta name="description" content="<%= stash('description') // 'Inoffizieller Abfahrtsmonitor für innerdeutsche Zugfahrten' %>">
<meta name="theme-color" content="#00838f">
<link rel="icon" type="image/png" href="/static/icons/icon-16x16.png" sizes="16x16">
<link rel="icon" type="image/png" href="/static/icons/icon-32x32.png" sizes="32x32">
@@ -18,7 +18,7 @@
<meta http-equiv="refresh" content="<%= $self->stash('refresh_interval') %>"/>
% }
- % my $av = 'v57'; # asset version
+ % my $av = 'v90'; # asset version
% if (session('theme') and session('theme') eq 'dark' or param('dark')) {
%= stylesheet "/static/${av}/css/dark.min.css", id => 'theme'
% }
@@ -27,14 +27,14 @@
% }
<script>
function addStyleSheet(name, id) {
- var path = '/static/<%=$av%>/css/' + name + '.min.css';
- var old = document.getElementById(id);
+ const path = '/static/<%=$av%>/css/' + name + '.min.css';
+ const old = document.getElementById(id);
if (old && (old.href != path)) {
old.href = path;
- document.cookie = 'theme=' + name;
+ document.cookie = 'theme=' + name + ';SameSite=None;Secure';
}
}
- var otherTheme = {
+ const otherTheme = {
'dark': 'light',
'light': 'dark',
};
@@ -43,24 +43,18 @@
currentTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
}
addStyleSheet(currentTheme, 'theme');
-
- function toggleTheme() {
- currentTheme = otherTheme[currentTheme] || 'light';
- localStorage.setItem('theme', currentTheme);
- addStyleSheet(currentTheme, 'theme');
- }
</script>
%= stylesheet "/static/${av}/css/material-icons.css"
%= stylesheet "/static/${av}/css/jquery-ui.min.css"
%= javascript '/static/js/jquery-3.4.1.min.js', defer => undef
%= javascript "/static/${av}/js/jquery-ui.min.js", defer => undef
%= javascript "/static/${av}/js/dbf.min.js", defer => undef
+ % if (not stash('hide_opts')) {
+ %= javascript "/dyn/${av}/autocomplete.js", defer => undef
+ % }
% if (stash('with_geostop')) {
%= javascript "/static/${av}/js/geostop.min.js", defer => undef
% }
- % if (stash('with_geotrain')) {
- %= javascript "/static/${av}/js/geotrain.min.js", defer => undef
- % }
% if (stash('with_map')) {
%= stylesheet "/static/${av}/leaflet/leaflet.css"
%= javascript "/static/${av}/leaflet/leaflet.js"
@@ -83,16 +77,17 @@
</span>
% }
<ul id="nav-mobile" style="float: right;">
- <li class="waves-effect waves-light">
- <a onClick="javascript:toggleTheme()"><span class="visually-hidden">Farbschema invertieren</span><i class="material-icons" aria-hidden="true">invert_colors</i></a>
- </li>
+ % if (stash('api_link')) {
+ <li class="waves-effect waves-light">
+ <a href="<%= stash('api_link') %>"><span class="visually-hidden"><%= stash('api_text') %></span><i class="material-icons" aria-hidden="true"><%= stash('api_icon') %></i></a>
+ </li>
+ % }
% if (stash('hide_opts')) {
<li><a href="/"><span class="visually-hidden">Hauptseite</span><i class="material-icons" aria-hidden="true">edit</i></a></li>
% }
% else {
<li><a href="#stationinput"><span class="visually-hidden">Menü</span><i class="material-icons" aria-hidden="true">edit</i></a></li>
% }
- <li><a href="/_autostop"><span class="visually-hidden">Stationen in der Umgebung suchen</span><i class="material-icons" aria-hidden="true">my_location</i></a></li>
</ul>
</div>
</nav>
@@ -122,6 +117,7 @@ Bitte eine Station aus der Liste auswählen</div>
%= form_for _redirect => begin
+%= hidden_field hafas => param('hafas')
<div>
<div class="field">
<div class="desc">Zug / Station</div>
@@ -130,22 +126,27 @@ Bitte eine Station aus der Liste auswählen</div>
%= select_field input => stash('stationlist')
% }
% elsif (stash('input')) {
- %= text_field 'input', class => 'station', placeholder => 'Zug, Stationsname oder DS100-Kürzel', id => 'stationinput'
+ %= text_field 'input', class => 'station', placeholder => 'Zug, Stationsname oder Ril100-Kürzel', id => 'stationinput'
% }
% else {
- %= text_field 'input', class => 'station', placeholder => 'Zug, Stationsname oder DS100-Kürzel', id => 'stationinput', autofocus => 'autofocus'
+ %= text_field 'input', class => 'station', placeholder => 'Zug, Stationsname oder Ril100-Kürzel', id => 'stationinput', autofocus => 'autofocus'
% }
</div>
</div>
<div class="field">
- %= submit_button 'Abfahrtsmonitor'
+ %= submit_button 'Abfahrtstafel'
</div>
+ % if (stash('input')) {
+ <div class="geolink">
+ <a class="button" href="<%= url_for('_autostop')->to_abs->scheme('https') %>">Stationen in der Umgebung suchen</a>
+ </div>
+ % }
<div class="break"></div>
<div class="moresettings-header moresettings-header-collapsed button button-light">Weitere Einstellungen</div>
<div class="moresettings moresettings-collapsed">
<div class="field">
<div class="desc">
- %= check_box 'show_realtime' => 1, id => 'id_show_realtime'
+ %= check_box 'rt' => 1, id => 'id_show_realtime'
<label for="id_show_realtime">
Zeiten inkl. Verspätung angeben
</label>
@@ -163,7 +164,7 @@ Bitte eine Station aus der Liste auswählen</div>
<div class="desc">
%= check_box 'detailed' => 1, id => 'id_detailed'
<label for="id_detailed">
- Mehr Details (u.a. Zugnummern und Zugbildungsplan)
+ Mehr Details
</label>
</div>
</div>
@@ -171,7 +172,7 @@ Bitte eine Station aus der Liste auswählen</div>
<div class="desc">
%= check_box 'no_related' => 1, id => 'id_no_related'
<label for="id_no_related">
- Betriebliche Bahnhofstrennungen berücksichtigen (z.B. "Hbf (Fern+Regio)" vs. "Hbf (S)")
+ Betriebliche Bahnhofstrennungen berücksichtigen (z.B. "Hbf (Fern+Regio)" vs. "Hbf (S)")
</label>
</div>
</div>
@@ -179,7 +180,7 @@ Bitte eine Station aus der Liste auswählen</div>
<div class="desc">
%= check_box 'past' => 1, id => 'past'
<label for="past">
- Bereits abgefahrene Züge anzeigen
+ Bereits abgefahrene Züge anzeigen
</label>
</div>
</div>
@@ -187,7 +188,7 @@ Bitte eine Station aus der Liste auswählen</div>
<div class="desc">
%= check_box 'hide_opts' => 1, id => 'id_hide_opts'
<label for="id_hide_opts">
- Formular verstecken (für Infoscreens)
+ Formular verstecken
</label>
</div>
</div>
@@ -233,32 +234,65 @@ Bitte eine Station aus der Liste auswählen</div>
</div> <!-- input-field -->
<div class="notes">
- <div class="developers-header developers-header-collapsed button button-light">API- und Entwickler-Hinweise</div>
+ <div class="developers-header developers-header-collapsed button button-light">API</div>
<div class="developers developers-collapsed">
<ul>
- <li>DBF-Abfahrtstafeln können gerne als iframe eingebunden oder in
- fest installierten Vollbild-Browserfenstern verwendet werden.
- Für eine kleine Ansicht (z.B. iframe in einer normalen Website)
- empfiehlt sich das "App"-Frontend. Für eine große Ansicht
- (z.B. als alleinstehender Infoscreen) gibt es den "Infoscreen"-Modus.</li>
- <li>Die Parameter <span style="font-family: monospace;">mode=json&amp;version=3</span>
- (alternativ <span style="font-family:
- monospace;">https://dbf.finalrewind.org/Bahnhofsname.json?version=3</span>)
- bieten ein JSON-IRIS-Interface. Die route-Elemente können zusätzlich
- die Felder "isAdditional" oder "isCancelled" enthalten, der Rest sollte
- selbsterklärend sein. Im Fehlerfall fehlt das "departures"-Element,
- stattdessen wird ein "error"-Element mit Fehlermeldung zurückgegeben.
- Bitte maximal 30 Anfragen pro Minute und insbesondere nur eine Anfrage
- pro Station und Minute – eine höhere Auflösung haben die Backenddaten
- ohnehin nicht.</li>
- <li>Ein JSON-Interface für Zugdetails ist in Arbeit.</li>
- <li>Mit <span style="font-family: monospace;">limit</span> kann die Anzahl der
- angezeigten / im JSON enthaltenen Abfahrten eingeschränkt werden, z.B.
- <span style="font-family: monospace;">limit=10</span> für die ersten zehn.</li>
- <li>Dieser Dienst ist Open Source-Software und kann leicht auf eigenen Servern
- <a href="https://github.com/derf/db-fakedisplay/blob/master/README.md">installiert</a>
- werden. Automatisierte Crawler, die mehrere Dutzend Stationen pro Minute
- abfragen, bitte nur auf eigenen Instanzen betreiben.</li>
+ % if (0) {
+ <li>You're welcome to embed DBF departure boards as iframes or use them
+ in full-screen browser setups. The App frontend works best for
+ small screens, whereas the legacy Infoscreen mode is better suited
+ for large displays.</li>
+ <li>The departure board supports names, EVA IDs, and (in IRIS mode)
+ DS100/Ril100 codes as station identifiers.</li>
+ <li>Requests for train details can optionally be suffixed with the
+ DD.MM.[YYYY] date of the requested trip, e.g. "ICE 921 (1.1.)" or
+ "ICE 921 @ 1.1.". The date refers to the scheduled departure at the
+ train's origin station.</li>
+ <li>A JSON IRIS API is avaliable via
+ <span style="font-family: monospace;">mode=json&amp;version=3</span>
+ (or just <span style="font-family: monospace;">https://dbf.finalrewind.org/Station.json?version=3</span>).
+ Route elements may contain "isAdditional" and "isCancelled"; the rest
+ should be self-explanatory. Please do not send more than 30 requests
+ per minute and only one request per station per minute.</li>
+ <li>There is no JSON API for train details yet.</li>
+ <li>The optional <span style="font-family: monospace;">limit</span>
+ parameter limits the number of returnd departures; e.g.
+ <span style="font-family: monospace;">limit=10</span> will result in no more than ten.</li>
+ <li>DBF is available as Open Source software
+ (<a href="https://github.com/derf/db-fakedisplay/blob/master/README.md">installation instructions</a>).
+ Please use your own installation for automated crawlers that request dozens of stations per minute.</li>
+ % }
+ % else {
+ <li>DBF-Abfahrtstafeln können gerne als iframe eingebunden oder in
+ fest installierten Vollbild-Browserfenstern verwendet werden.
+ Für eine kleine Ansicht (z.B. iframe in einer normalen Website)
+ empfiehlt sich das "App"-Frontend. Für eine große Ansicht
+ (z.B. als alleinstehender Infoscreen) gibt es den "Infoscreen"-Modus.</li>
+ <li>Die Abfahrtstafel unterstützt Namen, EVA-IDs, und (im IRIS-Backend)
+ DS100/Ril100-Codes zur Identifikation von Stationen.</li>
+ <li>Zugdetails können optional für spezifische Abfahrtsdaten im
+ DD.MM.[YYYY]-Format abgefragt werden, z.B. "ICE 921 (1.1.)" oder
+ "ICE 921 @ 1.1.". Das Datum bezieht sich auf die geplante
+ Abfahrtszeit am Startbahnhof der Zugfahrt.</li>
+ <li>Die Parameter <span style="font-family: monospace;">mode=json&amp;version=3</span>
+ (alternativ <span style="font-family:
+ monospace;">https://dbf.finalrewind.org/Bahnhofsname.json?version=3</span>)
+ bieten ein JSON-IRIS-Interface. Die route-Elemente können zusätzlich
+ die Felder "isAdditional" oder "isCancelled" enthalten, der Rest sollte
+ selbsterklärend sein. Im Fehlerfall fehlt das "departures"-Element,
+ stattdessen wird ein "error"-Element mit Fehlermeldung zurückgegeben.
+ Bitte maximal 30 Anfragen pro Minute und insbesondere nur eine Anfrage
+ pro Station und Minute – eine höhere Auflösung haben die Backenddaten
+ ohnehin nicht.</li>
+ <li>Ein JSON-Interface für Zugdetails ist in Arbeit.</li>
+ <li>Mit <span style="font-family: monospace;">limit</span> kann die Anzahl der
+ angezeigten / im JSON enthaltenen Abfahrten eingeschränkt werden, z.B.
+ <span style="font-family: monospace;">limit=10</span> für die ersten zehn.</li>
+ <li>Dieser Dienst ist Open Source-Software und kann leicht auf eigenen Servern
+ <a href="https://github.com/derf/db-fakedisplay/blob/master/README.md">installiert</a>
+ werden. Automatisierte Crawler, die mehrere Dutzend Stationen pro Minute
+ abfragen, bitte nur auf eigenen Instanzen betreiben.</li>
+ % }
</ul>
</div> <!-- developers -->
</div> <!-- notes -->
@@ -266,13 +300,28 @@ Bitte eine Station aus der Liste auswählen</div>
</div> <!-- container -->
<div class="container">
+<div class="config">
+Farbschema:
+<a onClick="javascript:setTheme('light')">light</a>
+<a onClick="javascript:setTheme('dark')">dunkel</a>
+<a onClick="javascript:setTheme('default')">automatisch</a>
+<!--Language:
+<br/>
+<a onClick="javascript:setLang('de')">DE</a>
+<a onClick="javascript:setLang('en')">EN</a>
+<a onClick="javascript:setLang('default')">system language</a>
+-->
+</div>
<div class="about">
-<a href="_about">Über DBF</a>
+<a href="_about">DBF</a> v<%= stash('version') // '???' %>
·
<a href="_datenschutz" rel="nofollow">Datenschutz</a>
·
-<a href="_impressum" rel="nofollow">Impressum</a><br/>
-Version <%= stash('version') // '???' %>
+<a href="_impressum" rel="nofollow">Impressum</a>
</div> <!-- about -->
</div> <!-- container -->
% }
diff --git a/templates/layouts/legacy.html.ep b/templates/layouts/legacy.html.ep
index 6088009..9ad1fbb 100644
--- a/templates/layouts/legacy.html.ep
+++ b/templates/layouts/legacy.html.ep
@@ -17,7 +17,7 @@
<meta http-equiv="refresh" content="<%= $self->stash('refresh_interval') %>"/>
% }
- % my $av = 'v57'; # asset version
+ % my $av = 'v90'; # asset version
%= stylesheet "/static/${av}/css/default.css"
%= stylesheet "/static/${av}/css/material-icons.css"
%= stylesheet "/static/${av}/css/jquery-ui.min.css"
@@ -29,6 +29,9 @@
%= javascript '/static/js/jquery-3.4.1.min.js'
%= javascript "/static/${av}/js/jquery-ui.min.js"
%= javascript "/static/${av}/js/dbf.min.js"
+ % if (not stash('hide_opts')) {
+ %= javascript "/dyn/${av}/autocomplete.js", defer => undef
+ % }
%= javascript "/static/${av}/js/marquee.min.js"
%= javascript begin
$(function () { $('marquee').marquee() });
@@ -73,10 +76,10 @@ Bitte eine Station aus der Liste auswählen</div>
%= select_field input => stash('stationlist')
% }
% elsif (stash('input')) {
- %= text_field 'input', class => 'station', placeholder => 'Name oder DS100-Kürzel'
+ %= text_field 'input', class => 'station', placeholder => 'Name oder Ril100-Kürzel'
% }
% else {
- %= text_field 'input', class => 'station', placeholder => 'Name oder DS100-Kürzel', autofocus => 'autofocus'
+ %= text_field 'input', class => 'station', placeholder => 'Name oder Ril100-Kürzel', autofocus => 'autofocus'
% }
</div>
</div>
@@ -158,7 +161,7 @@ Bitte eine Station aus der Liste auswählen</div>
</div>
<div class="field">
<div class="desc">
- %= check_box 'show_realtime' => 1, id => 'id_show_realtime'
+ %= check_box 'rt' => 1, id => 'id_show_realtime'
<label for="id_show_realtime">
Echtzeitangaben statt Fahrplandaten anzeigen
</label>
diff --git a/templates/route_map.html.ep b/templates/route_map.html.ep
index 2f35b54..447960a 100644
--- a/templates/route_map.html.ep
+++ b/templates/route_map.html.ep
@@ -1,9 +1,6 @@
% if (stash('origin') and stash('destination')) {
%= include '_map_infobox'
% }
-% elsif (stash('intersection')) {
- %= include '_intersection_infobox'
-% }
<div class="container">
<div id="map" style="height: 500px;">
diff --git a/templates/trainsearch.html.ep b/templates/trainsearch.html.ep
deleted file mode 100644
index 5d6d3f9..0000000
--- a/templates/trainsearch.html.ep
+++ /dev/null
@@ -1,29 +0,0 @@
-<div class="container">
- <div class="input-field">
- %= form_for _trainsearch => begin
- <div>
- <div class="field">
- <div class="desc">Zug</div>
- <div>
- %= text_field 'train1', placeholder => 'RE 1234', id => 'train1_input', autofocus => 'autofocus'
- </div>
- </div>
- <div class="field">
- %= submit_button 'Strecke zeigen'
- </div>
- <div class="break"></div>
- <div class="field">
- <div class="desc">
- Zweiter Zug (optional)
- </div>
- <div>
- %= text_field 'train2', placeholder => 'S 5678', id => 'train2_input'
- </div>
- </div>
- <div class="field">
- %= submit_button 'Begegnungen suchen (beta)'
- </div>
- </div>
- % end
- </div>
-</div>